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

article/2025/9/14 23:42:14

1.顺序表的定义

使用结构体来构造一个顺序表。

typedef struct
{int length;//当前顺序表长度int Maxsize;//顺序表最大长度int* data;//定义顺序表中元素类型的数组指针
}SqList;

2.顺序表的初始化
顺序表的初始化是使用动态分配数组空间方式构造一个空的线性表。

#include<stdio.h>
#include<stdlib.h>
#define InitSize 10void InitList(SqList &L)
{L.data = (int *)malloc(InitSize*sizeof(int));//用malloc函数申请一片空间L.length = 0;//把顺序表的当前长度设为0L.Maxsize = InitSize;//这是顺序表的最大长度
}

malloc函数:malloc函数的返回值是void *,使用malloc函数要在返回的时候转化为我们需要的类型。malloc(InitSize * sizeof(int))这代表的是申请了InitSize个int型大小的空间。malloc函数的使用要引头文件#include<stdlib.h>。
分配成功则返回指向被分配内存的指针,分配失败则返回空指针NULL。

3.增加顺序表的长度
操作步骤:新建一个* p用来指向原来顺序表的地址,然后新申请一片更大的空间,再把*p指向的值(原先的顺序表元素)一个个放入到新申请空间的顺序表里,最后销毁原来的顺序表。

void IncreaseSize(SqList &L)
{int len;int *p = L.data;//*p指向的地址和顺序表的首地址是一样的printf("请输入你要增加的顺序表的长度:");scanf("%d", &len);L.data = (int *)malloc((L.Maxsize + len)*sizeof(int));//新申请一片空间for (int i = 0; i < L.length; i++)L.data[i] = p[i];//把值一个个复制过去L.Maxsize = L.Maxsize + len;//顺序表最大长度增加lenfree(p);//释放空间
}

4.1顺序表的元素查找(按位查找)
顺序表有随机存取的功能,因此按位查找元素可以直接通过数组下标定位取得。

bool GetElem(SqList &L)
{int i;printf("你要找第几个元素:");scanf("%d", &i);if (i<1 || i>L.length + 1)//判断输入的i值是否合法{printf("查找失败\n");return false;//i值不合法,返回一个false}printf("第%d个元素是%d\n", i, L.data[i - 1]);return true;//返回一个true
}

false/true是bool型变量,C++独有,一般将非零值看做true,将零值看做false。

4.2顺序表的元素查找(按值查找)
顺序表按值查找,只能采用依次遍历的方法。

void LocateElem(SqList &L)
{int e;int k = 1;printf("输入你要查找的元素:");scanf("%d", &e);for (int i = 0; i < L.length; i++)if (L.data[i] == e){printf("找到了,是第%d个元素\n", i + 1);k = 0;break;}if (k)printf("找不到元素%d\n", e);
}

5.顺序表的元素插入
顺序表的元素插入和插队是一个意思的。想象一下,有一个人要插队,他要插到第3个位置去,那么他前面的两个人不用动,而他后面的人都得动。具体步骤是:最后面的那个人后退一个位置,倒数第二个人后退到原来最后一个人的位置,这样子后面的每个人依次后退,最后就空出来了一个位置,这个人就插队进去了。顺序表也是这么插入的。在插入操作完成后表长+1(多了一个人)。

元素插入有一些要求:
1.元素下标是否越界(有没有插队到奇怪的位置)
2.顺序表存储空间是否满了(有没有位置让你插队)

bool ListInsret(SqList &L)
{int i, e;printf("请输入要插入顺序表的元素和元素位置:");scanf("%d %d", &e, &i);if (i<1 || i>L.length + 1)//判断元素下标是否越界return false;if (L.length > L.Maxsize)//判断顺序表存储空间是否满了return false;for (int j = L.length; j >= i; j--){L.data[j] = L.data[j-1];//从后往前逐个后移元素}L.data[i-1] = e;//将新元素放入下标为i-1的位置L.length++;//表长+1printf("插入的元素是%d,插入的位置是%d\n", e, i);return true;
}

