数据结构之C++实现线性表顺序表示中的动态存储

用到的两个关于存储空间动态分配的函数

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;
}



猜你喜欢

转载自blog.csdn.net/miss_dairongrong/article/details/80761959