数据结构-顺序表基本操作的实现(含全部代码)

article/2025/9/14 23:37:01

今天起开始编写数据结构中的各种数据结构及其算法的实现。

主要依据严蔚敏版数据结构教材以及王道数据结构考研辅导书。

今天是线性表中的顺序表的实现,主要实现函数如下,读者有需要可以评论,我可以适当加几个。

  • CreateList(SqList &L,int n) 参数:顺序表L,顺序表长度n 功能:创建长度为的顺序表 时间复杂度:O(n)
  • InitList(SqList &L) 参数:顺序表L 功能:初始化 时间复杂度:O(1)
  • InsertList(SqList &L,int i,ElemType e) 参数:顺序表L,位置i,元素e 功能:位置i处插入元素e 时间复杂度:O(n)
  • ListDelete(SqList &L,int i) 参数:顺序表L,位置i 功能:删除位置i处元素 时间复杂度:O(n)
  • LocateElem(SqList L,ElemType e) 参数:顺序表L,元素e 功能:返回第一个等于e的元素的位置 时间复杂度:O(n)
  • Reverse(SqList &L) 参数:顺序表L 倒置函数 将原顺序表直接倒置
  • PrintList(SqList L) 参数:顺序表L 功能:遍历L,并输出
  • SplitSort(SqList &L) 参数:顺序表L 功能:分开奇偶,并分开排序
  • ClearList(SqList &L) 参数:顺序表L 功能:清空顺序表

代码如下:

