C语言 顺序表 动态分配
数据结构 顺序表------动态分配
1 #include <stdio.h> 2 #include <stdlib.h> 3 #define InitSize 10 //默认的最大长度 4 5 typedef struct{ 6 int *data; //指示动态分配数组的指针 7 int MaxSize; //顺序表的最大容量 8 int length; //顺序表当前的长度 9 }SeqList; 10 11 //初始化顺序表 12 void InitList(SeqList &L){ 13 //用malloc函数申请一片连续的存储空间 14 L.data=(int *)malloc(InitSize*sizeof(int)); 15 L.length=0; 16 L.MaxSize=InitSize; 17 } 18 19 //增加动态数组的长度 20 void IncreaseSize(SeqList &L,int len){ 21 22 int *p=L.data; 23 L.data=(int *)malloc((L.MaxSize+len)*sizeof(int)); //len是要增加的长度 24 for(int i=0; i<L.length; i++){ 25 L.data[i]=p[i]; //将数据复制到新区域 26 } 27 L.MaxSize=L.MaxSize+len; 28 free(p); //释放原有的内存空间 29 } 30 31 //插入操作 最好时间复杂度O(1) 最差时间复杂度O(n) 平均时间复杂度O(n) 32 bool ListInsert(SeqList &L,int i,int e){ 33 if(i<1||i>L.length+1) //判断i的范围是否有效 34 return false; 35 if(L.length>=L.MaxSize) //判断当前存储空间是否已满 36 return false; 37 for(int j=L.length; j>=i; j--) //将第i个元素及之后的元素后移 38 L.data[j]=L.data[j-1]; 39 L.data[i-1]=e; //在位置i处存放插入的数据e 40 L.length++; //长度加一 41 return true; 42 } 43 44 //删除操作 最好时间复杂度O(1) 最差时间复杂度O(n) 平均时间复杂度O(n) 45 bool ListDelect(SeqList &L,int i,int & e){ 46 47 if(i<1||i>L.length) //判断i的范围是否有效 48 return false; 49 e=L.data[i-1]; //将被删除的元素赋值给e 50 for(int j=i; j<L.length; j++) //将第i个位置后的元素前移 51 L.data[j-1]=L.data[j]; 52 L.length--; //长度减一 53 return true; 54 55 } 56 57 //按位查找 58 int GetElem(SeqList L,int i){ 59 60 if(i<1||i>L.length) //判断i的范围是否有效 61 return false; 62 return L.data[i-1]; 63 } 64 65 //按值查找 66 int LocateElem(SeqList L,int e){ 67 68 for(int i=0; i<L.length; i++){ 69 if(L.data[i]==e) 70 return i+1; 71 } 72 return 0; 73 } 74 75 int main(){ 76 77 return 0; 78 }