使用C++进行线性表之顺序表代码实现

本文档是关于数据结构中线性表的顺序表实现,采用C++编程。作者参考了严蔚敏的教材及GitHub上的优秀代码,简化后形成可运行的版本。内容包括顺序表的初始化、销毁、添加元素、清空等操作,并附有相应的内存测试和调试结果。
摘要由CSDN通过智能技术生成

情况说明:

  • 这是对于本科数据结构重新学习,代码参考本科所学的严蔚敏的数据结构和github(https://github.com/kangjianwei/Data-Structure)上一位牛人的代码进行学习。
  • 需要说明:那位牛人的宏定义方面和课本风格一致,宏定义方面特别严谨,而本系列的代码均是在理解人家代码基础上,配合课本完成简化版,可以运行的代码。

顺序表初始化:

//主要代码
//使用结构体对顺序表进行表示
typedef struct {
   
   int * elem;//这是指向这个结构体的指针变量
   int length;//这是顺序表的长度
   int listsize;//这是顺序表当前分配的大小,比如书里面给的100大小的空间
}SqList;

//顺序表初始化
void InitList_Sq(SqList *L){
   
   //首先需要动态分配一个地址
   //注意这个函数参数的位置,这里可以写成SqList *L,下面必须写成L->elem或者(*L).elem,
   //如果是Sqlist &L 下面写的形式是L.elem(*L 表示的是指针,而&L是引用,说人话就是二者都可以
   // 指向这个顺序表,&L可以理解为一个别名而已。先这样理解吧)
   L->elem = (int *) malloc(LIST_INIT_SIZE*sizeof(int));
   if(!(L->elem)){
   
       return;
   }
   L->length=0;
   L->listsize=LIST_INIT_SIZE;
}
int main() {
   
   SqList L;
   printf("开始初始化这个顺序表...\n");
   {
   
       InitList_Sq(&L);//&L,这里是作为实参,而*L往往作为一种形参
       printf("初始化完毕...\n");
   }
   return 0;
}

return 0加断点内存测试结果如下:
可以发现结构体的初始内存地址、长度、初始分配空间大小均已经分配好。
在这里插入图片描述
顺序表销毁

//销毁顺序表
void DestroyList(SqList *L){
   
    //首先释放地址空间
    free(L->elem);
    L->elem=NULL;//指针指向空
    L->length=0;//长度均变成0
    L->listsize=0;
}
 printf("开始销毁这个顺序表...\n");
    {
   
        DestroyList(&L);
        printf("初始化完毕...\n");//这里是销毁之后断点,变成NULL 0 0
    }

内存如图所示:
在这里插入图片描述添加元素

//某个位置插入一个数
void ListInsert_Sq(SqList *L,int i,int e){
   
    //在顺序表1-n的i位置之前插入一个数e
    int *newbase,*p,*q;
    if(i<1||i>(L->length)+1) return;
    if((L->length)>=(L->listsize)){
   
        //如果插入的数据过大,超过顺序表当前大小
        //需要重新开辟空间
        //这里用realloc 是表明在谁基础上再改变内存
        //newbase是一个新的地址
        newbase=(int *)realloc((L->elem),(L->listsize+LISTINCREMENT)*sizeof(int));
        if(!newbase) return;//如果不是这个,返回
        L->elem=newbase;//把这个新的地址分给elem
        L->listsize+=LISTINCREMENT;//容量增加
    }
    //q表示数据e insert的位置
    q=&(L->elem[i-1]);
    for(p=&((*L).elem[(*L).length-1]);p>=q;--p)
        *(p+1)=*p;//实现右移
    *q =e;//这里说明一下 ( * &q)就是表示本身的数据
    (*L).length++;
}
//测试
   printf("开始插入元素到这个顺序表...\n");
    {
   
        for(int i=1;i<=8;i++){
   
            
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值