静态分配
数组采用静态分配时,数组的大小和空间事先已经固定,一旦空间占满,再新加入数据就会溢出,导致程序崩溃。
1 //顺序表——静态分配 2 #include <stdio.h> 3 #define MaxSize 10 //定义顺序表的最大长度 4 5 //定义 6 typedef struct{ 7 int data[MaxSize]; //使用数组存放数据元素 8 int length; //顺序表当前的长度 9 }SqList; 10 11 //初始化——1、将顺序表的所有数据元素初始化为0;2、将顺序表的初始长度设为0 12 void InitList(SqList &L){ //参数为SqList类型,需要& 13 for(int i=0;i<MaxSize;i++){ 14 L.data[i]=0; //将顺序表的所有数据元素初始化为0 15 } 16 L.length=0; //将顺序表的初始长度设为0 17 } 18 19 //插入 ——在位置i插入元素e 20 bool ListInsert(SqList &L,int i,int e){ 21 if(i<1||i>L.length+1) 22 return false; 23 if(i>=MaxSize) 24 return false; 25 for(int j=L.length;j>=i;j--){ 26 L.data[j]=L.data[j-1]; //最好时间复杂度为O(1),最坏和平均为O(n) 27 } 28 L.data[i-1]=e; 29 L.length++; //插入后表的长度+1 30 return true; 31 } 32 33 //删除——删除第i个元素 34 bool ListDelete(SqList &L,int i){ 35 if(i<1||i>L.length) 36 return false; 37 for(int j=i;j<L.length;j++){ 38 L.data[j-1]=L.data[j]; //最好时间复杂度为O(1),最坏和平均为O(n) 39 } 40 L.length--; 41 return true; 42 } 43 44 //查找——按值查找 45 int LocateElem(SqList L,int e){ 46 for(int i=0;i<L.length;i++){ 47 if(L.data[i]==e) 48 printf("该元素为第%d个元素",i+1); 49 } 50 return 0; 51 } 52 int main(){ 53 SqList L; //定义 54 InitList(L); //初始化,此处不需要& 55 ListInsert(L,1,5); //在位置1插入元素5 56 ListInsert(L,2,6); //在位置2插入元素6 57 for(int i=0;i<L.length;i++){ 58 printf("插入后的顺序表第%d个元素为:%d\n",i,L.data[i]); 59 } 60 ListDelete(L,2); //删除第2个元素 61 for(int i=0;i<L.length;i++){ 62 printf("删除后的顺序表为:%d\n",L.data[i]); 63 } 64 LocateElem(L,5); 65 return 0; 66 }
动态分配
数组采用动态分配时,空间在程序执行过程中可以通过动态存储分配语句分配,不需要一次性为线性表划分所有的空间。
1 //顺序表——动态分配 2 #include <stdio.h> 3 #include <stdlib.h> //使用malloc、free的头文件 4 #define InitSize 10 //默认最大长度 5 6 //定义 7 typedef struct{ 8 int *data; //指示动态数组的指针 9 int MaxSize; //顺序表的最大容量 10 int length; //顺序表的当前长度 11 }SeqList; 12 13 //初始化——使用malloc函数动态申请内存 14 void InitList(SeqList &L){ 15 L.data=(int *)malloc(InitSize*sizeof(int)); //使用malloc函数动态申请内存 16 L.length=0; //当前长度设为0 17 L.MaxSize=InitSize; //默认最大长度 18 } 19 20 //动态增加数组长度 21 void IncreaseList(SeqList &L,int len){ 22 int *p=L.data; //将数组中的数据暂时存放到指针p 23 L.data=(int *)malloc((L.MaxSize+len)*sizeof(int)); //重新申请内存 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 //插入 32 bool ListInsert(SeqList &L,int i,int e){ 33 if(i<1||i>L.length+1) 34 return false; 35 if(i>=L.MaxSize) 36 return false; 37 for(int j=L.length;j>=i;j--){ 38 L.data[j]=L.data[j-1]; 39 } 40 L.data[i-1]=e; 41 L.length++; 42 return true; 43 } 44 45 //删除 46 bool ListDelete(SeqList &L,int i){ 47 if(i<1||i>L.length) 48 return false; 49 for(int j=i;j<L.length;j++){ 50 L.data[j-1]=L.data[j]; 51 } 52 L.length--; 53 return true; 54 } 55 56 //按值查找 57 void LocateElem(SeqList L,int e){ 58 for(int i=0;i<L.length;i++){ 59 if(L.data[i]==e) 60 printf("元素%d是第%d个元素",e,i+1); 61 } 62 } 63 int main(){ 64 SeqList L; 65 InitList(L); 66 // IncreaseList(L,10); //动态增加数组长度 67 ListInsert(L,1,5); //在位置1插入元素5 68 ListInsert(L,2,6); //在位置2插入元素6 69 for(int i=0;i<L.length;i++){ 70 printf("插入后的顺序表第%d个元素为:%d\n",i,L.data[i]); 71 } 72 ListDelete(L,2); //删除第2个元素 73 for(int i=0;i<L.length;i++){ 74 printf("删除后的顺序表为:%d\n",L.data[i]); 75 } 76 LocateElem(L,5); 77 return 0; 78 }
标签:顺序,return,静态,MaxSize,动态分配,int,length,data From: https://www.cnblogs.com/zyj3955/p/17658310.html