动态分配一维数组 线性表的顺序表示

动态分配
动态分配一位数组 , 存储数组的空间在程序执行过程中通过动态存储分配语句分配的 , 一旦数据空间占满 , 就另外开辟一块更大的存储空间 , 用以替换原来的存储空间 , 从而达到扩充存储数组空间的目的 , 而不需要为线性表一次性地划分所有空间 。
大致上都与静态分配一致 , 只有以下几点不同
【动态分配一维数组线性表的顺序表示】1)结构体中换为指示冬天分配数组的指针

动态分配一维数组  线性表的顺序表示

文章插图
2)数组的最大容量可以扩充
3)初始化要用
4) 扩充时要新写一个扩充函数
扩充函数即重新分配一块空间 , 将原来的内容复制过来 , 然后释放原来的空间 。
动态分配一维数组  线性表的顺序表示

文章插图
5) 不同 , 静态分配由内存自动回收 , 而动态分配要手动free
#include#include//malloc free函数的头文件#define InitSize 20//默认的最大长度//线性表顺序表示一维数组的动态分配//动态分配时 , 存储数组的空间是在程序执行过程中通过动态存储分配语句分配的 , 一旦//数据空间占满 , 就另外开辟一块更大的存储空间 , 用以代替原来的存储空间 , 从而//达到扩充存储数组空间的目的typedef struct{int *data;//指示动态分配数组的指针int MaxSize,len;//数组的最大容量和当前个数}SqList;void InitList(SqList &L){//L.data=http://www.kingceram.com/post/NULL;L.data=(int*)malloc(InitSize*sizeof(int));L.MaxSize=InitSize;L.len=0;}int Length(SqList L){return L.len;}//按值查找int LocateElem(SqList L,int e){for(int i=0; iL.len){printf("非法位序!\n");return 0;//位置非法}return L.data[i-1];}//增加动态分配数组的长度,加长len的长度void IncreaseSize(SqList &L, int len){int *p=L.data;L.data=http://www.kingceram.com/post/(int*)malloc((L.len+len)*sizeof(int));for(int i=0;i<=L.len;i++){//@@@ <=L.data[i]=p[i];}for(int i=L.len;i L.len+1)//插入位置不合法return false;if(L.len > L.MaxSize){//@@@这里不能是InitSize/* printf("超出数组最大长度空间\n");return false;*/IncreaseSize(L,20);//printf("L.len=%d, L.data[21]=%d\n",L.len,L.data[20]);}for(int j = L.len; j >= i; j--){//把i后面的都往后移动一个位置L.data[j]=L.data[j-1];}L.data[i-1]=e;//@@@L.len++;//@@@return true;//插入成功}//删除操作 , 删除L中第i个位置的元素 , 用e返回删除元素的值bool DeleteList(SqList &L,int i,int &e){if(i<1||i>L.len)return false;//删除位置不合法e=L.data[i-1];//@@@for(int j=i-1;j