6.顺序表的元素删除
删除和插入的操作类型,这里借用插队的例子说明。一群人在排队,有一个人有事临时走了,那么这个人的位置就空出来了,后面的人就一个个往前一步,补上这个空位。在删除操作完成后表长-1(少了一个人)。

元素删除有一些要求:
1.元素下标是否越界(走的人是不是这个排队里面的人)
2.顺序表存储空间是否为空(有没有人可以走)

bool ListDelete(SqList &L)
{int i, e;printf("请输入要删除的元素位置:");scanf("%d",&i);if (i<1 || i>L.length + 1)//判断元素下标是否越界return false;if (!L.data)//判断是不是空表{printf("空表\n");return false;}e = L.data[i - 1];for (int j = i; j <= L.length; j++){L.data[j-1] = L.data[j];}L.length--;//表长-1printf("删除的元素是%d,这个元素的位置是%d\n", e, i);return true;
}

7.顺序表的打印

bool PrintList(SqList &L)
{if (!L.data)//判断是不是空表return false;printf("顺序表里的元素有:");for (int i = 0; i < L.length; i++)printf("%d ", L.data[i]);printf("\n");return true;
}

8.求顺序表的表长

int Length(SqList &L)//求表长
{if (L.length == 0)return 0;return L.length;
}

9.顺序表的销毁
顺序表初始化的时候是用malloc函数向系统申请的空间,malloc函数申请的空间是在内存的堆区,堆区的空间不会被系统自动回收,只把L.length改为0是不够的,还需要用free函数释放空间。与malloc一样,要引头文件#include<stdlib.h>。

