代码通过VScode 编译器实现。
本文主要介绍了数据结构中使用C语言实现顺序表的过程,插入,取值,删除,查找,初始化等顺序表的基本操作。
线性表的顺序表示指的是用一组地址连续的存储单元依次存储线性表的数据元素,这种表示也称作线性表的顺序存储结构或顺序映像。通常,称这种存储结构的线性表为顺序表(Sequential List)。其特点是,逻辑上相邻的数据元素,其物理次序也是相邻的。
第i+1个数据元素的存储位置LOC(ai+1)和第i个数据元素的存储位置LOC(ai)之间满足下列关系:LOC(ai+1)=LOC(ai)+l一般来说,线性表的第i个数据元素ai的存储位置为:LOC(ai)=LOC(a1)+(i−1) × l式中,LOC(a1)是线性表的第一个数据元素a1的存储位置,通常称作线性表的起始位置或基地址,表中相邻的元素ai和ai+1的存储位置LOC(ai)和LOC(ai+1)是相邻的。每一个数据元素的存储位置都和线性表的起始位置相差一个常数,这个常数和数据元素在线性表中的位序成正比,线性表中任一数据元素都可随机存取,所以线性表的顺序存储结构是一种随机存取的存储结构。
在C语言中可用动态分配的一维数组表示线性表,描述如下:
//- - - - - 顺序表的存储结构- - - - -
#define MAXSIZE 100 //顺序表可能达到的最大长度
typedef struct
{
ElemType *elem; //存储空间的基地址
int length; //当前长度
}SqList; //顺序表的结构类型为SqList
说明(1)数组空间通过后面算法2.1初始化动态分配得到,初始化完成后,数组指针elem指示顺序表的基地址,数组空间大小为MAXSIZE。
(2)元素类型定义中的ElemType数据类型是为了描述统一而自定的,在实际应用中,用户可根据实际需要具体定义表中数据元素的数据类型,既可以是基本数据类型,如int、float、char等,也可以是构造数据类型,如struct结构体类型。
(3)length表示顺序表中当前数据元素的个数。因为C语言数组的下标是从0开始的,而位置序号是从1开始的,所以要注意区分元素的位置序号和该元素在数组中的下标位置之间的对应关系,数据元素a1、a2、…、an依次存放在数组elem[0]、elem[1]、…、elem[length-1]中
在上述定义后,可以通过变量定义语句
SqList L;
void InitList(SqList &L)
{//构造一个空的顺序表L
L.elem=new ElemType[MAXSIZE]; //为顺序表分配一个大小为MAXSIZE的数组空间
if(!L.elem) exit(OVERFLOW); //存储分配失败退出
L.length=0; //空表长度为0
return OK;
}
void GetElem(SqList L,int i,ElemType &e)
{
if (i<1||i>L.length) return ERROR; //判断i值是否合理,若不合理,返回ERROR
e=L.elem[i-1]; //elem[i-1]单元存储第i个数据元素
return OK;
}
void LocateElem(SqList L,ElemType e)
{//在顺序表L中查找值为e的数据元素,返回其序号
for(i=0;i< L.length;i++)
if(L.elem[i]==e) return i+1; //查找成功,返回序号i+1
return 0; //查找失败,返回0
}
void ListInsert(SqList &L,int i ,ElemType e)
{//在顺序表L中第i个位置插入新的元素e,i值的合法范围是1≤i≤L.length+1
if((i<1)||(i>L.length+1)) return ERROR; //i值不合法
if(L.length==MAXSIZE) return ERROR; //当前存储空间已满
for(j=L.length-1;j>=i-1;j--)
L.elem[j+1]=L.elem[j]; //插入位置及之后的元素后移
L.elem[i-1]=e; //将新元素e放入第i个位置
++L.length; //表长加1
return OK;
}
void ListDelete(SqList &L,int i)
{//在顺序表L中删除第i个元素,i值的合法范围是1≤i≤L.length
if((i<1)||(i>L.length)) return ERROR; //i值不合法
for(j=i;j<=L.length-1;j++)
L.elem[j-1]=L.elem[j]; //被删除元素之后的元素前移
--L.length; //表长减1
return OK;
}
#include
#define MaxSize 100
#include
typedef struct
{
int data[MaxSize];
int length;
} Sqlist;
void InitList(Sqlist *L, int n)
{ //初始化
L->length = 0;//
for (int i = 0; i data[i]);//初始化表,并使用输入的形式输入数据
L->length++;//表长+1
}
}
void Delete(Sqlist *L, int n)
{ //删除一个表
if(n<1||n>L->length){//输入数据不合法时,显示错误
printf("删除位置错误\n");
}
else{//输入数据合法,删除表长
for (int i = n; i < L->length; i++)
{
L->data[i - 1] = L->data[i];//采用提换的形式来删除N位置的位序元素,并将后一个替换问前一个
}
L->length--;
printf("删除成功,表排序为\n");
}
}
void Inse(Sqlist *L, int n, int e)
{ //插入,在表的n位插入一个数据位E的元素
if(n<1||n>L->length){
printf("插入位置错误\n");
}
else{
for (int i = L->length + 1; i >= n; i--)
{
L->data[i] = L->data[i - 1];//首先执行i=表的最后一个位置+1,然后前一个的值替换为后一个。
}
L->data[n - 1] = e;//将e插入到N位置
L->length++;//表长+1
printf("插入成功,表排序为\n");
}
}
int Locate(Sqlist *L, int n)
{ //查找值为N的数位于什么地方
for (int i = 0; i < L->length; i++)//使用for循环去一个一个寻找
{
if (n == L->data[i])
{
printf("该值位于第%d位\n",i+1);
return 0;//表示代码正常中止
}
}
printf("未找到\n");
return 0;
}
void Get(Sqlist *L, int i, int *e)
{ //返回第i个位置的数
if (i<0||i>L->length)
{
printf("查找位序不存在");
}
else {
e = L->data[i - 1];//返回第i位置的数
printf("%d",e);
}
}
void printSq(Sqlist *L)//输出表内数据
{
printf("-------------------\n");
for (int i = 0; i < L->length; i++)
{
printf("data[%d]==%d\t", i, L->data[i]);
}
printf("\n");
}
int main()
{
Sqlist L;
int a, n,j,f;
printf("输入你要储存的数据的个数,然后输入你要储存的数据\n");
scanf("%d", &n);
InitList(&L, n);
while (printf("请选择需要的功能\n1:插入\n2:删除\n3:查找值为N的数位于什么地方\n4:返回第i个数的值\n5:打印顺序表\n"),(scanf("%d", &a) != EOF))
{
switch (a)
{
case 1:
printf("请输入要插入的位序和要插入的值");
scanf("%d%d",&j,&f);
Inse(&L, j, f);
printSq(&L);
break;
case 2:
printf("请输入要删除的位序");
scanf("%d",&j);
Delete(&L, j);
printSq(&L);
break;
case 3:
printf("请输入需要查找的值:\n");
scanf("%d",&j);
Locate(&L, j);
break;
case 4:
printf("请输入需要查找的位序:\n");
scanf("%d",&j);
Get(&L, j, f);
break;
case 5:
printSq(&L);
break;
}
}
return 0;
}