/*
Project: sequence_list(数据结构-顺序表)
Date:    2018/09/12  20191012修改 添加Reverse  20200819修改 添加ClearList
Author:  Frank Yu
CreateList(SqList &L,int n) 参数:顺序表L,顺序表长度n 功能:创建长度为的顺序表 时间复杂度:O(n)
InitList(SqList &L) 参数:顺序表L 功能:初始化 时间复杂度:O(1)
InsertList(SqList &L,int i,ElemType e) 参数:顺序表L,位置i,元素e 功能:位置i处插入元素e 时间复杂度:O(n)
ListDelete(SqList &L,int i) 参数:顺序表L,位置i 功能:删除位置i处元素 时间复杂度:O(n)
LocateElem(SqList L,ElemType e) 参数:顺序表L,元素e 功能:返回第一个等于e的元素的位置 时间复杂度:O(n)
Reverse(SqList &L) 参数:顺序表L 倒置函数 将原顺序表直接倒置
PrintList(SqList L) 参数:顺序表L 功能:遍历L,并输出
SplitSort(SqList &L) 参数:顺序表L 功能:分开奇偶,并分开排序
ClearList(SqList &L) 参数:顺序表L 功能:清空顺序表
*/
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<iostream>
#define MaxSize 100
#define ElemType int
#define Status int
using namespace std;
//顺序表数据结构
typedef struct
{ElemType data[MaxSize];//顺序表元素int length;            //顺序表当前长度
}SqList;
//***************************基本操作函数*******************************//
//初始化顺序表函数,构造一个空的顺序表 
Status InitList(SqList &L)
{memset(L.data, 0, sizeof(L));//初始化数据为0L.length = 0;                //初始化长度为0return 0;
}
//创建顺序表函数 初始化前n个数据
bool CreateList(SqList &L, int n)
{if (n<0 || n>MaxSize)false;//n非法for (int i = 0; i<n; i++){scanf("%d", &L.data[i]);L.length++;}return true;
}
//插入函数 位置i插入数据 i及之后元素后移  1=<i<=length+1 
bool InsertList(SqList &L, int i, ElemType e)
{if (i<1 || i>L.length + 1) //判断位置是否有效{printf("位置无效!!!\n");return false;}if (L.length >= MaxSize)//判断存储空间是否已满{printf("当前存储空间已满!!!\n");return false;}for (int j = L.length; j >= i; j--)//位置i及之后元素后移{L.data[j] = L.data[j - 1];}L.data[i - 1] = e;L.length++;return true;
}
//删除函数 删除位置i的元素 i之后的元素依次前移
bool  ListDelete(SqList &L, int i)
{if (i<1 || i>L.length){printf("位置无效!!!\n");return false;}for (int j = i; j <= L.length - 1; j++)//位置i之后元素依次前移覆盖{L.data[j - 1] = L.data[j];}L.length--;return true;
}
//查找函数 按位置从小到大查找第一个值等于e的元素 并返回位置
int LocateElem(SqList L, ElemType e)
{for (int i = 0; i<L.length; i++)//从低位置查找{if (L.data[i] == e)return i + 1;}return 0;
}
//倒置函数 将原顺序表直接倒置
void Reverse(SqList &L)
{if (L.length)for (int i = 0; i<L.length - 1 - i; i++){int t = L.data[i];L.data[i] = L.data[L.length - 1 - i];L.data[L.length - 1 - i] = t;}
}
//奇偶分开并排序
void SplitSort(SqList &L)
{int Even = 0;int Odd = L.length - 1;int i = 0;int j = L.length - 1;bool flag = false; // 交换标志if (L.length)for (; i < j; i++, j--){while (L.data[i] % 2 != 0 && i<L.length - 1)i++;while (L.data[j] % 2 == 0 && j>0)j--;if (L.data[i] % 2 == 0 && L.data[j] % 2 != 0 && i<j){int temp = L.data[i];L.data[i] = L.data[j];L.data[j] = temp;flag = true;}if (!flag) //没有交换{if (i > j) { // 恰好奇偶分开Even = j;Odd = i;}else {Even = L.length - 1;//全奇数Odd = 0; //全偶数}}}if (flag)//有交换{for (int i = 0; i<L.length; i++)if (L.data[i] % 2 == 0){Odd = i;Even = i - 1;break;}}sort(L.data, L.data + Even + 1);sort(L.data + Odd, L.data + L.length);
}
//清空顺序表
void ClearList(SqList &L) {L.length = 0;
}
//********************************功能函数*****************************************//
//输出功能函数 按位置从小到大输出顺序表所有元素
void PrintList(SqList L)
{printf("当前顺序表所有元素:");for (int i = 0; i<L.length; i++){printf("%d ", L.data[i]);}printf("\n");
}
//创建顺序表函数
void Create(SqList &L)
{int n; bool flag;L.length = 0;printf("请输入要创建的顺序表长度(>1):");scanf("%d", &n);printf("请输入%d个数(空格隔开):", n);flag = CreateList(L, n);if (flag) {printf("创建成功!\n");PrintList(L);}else printf("输入长度非法!\n");}
//插入功能函数 调用InsertList完成顺序表元素插入 调用PrintList函数显示插入成功后的结果
void Insert(SqList &L)
{int place; ElemType e; bool flag;printf("请输入要插入的位置(从1开始)及元素:\n");scanf("%d%d", &place, &e);flag = InsertList(L, place, e);if (flag){printf("插入成功!!!\n");PrintList(L);}
}
//删除功能函数 调用ListDelete函数完成顺序表的删除 调用PrintList函数显示插入成功后的结果
void Delete(SqList &L)
{int place; bool flag;printf("请输入要删除的位置(从1开始):\n");scanf("%d", &place);flag = ListDelete(L, place);if (flag){printf("删除成功!!!\n");PrintList(L);}
}
//查找功能函数 调用LocateElem查找元素
void Search(SqList L)
{ElemType e; int flag;printf("请输入要查找的值:\n");scanf("%d", &e);flag = LocateElem(L, e);if (flag){printf("该元素位置为:%d\n", flag);}elseprintf("未找到该元素!\n");
}
//菜单
void menu()
{printf("********1.创建                        2.插入*********\n");printf("********3.删除                        4.查找*********\n");printf("********5.倒置                        6.分奇偶排序***\n");printf("********7.输出                        8.清空*********\n");printf("********9.退出                              *********\n");
}
int main()
{SqList L; int choice;InitList(L);while (1){menu();printf("请输入菜单序号:\n");scanf("%d", &choice);if (9 == choice) break;switch (choice){case 1:Create(L); break;case 2:Insert(L); break;case 3:Delete(L); break;case 4:Search(L); break;case 5:Reverse(L); break;case 6:SplitSort(L); break;case 7:PrintList(L); break;case 8:ClearList(L); break;default:printf("输入错误!!!\n");}}return 0;
}

