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

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

前言

本文介绍线性表顺序存储时基本操作的实现,包括顺序表的结构定义、初始化、插入、删除、销毁、显示、清空、判空、求长度、查找,以及线性表的合并
主要参考:严蔚敏“数据结构及应用算法教程”教材


代码如下

#include <stdio.h>
#include <stdlib.h>#define LIST_INIT_SIZE 100  //链表的初始容量
#define LISTINCREMENT 10  //扩容时的增量
#define OK 1
#define OVERFLOW -1
#define error 0typedef int ElemType;
typedef int Status;typedef struct  //顺序表的结构定义
{ElemType *elem;  //存储数据元素的一维数组int length;  //线性表的当前长度int listsize;  //当前分配的容量
}SqList;void InitList_sq(SqList *L)  //初始化
{L->elem=(ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));  //分配空间if(!L->elem)  //判断分配是否成功exit(OVERFLOW);L->length=0;  //初始化长度为0L->listsize=LIST_INIT_SIZE;  //初始化容量为100
}Status ListInsert_sq(SqList *L,int i,ElemType x)  //插入
{ElemType *newbase,*q,*p;if(i<1 || i>L->length+1)  //判断插入位置的合理性return error;if(L->length >= L->listsize)  //若顺序表的长度已经大于初始容量,则需要扩容{newbase=(ElemType *)realloc(L->elem,(L->listsize+LISTINCREMENT)*sizeof(ElemType));if(!newbase)  //判断扩容是否成功exit(OVERFLOW);L->elem=newbase;L->listsize+=LISTINCREMENT;  //增加存储容量}q=&(L->elem[i-1]);  //q记录插入地址for(p=L->elem + L->length-1;p>=q;p--)*(p+1)=*p;  //插入位置及之后的元素右移*q=x;  //插入元素xL->length++;  //更新表长(表长加1)return OK;
}void ListDelete_Sq(SqList *L,int i)  //删除
{ElemType *delete_i,*q,*e;if(i<1||i>L->length)  //判断Loc的合理性printf("error!");delete_i=&(L->elem[i-1]);  //指针p指向被删除元素的位置*e=L->elem[i-1];  //被删除的元素赋给eq=L->elem+L->length-1;  //记录线性表的表尾地址for(delete_i++;delete_i<=q;delete_i++)*(delete_i-1)=*delete_i;  //被删除元素之后的元素向左移动L->length--;  //更新表长
}Status DestroyList(SqList *L)  //销毁
{int i;for(i=0;i<L->length;i++){L->elem[i]=0;free(L->elem[i]);  //释放内存空间}L->length=0;  //清空长度L->listsize=0;  //清空容量printf("销毁成功\n");return OK;
}void show_SqList(SqList *L)  //显示
{int i;for(i=0;i<L->length;i++)printf("elem[%d]=%d\n",i+1,L->elem[i]);printf("\n");
}void clearList_Sq(SqList *L)  //清空
{L->length=0;printf("清空成功\n");
}int listempty(SqList *L)  //判空
{if(L->length==0)printf("为空\n");elseprintf("不为空\n");return 0;
}int ListLength_Sq(SqList *L)  //求长度
{printf("%d\n",L->length);return L->length;
}int ListSearch_sq(SqList *L,int key)  //查找
{int i=1;int *p=&(L->elem[0]);while(i<=L->length &&(*p!=key)){p++;i++;}if(i<L->length)return i;elsereturn 0;
}int MergeList_Sq(SqList *La, SqList *Lb, SqList *Lc)  //合并
{int *pa = &(La->elem[0]);   //指针pa指向La表头的位置int *pb = &(Lb->elem[0]);   //指针pb指向Lb表头的位置Lc->listsize = Lc->length = La->length+Lb->length;  //初始化Lcint *pc = Lc->elem = (int *)malloc(Lc->listsize*sizeof(int));  //给Lc分配空间if(!Lc->elem){return -1;   //存储分配失败}int *pa_last = &(La->elem[La->length-1]);    //指针pa_last指向La表尾的位置int *pb_last = &(Lb->elem[Lb->length-1]);    //指针pb_last指向Lb表尾的位置while(pa<=pa_last && pb<=pb_last){if(*pa<=*pb){*pc=*pa;pc++;pa++;}else{*pc=*pb;pc++;pb++;}}while(pa<=pa_last)   //插入La的剩余元素{*pc=*pa;pc++;pa++;}while(pb<=pb_last)   //插入Lb的剩余元素{*pc=*pb;pc++;pb++;}return 0;
}int main()
{int i;int key=5;SqList L;SqList La,Lb,Lc;InitList_sq(&L);InitList_sq(&La);InitList_sq(&Lb);for(i=0;i<10;i++)ListInsert_sq(&L,i+1,i+1);printf("原表顺序表:\n");show_SqList(&L);printf("插入后,在3位置插入7:\n");ListInsert_sq(&L,7,3);show_SqList(&L);printf("删除后,把3位置删除:\n");ListDelete_Sq(&L,3);show_SqList(&L);printf("顺序表的长度:\n");ListLength_Sq(&L);printf("判断顺序表是否为空:\n");listempty(&L);printf("查找元素:%d\n",key);printf("被查找元素的位序是:%d\n",ListSearch_sq(&L,key));clearList_Sq(&L);DestroyList(&L);for(i=0;i<10;i++)ListInsert_sq(&La,i+1,i+1);printf("顺序表La为:\n");show_SqList(&La);for(i=0;i<10;i++)ListInsert_sq(&Lb,i+1,i+8);printf("顺序表Lb为:\n");show_SqList(&Lb);MergeList_Sq(&La,&Lb,&Lc);printf("顺序表Lc为:\n");show_SqList(&Lc);return 0;
}

运行结果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


http://chatgpt.dhexx.cn/article/4AmvJ7NH.shtml

相关文章

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

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&…

非参数检验——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、两正态总体参数的检…