void DestroyList(SqList &L)
{char a;getchar();printf("是否销毁顺序表(Y/N):");scanf("%c", &a);if (a == 'Y'){L.length = 0;L.Maxsize = 0;free(L.data);//释放空间printf("顺序表已销毁\n");}
}

这里的getchar是用于吃掉之前操作遗留的回车,不然在下面的输入语句中会把遗留的空格赋值给a,直接跳过输入步骤。也就无法销毁顺序表。

全部代码:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#define InitSize 10typedef struct//定义顺序表
{int length;//int Maxsize;int* data;
}SqList;void InitList(SqList &L)//初始化顺序表
{L.data = (int *)malloc(InitSize*sizeof(int));L.length = 0;L.Maxsize = InitSize;
}void WriteList(SqList &L)//把元素放入顺序表
{printf("请输入你要创建的顺序表的长度:");scanf("%d", &L.length);printf("请输入%d个你要放入顺序表里的元素:",L.length);for (int i = 0; i < L.length; i++)scanf("%d", &L.data[i]);
}void IncreaseSize(SqList &L)//增加顺序表的长度
{int len;int *p = L.data;printf("请输入你要增加的顺序表的长度:");scanf("%d", &len);L.data = (int *)malloc((L.Maxsize + len)*sizeof(int));for (int i = 0; i < L.length; i++)L.data[i] = p[i];L.Maxsize = L.Maxsize + len;free(p);
}bool ListInsret(SqList &L)//插入元素
{int i, e;printf("请输入要插入顺序表的元素和元素位置:");scanf("%d %d", &e, &i);if (i<1 || i>L.length + 1)return false;if (L.length > L.Maxsize)return false;for (int j = L.length; j >= i; j--){L.data[j] = L.data[j-1];}L.data[i-1] = e;L.length++;printf("插入的元素是%d,插入的位置是%d\n", e, i);return true;
}bool ListDelete(SqList &L)//删除操作
{int i, e;printf("请输入要删除的元素位置:");scanf("%d",&i);if (i<1 || i>L.length + 1)return false;if (!L.data)return false;e = L.data[i - 1];for (int j = i; j <= L.length; j++){L.data[j-1] = L.data[j];}L.length--;printf("删除的元素是%d,这个元素的位置是%d\n", e, i);return true;
}bool GetElem(SqList &L)//按位查找
{int i;printf("你要找第几个元素:");scanf("%d", &i);if (i<1 || i>L.length + 1){printf("查找失败\n");return false;}printf("第%d个元素是%d\n", i, L.data[i - 1]);return true;
}void LocateElem(SqList &L)//按值查找
{int e;int k = 1;printf("输入你要查找的元素值:");scanf("%d", &e);for (int i = 0; i < L.length; i++)if (L.data[i] == e){printf("找到了,是第%d个元素\n", i + 1);k = 0;break;}if (k)printf("找不到元素%d\n", e);
}bool PrintList(SqList &L)//打印顺序表
{if (!L.data)return false;printf("顺序表里的元素有:");for (int i = 0; i < L.length; i++)printf("%d ", L.data[i]);printf("\n");return true;
}void DestroyList(SqList &L)//销毁顺序表
{char a;getchar();printf("是否销毁顺序表(Y/N):");scanf("%c", &a);if (a == 'Y'){L.length = 0;L.Maxsize = 0;free(L.data);printf("顺序表已销毁\n");}
}int Length(SqList &L)//求表长
{if (L.length == 0)return 0;return L.length;
}int main()
{SqList L;InitList(L);WriteList(L);PrintList(L);IncreaseSize(L);ListInsret(L);PrintList(L);ListDelete(L);PrintList(L);GetElem(L);LocateElem(L);int len = Length(L);printf("顺序表的表长:%d\n", len);DestroyList(L);return 0;
}

代码结果:
在这里插入图片描述

觉得写得不错可以点个赞呀。😘


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

相关文章

多组比较的非参数检验——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&…

非参数检验——Wilcoxon 检验 Friedman 检验与 Nemenyi 后续检验

最近看论文&#xff0c;看到了Wilcoxon signed-rank test&#xff08;符号秩检验&#xff09;&#xff0c;咱也不知道是个啥&#xff0c;就学习了一下&#xff0c;这里做一下笔记&#xff0c;方便以后查阅。 非参数检验——Wilcoxon 检验 非参数检验概念非参数检验和参数检验的…

SPSS之“参数检验”

目录 简介单样本t检验两独立样本t检验两配对样本t检验 简介 <!-主要作为个人的笔记&#xff0c;和操作步骤的查询-->参数检验(比价均值)是根据样本数据推断总体特征的方法。这种推断通常在以下两种情况下进行&#xff1a;参数检验&#xff1a;总体分布(多为正态分布)已知…

参数检验和非参数检验(结合SPSS分析)

文章目录 假设检验参数检验平均值检验单样本t检验两独立样本t检验配对样本t检验 非参数检验卡方检验单样本K-S检验两独立样本的非参数检验多个独立样本的非参数检验两配对样本检验多匹配样本的非参数检验 假设检验 概念&#xff1a;是一种根据样本数据来推断总体的分布或均值、…

参数与非参数检验:理解差异并正确使用

数据科学是一个快速发展的领域&#xff0c;它在很大程度上依赖于统计技术来分析和理解复杂的数据集。这个过程的一个关键部分是假设检验&#xff0c;它有助于确定从样本中获得的结果是否可以推广到总体。 在这篇文章中&#xff0c;我们将探讨参数与非参数检验之间的区别&#…

SPSS-参数检验

1. 假设检验 假设检验分为参数检验与非参数检验。 &#xff08;1&#xff09; 参数检验&#xff1a;已知总体分布, 猜测总体的某参数(原假设H0&#xff0c;null hypothesis)&#xff0c;用一组样本来检验这个假设&#xff0c; 是否正确 (即接受还是拒绝假设H0)。 &#xff0…

参数检验和非参数检验

一、参数检验 1、基本思想 2、两类错误 3.、检验步骤 4、检验的p值 在一个假设检验问题中, 拒绝原假设H0的最小显著性水平称为检验的p值. 5、单正态总体参数的检验 &#xff08;1&#xff09; &#xff08;2&#xff09; &#xff08;3&#xff09; 6、两正态总体参数的检…

数据分析之参数检验与非参数检验

1、参数检验和非参数检验的区别 定义不同&#xff1a; 参数检验&#xff1a;假定数据服从某分布&#xff08;一般为正态分布&#xff09;&#xff0c;通过样本参数的估计量&#xff08;xs&#xff09;对总体参数&#xff08;μ&#xff09;进行检验&#xff0c;比如t检验、u检…