结果截图:

插入结果截图
删除结果截图
查找结果截图
输出结果截图

---------------------------------------------2018-09-18更新 添加创建函数 菜单有改动-----------------------------------------

                                                                 

---------------------------------------------20191012更新 添加Reverse函数--------------------------------------------

根据下方评论,添加了倒置函数,参考stl的Reverse写法

template <class _RandomAccessIter>
_STLP_INLINE_LOOP void
__reverse(_RandomAccessIter __first, _RandomAccessIter __last, const random_access_iterator_tag &) {for (; __first < __last; ++__first)_STLP_STD::iter_swap(__first, --__last);
}
倒置展示

2019年10月23日更新,应评论区小伙伴的要求,添加了奇偶分开,并排序的函数

//奇偶分开并排序 前奇数 后偶数
void SplitSort(SqList &L)
{int Even = 0;int Odd = L.length - 1;int i = 0;int j = L.length - 1;bool flag = false; // 交换标志if (L.length)for (; i < j; i++, j--){while (L.data[i] % 2 != 0 && i<L.length - 1)i++;while (L.data[j] % 2 == 0 && j>0)j--;if (L.data[i] % 2 == 0 && L.data[j] % 2 != 0 && i<j){int temp = L.data[i];L.data[i] = L.data[j];L.data[j] = temp;flag = true;}if (!flag) //没有交换{if (i > j) { // 恰好奇偶分开Even = j;Odd = i;}else {Even = L.length - 1;//全奇数Odd = 0; //全偶数}}}if (flag)//有交换{for (int i = 0; i<L.length; i++)if (L.data[i] % 2 == 0){Odd = i;Even = i - 1;break;}}sort(L.data, L.data + Even + 1);sort(L.data + Odd, L.data + L.length);
}
测试全奇偶

有奇偶

代码已更新至上方全部代码!!!

------20211201修改-------

感谢@Cendrillon_提出的bug,上方代码已修改。之前未考虑到没有交换可能是恰好奇偶分开的情况。

------20211201修改-------

-------------------------20200819修改 添加ClearList-------------------------------------

代码由评论区用户__BlackHole提供,已更新至上方全部代码。

至于销毁,我是使用的静态分配,如果是new(delete释放)或malloc(free释放)的话,需要释放空间,其实就是堆和栈的区别。

堆和栈的区别就是申请方式不同:栈是系统自动分配空间,而堆则是程序员根据需要申请空间。由于栈上的空间是自动分配自动回收的,所以,栈内数据的生存周期只是在函数的运行过程中,运行后就释放掉。而堆上的数据只要程序员不释放空间,就一直可以访问到,缺点是一旦忘记释放会造成内存泄露。

综上,我写的顺序表不需要进行销毁,当然,顺序表最大长度也固定了,各有利弊,如果是动态分配的话记得释放空间呀!

关注博主公众号,回复 数据结构资源 获取数据结构(C语言版)、数据结构(第二版)课件、所有算法代码。

更多数据结构与算法的实现:数据结构(严蔚敏版)与算法的实现(含全部代码)

本人b站账号:lady_killer9

有问题请下方评论,转载请注明出处,并附有原文链接,谢谢!如有侵权,请及时联系。如果您感觉有所收获,自愿打赏,可选择支付宝18833895206(小于),您的支持是我不断更新的动力。


http://chatgpt.dhexx.cn/article/UGX07mAy.shtml

相关文章

PTA题目:顺序表基本操作

