数据结构论坛

首页 » 分类 » 常识 » 数据结构基础之顺序表
TUhjnbcbe - 2025/1/24 21:24:00

数据结构(datastructure)是带有结构特性的数据元素的集合,在程序中经常有他的身影。由此可见它十分的重要。

目录

线性表

顺序表的操作总结起来就是四个字:增删改查

增加:

数据结构大概分为几个部分,分别是顺序表,链表,栈,树,算法等等。按逻辑关系来分,可分为四种

没有关系:处同一集合

一对一关系:线性表,栈,队列

一对多关系:二叉树

多对多关系:图状结构

按存储关系可以分为

顺序存储:数据紧挨在保存同块空间之中

链式存储:数据随机存储在内存之中,通过指针将其链接。

线性表

按顺序存储的方式来存储的称为顺序表

编辑

顺序表一般会采用数组的方式进行存储,为了能够更好的遍历,需要添加一个变量来判断此时数组的长度。正是因为多了一个变量,此时的数组就不在适合用单纯的数组来表示,用结构体显得更加的合适。这就是顺序表的初始化。

//可以采用宏定义来确定数组的长度#defineN10typedefineinttypedata;structstu{typedataarr[N];intlen;};

有了一个初始化的顺序表,接下来就是对顺序表进行实例化。

实例化主要是为其开辟一块空间,这里我们用malloc开辟一块空间

structstu*Order_Lisr_init(void){//开辟一块新空间用于存储sturctstu*p=(struc*stu)malloc(sizeof(structstu));//判断空间是否开辟成功if(p==NULL){//空间开辟错误直接打印出错信息,结束整个程序;perror("mallocerror");retrunNULL;}p-len=0;returnp;}

接下来就是对其进行操作

顺序表的操作总结起来就是四个字:增删改查

增加:

编辑

如图所示,如果我们要增加一个15到顺序表中,15可以有多个位置进行添加即0,1,2,3,4。这五个位置。

假设将其插在2这个位置中,为了保证后面的数据不会丢失,所以此时需要先将这个数据后移,即将

第一步移动

len-1————》》len的位置移动。

此处省略n步

最后一步移动:也就是我们要插入的位置loc向后移动一步,即

loc——————》》loc+1

这时,基本思路就出来了,移动之后,总的长度需要加1,即

len+1

下面是代码实现部分

voidOrder_List_add(structstu*p,intloc,typedatadata){inti;//判断位置是否合法if(loc0

locp-len)rentun;//判断是否顺序表是否已经存满if(p-len==N)printf("数据已满");return;//通过for循环来移动数据for(i=p-len;i=loc+1i--)p-arr[i+1]=p-arr;//存储数据p-arr[loc]=data;//长度加一p-len++;}

为了更好的测试这个功能,所以这时候需要一个遍历操作,代码如下。

voiddisplay(structstu*p){printf("遍历结果为")inti;for(i=0;ip-len;i++)printf("%d",p-arr);printf("\n");}

增的代码就已经全部写完.

第一步移动,因为删除代码之后,整个顺序表要往前移动

编辑

i+1————》i的位置移动。

此处省略n步

最后一步移动:

len-1——————》》len-2

这时,基本思路就出来了.代码如下

voidOrder_List_del(structstu*p,typedatadata){inti,j;whlie(ip-len){if(p-arr==data){for(j=i+1;jp-len;j++)p-arr[j-1]=p-arr[j];p-len--;countinue;}i++;}}

即更新数据,这个思路和删除的思路有点相同,首先我们需要找到我们需要更新的数据,在输入我们想更新的数据即可

代码如下

voidOrder_list_updata(structstu*p,typedataold,typedatanew){while(ip-len){if(p-arr==old)p-arr=new;}}

这就是整个顺序表的结构,下面一起来做个小题目测试一下吧。

编辑

#include"Order.h"intmain(void){intret,i;  datatypedata;    structstu*p=Order_init();  if(p==NULL)    return-1;  printf("p:%p\n",p);    //测试  printf("开始\n");  while(1)  {    ret=scanf("%d",data);    if(ret!=1)      break;    if(data0)    {      for(i=0;ip-len;i++)        if(datap-arr)          break;              Order_add(p,i,data);    }elseif(data0)    {      Order_del(p,-data);    }    display(p);      }    }

结果

如下哈

编辑

1
查看完整版本: 数据结构基础之顺序表