数据结构(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); } }
结果
如下哈
编辑