实现顺序表的基本操作&#xff0c;如初始化、插入、删除、输出等。 注意&#xff1a;顺序表中可有重复元素值。 要求&#xff1a;写出三个基本操作函数ListInsert&#xff0c;ListDelete&#xff0c;ListDeleteElem。 顺序表结构与操作函数接口定义&#xff1a; typedef char…

顺序表的操作,你真的学会了吗?

&#x1f30d;新人小白的博客 ⌛️希望大家多多关注 &#x1f383;以后会经常更新哒~&#x1f648; ⭐️个人主页&#xff1a; 收藏加关注&#xff0c;永远不迷路~ ⭐️ 顺序表的操作 前言一、目的二、步骤1.定义存储表示2. 定义操作函数3.采用菜单样式让操作更加方便清楚。4. …

数据结构——顺序表的基本操作

目录 1.顺序表的定义 2.define和typedef 3.以下所有用到函数的声明 4.建表&#xff0c;为表开放空间 5.建表&#xff0c;并且输入表内的值 6.在L中第i个位置之前查人新的数据元素e&#xff0c;L的长度加1 7.删除L的第i个数据元素&#xff0c;并用e返回其值&#xff0c;L的…

顺序表基本操作算法——基础代码(C语言)

创建一个顺序表&#xff08;数据元素个数为5&#xff09;&#xff0c; 输出顺序表中的所有数据元素 查找第3个位置上的元素 查找元素15是否在顺序表中&#xff0c;如果在&#xff0c;请输出该元素在顺序表中的位置 在顺序表中的第1个位置插入数据0 删除刚刚插入的元素 输出顺序…

顺序表的十个基本操作(全)

目录 一、初始化顺序表 二、插入 三、删除 3.1 按位删除 3.2 按数删除 四、查找 4.1 按位查找 4.2 按数查找 五、修改 5.1 按位修改 5.2 按数修改 六、逆置 七、排序 八、按序插入 九、按序合并 十、最小值 完整代码 一、初始化顺序表 初始化并一个顺序表&am…

数据结构—顺序表基本操作的实现(C语言)

前言 本文介绍线性表顺序存储时基本操作的实现&#xff0c;包括顺序表的结构定义、初始化、插入、删除、销毁、显示、清空、判空、求长度、查找&#xff0c;以及线性表的合并。 主要参考&#xff1a;严蔚敏“数据结构及应用算法教程”教材 代码如下 #include <stdio.h>…

顺序表的基本操作(超详细)

