用到的两个关于存储空间动态分配的函数
1.malloc 分配指定字节数的存储区,此存储区中的初始值不确定
用法 :ElemType * m=(ElemType* )malloc(n*sizeof(ElemType));
2.realloc 更改以前分配区的长度,当增加长度时,可能需将以前分配区的内容移到另一个足够大的区域,而新增区域内的初始值则不确定,如果重新分配成功则返回指向被分配内存的指针,否则返回空指针NULL,当内存不再使用时,应使用free()函数将内存块释放
用法:ElemType * m=(ElemType * )realloc( * ptr , (n*sizeof(ElemType));
参数ptr必须是调用malloc或者calloc返回的内存指针,realloc的第一个参数是NULL的话,则它的作用和malloc一样,realloc的第二个参数是0,则它释放内存
#include <iostream> #define LIST_INIT_SIZE 100 #define LISTINCREMENT 10 using namespace std; //线性表内的元素都为int类型为例 typedef struct{ int * elem; int length; int listsize; }SqList; int initList(SqList &L); int insertElem(SqList &L,int p,int e); int deleteElem(SqList &L,int p,int &e); int getElem(SqList L,int p); int traversal(SqList L); int getLength(SqList L); int main() { SqList L; initList(L); for(int i=1;i<=5;i++){ insertElem(L,i,i); getElem(L,i+1); } traversal(L); cout<<"此时线性表长度为:"<<getLength(L)<<endl; cout<<"删除第2个数字后"<<endl; int e=0; deleteElem(L,2,e); cout<<"删除的数字为:"<<e<<endl; traversal(L); cout<<"此时线性表长度为:"<<getLength(L)<<endl; return 0; } //初始化线性表 int initList(SqList &L){ L.elem=(int * )malloc(LIST_INIT_SIZE*sizeof(int)); if(!L.elem)return 0;//存储分配失败 L.length=0; L.listsize=LIST_INIT_SIZE;//初始存储容量 return 1; } //在顺序线性表L中第p个位置之后插入新元素e int insertElem(SqList &L,int p,int e){ if(p<1||p>L.length+1)return 0;//判断插入位置是否有效 if(L.length>L.listsize){//判断空间是否够用 int * m=(int * )realloc(L.elem,(L.listsize+LIST_INIT_SIZE)*sizeof(int));//否则就扩展空间 if(!m)return 0;//分配失败 L.elem=m;//新基址 L.listsize+=LISTINCREMENT;//增加存储容量 } int * q=&(L.elem[p-1]);//插入位置 for(int * i=&(L.elem[L.length-1]);i>=q;i--){ *(i+1)=*i;//插入元素从最后一个开始到插入位置依次往后移一个位置 } *q=e;//插入e L.length++;//线性表长度+1 return 1; } //删除 int deleteElem(SqList &L,int p,int &e){ //i的合法值为1<=i<=L.length if(p<1||p>L.length)return 0; int * q=&(L.elem[p]);//获取删除元素的位置并赋值给指针i int * m=&(L.elem[p-1]);//将删除的元素复制给e e=*m; for(int * i=q;i<=&(L.elem[L.length-1]);i++){ *(i-1)=*i;//删除位置后的元素依次往前移动一个位置 } L.length--; return 1; } //获取当前元素 int getElem(SqList L,int p){ int * q=&(L.elem[p-1]); return *q; } //遍历线性表 int traversal(SqList L){ int * q; cout<<"遍历结果为:"<<endl; for(int i=0;i<L.length;i++){ q=&(L.elem[i]); cout<<*q<<" "; } } int getLength(SqList L){ return L.length; }