一.线性表-顺序表(动态分配)学习笔记(2)

顺序表的动态分配

  • 元素为int类型

  • 与静态分配的区别,主要体现在定义,初始化,销毁,自动增长

  • 查找,赋值操作是差不多的

  • 重载的方式来实现动态分配的

定义

image-20210329105631040
typedef struct{
    int *data;
    int length; //当前长度
    int maxsize; //最大容量
}Dynamiclist;

初始化

void initDynamicList(Dynamiclist & l){
    l.data=(int *)malloc(sizeof(int) * MAXSIZE);
    if(!l.data){
        cout <<"分配失败" <<endl;
    }
    
    for(int i=0;i<MAXSIZE;i++){ 
        l.data[i]=0;
       
    }
    l.length=0;
    l.maxsize=MAXSIZE;

}

销毁

为了健壮性,最后再令其为空指针

bool destroyList(Dynamiclist  &l){
    free(l.data);
    l.length=0;
    l.maxsize=0;
    l.data=NULL;
    if(!l.data){
        return true;
    }
    return false;
}

增长

image-20210415110409804

用类似数组的方式

void increaseList(Dynamiclist &l,int n){
    int * p =l.data;
    l.data=(int *)malloc(sizeof(int)*(l.maxsize+n));
    for(int i=0;i<l.length;i++){ //改变的是data length还没变
        l.data[i]=p[i];

    }
    l.maxsize+=n;
    free(p);

}

插入元素

当长度满了的时候,自动扩增指定长度的

bool insertList(Dynamiclist & l,int n,int number){
    if(n<0||n>l.length+1){
        cout <<"下标有误" <<endl;
        return false;
    }
    if(l.length>=l.maxsize){
        //自动增长长度 MAXSIZE
        increaseList(l,MAXSIZE);
    }
    for(int i=l.length;i>=n;i++){
        l.data[i]=l.data[i-1];
    }
    l.data[n-1]=number;
    l.length++;
    return true;

}

删除

bool deleteListByOrder(Dynamiclist & l,int n,int &number){
    if(n<0||n>l.length){
        cout <<"下标有误" <<endl;
        return false;
    }

    number=l.data[n-1];
    for(int i=n;i<l.length;i++){
        l.data[i-1]=l.data[i];
    }
    l.length--;
    return false;
}

查找

注意这里的数组形式,因为分配的时候,malloc(int)长度为单位的,用数组[]内部会自动转换成地址加长度,即下一个

int findElementByOrder(Dynamiclist  l,int n){
    return l.data[n-1];
}

int findElementByValue(Dynamiclist  l,int num){
    for(int i=0;i<l.length;i++){
        if(l.data[i]==num){
            return i+1;
        }
    }
    return -1;
}

其他

void printList(Dynamiclist  l){
    for(int i=0;i<l.length;i++){
        cout << "第" << i+1 << "个元素是" <<l.data[i] <<endl;
    }
}

int lengthOfList(Dynamiclist l){
    return l.length;
}

bool isEmpty(Dynamiclist l){
    if(!l.length){
        return true;
    }
    return false;
}

结果

代码测试

void test_dy(){
    Dynamiclist l;
    initDynamicList(l);

    //表空
    if(isEmpty(l)){
        cout <<"表空" <<endl;

    }

    if(insertList(l,1,0)){
        cout <<"插入成功" <<endl;
    }
    //循环插入9个数
    for(int i=1;i<10;i++){
        insertList(l,i+1,i);
    }
    printList(l);

    //插入十个数后自动增长,不会报错
    insertList(l,11,11);

    cout <<"表长为" <<lengthOfList(l) <<endl;

    //查找5
    cout <<"5的位序是" <<findElementByValue(l,5) <<endl;

    //查找位置6
    cout <<"位置6的是" <<findElementByOrder(l,6) <<endl;

    //删除位置6
    int num;
    deleteListByOrder(l,6,num);
    cout <<"删除的是" <<num<<endl;
    printList(l);

    //销毁
    destroyList(l);
    cout <<"表空?"<<isEmpty(l)<<endl; 

结果

表空
插入成功    
第1个元素是0
第2个元素是1
第3个元素是2
第4个元素是3
第5个元素是4
第6个元素是5
第7个元素是6
第8个元素是7
第9个元素是8
第10个元素是9
表长为11
5的位序是6
位置6的是5
删除的是5
第1个元素是0
第2个元素是1
第3个元素是2
第4个元素是3
第5个元素是4
第6个元素是6
第7个元素是7
第8个元素是8
第9个元素是9
第10个元素是11
表空?1
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值