1.顺序表的定义 使用结构体来构造一个顺序表。 typedef struct {int length;//当前顺序表长度int Maxsize;//顺序表最大长度int* data;//定义顺序表中元素类型的数组指针 }SqList;2.顺序表的初始化 顺序表的初始化是使用动态分配数组空间方式构造一个空的线性表。 #include&…

多组比较的非参数检验——K-W检验

作者&#xff1a;丁点helper 来源&#xff1a;丁点帮你 前面我们已经讲完两组比较的非参数检验&#xff0c;类似t检验与方差分析&#xff0c;当比较的数据超过两组时&#xff0c;我们就需要换一个方法了。 非参数K-W检验&#xff0c;相比前文讲解的Mann-Whitney 检验就是这样…

推断统计:参数估计和假设检验

目录 1、总体、个体、样本和样本容量    1&#xff09;总体、个体、样本和样本容量的概念    2&#xff09;本文章使用的相关python库   2、推断统计的概念    1&#xff09;推断统计的概念    2&#xff09;为什么要进行推断统计&#xff1f;   3、参数估计(点…

非参数检验之符号检验、Wilcoxon符号秩检验、游程检验

目录 一、符号检验 例2.1下面是世界上71个大城市的花费指数(包括租金)按递增次序排列如下(这里上海是44位&#xff0c;其指数为63.5&#xff09;&#xff1a; R代码&#xff1a; 二、Wilcoxon符号秩检验 例2.3下面是10个欧洲城镇每人每年平均消费的酒类相当于纯酒精数&…

SPSS非参数检验

系列文章目录 SPSS描述统计 SPSS均值检验 SPSS方差分析 文章目录 系列文章目录前言1 非参数检验提出的背景与特点1.1 背景1.2 特点 2 SPSS分析-非参数检验菜单中的相关功能2.1 卡方检验2.1.1 概述2.1.2 操作流程2.1.3 实例操作 2.2 二项分布检验2.2.1 概述2.2.2 操作流程2.2.3…

入门必学 | R语言参数检验之t检验与方差分析

T检验与方差分析 背景介绍R语言实操过程--t test单样本t检验两个独立样本t检验配对t检验 R语言实操过程--anova单因素方差分析多重比较 双因素方差分析 完整代码 之前与大家分享了数据的独立性、正态性、方差齐性检验。如果还不清楚&#xff0c;大家可以通过这篇推文来学习和理…

R语言对数据进行非参数检验

假设检验&#xff1a;参数检验运用样本的统计量来估计总体的参数&#xff0c;如用样本均值估计总体均值&#xff0c;用样本标准差估计总体标准差。 非参数检验则不考虑数据的具体值&#xff0c;而更多地运用了数据大小排序的信息&#xff0c;因此不可能以此估计总体的参数 1.原…

SPSS参数检验、非参数检验、方差分析

参数检验、非参数检验、方差分析 1.导语2.参数检验2.1 数据分布2.1.1 正态分布1.有总体数据2.没有总体数据&#xff0c;用样本3.统计参数 2.1.2 指数分布1.有总体数据2.没有总体数据&#xff0c;样本3.统计参数 2.2 单样本t检验2.2.1 单样本t检验目的2.2.2 SPSS操作 2.3 两独立…

SPSS学习笔记(四)非参数检验

目录 一、配对&#xff1a;Wilcoxon符号-秩检验 分析 操作 结果及分析 二、独立样本&#xff1a;Mann-Whitney U检验 分析 操作 结果及分析 三、单因素ANOVA&#xff1a;Kruskal-Wallis检验 分析 操作 结果及分析 一、配对&#xff1a;Wilcoxon符号-秩检验 分析&a…

R语言非参数检验多重比较

本文首发于公众号&#xff1a;医学和生信笔记&#xff0c;完美观看体验请至公众号查看本文。 医学和生信笔记&#xff0c;专注R语言在临床医学中的使用&#xff0c;R语言数据分析和可视化。 之前介绍了多个样本均数的多重比较&#xff0c;今天说说kruskal-Wallis H检验后的多重…

什么是非参数检验?应该如何操作与分析?

检验问题可划分为两大类&#xff1a;参数检验和非参数检验&#xff0c;其中总体分布的具体函数形式的前提下&#xff0c;只是其中若干个参数未知称为参数检验&#xff0c;否则称为非参数检验。 一、研究场景 非参数检验用于研究定类数据与定量数据之间的关系情况。例如研究人…

【日常】矩阵正态分布参数检验问题

最近给凯爹做的一个苦力活&#xff0c;统计检验这个东西说实话也挺有趣&#xff0c;跟算法设计一样&#xff0c;好的检验真的是挺难设计的&#xff0c;就有近似算法的那种感觉&#xff0c;检验很难保证size和power都很理想&#xff0c;所以就要做tradeoff&#xff0c;感觉这个假…

参数估计与假设检验

推断统计&#xff1a;研究如何利用样本数据来推断总体特征 描述统计&#xff1a;描述一组数据的特征 参数估计&#xff1a;利用样本信息估计总体特征 假设检验&#xff1a;利用样本信息判断对总体的假设是否成立 一.参数估计 就是对于总体指标的估计 估计&#xff1a;根据…

第4章 Stata参数检验

目录 4.1单一样本T检验 案例延伸 4.2独立样本T检验 案例延伸 1.改变置信水平 2.在异方差假定条件下进行假设检验 4.3配对样本T检验 案例延伸 1.改变置信水平 4.4单一样本方差的假设检验 案例延伸 4.5双样本方差的假设检验 参数检验&#xff08;Parameter Test&…