线性表的增删——数据结构

线性表的结构体:

typedef struct{

            elemType*   elem;

             int          length;

             int          listSize;

}

在数据结构中线性表的创建or初始化:

主要用到:     L.elem=(elemType*)malloc(List.Size   *    sizeof(elemType));

作用为开辟新空间;

将之完整化,就是将可能出现的意外情况考虑进去——也就是万一存储空间过小,造成了数据的溢出;  以及一些线性结构体的其它特征考虑进去——长度和 存储容量。

Status InitList_Sq(Sqlist  & L)

{

        L.elem=(elemType*)malloc(List.Size   *    sizeof(elemType));

        if(!L. elem)      exit(OVERFOLLOW);

        L . length=0;

        L.listSize=List.Size;

}

线性顺序表的存储结构,通过位置的相邻来体现逻辑顺序。

因此在数据的相互位置上比较稳定,较为简单。但是也就给数据的增删带来了不必要的麻烦。

就如同一根水管,你想要得到热水,你也必须等到水管前面一节中的冷水流出后才能够得到想要的热水。

在线性顺序表的增加元素上

如果在第  i   个位置上增添一个元素。但是不能覆盖原来的数据,就必须将后面的每个元素依依后置一位,为新增的元素让出位置,在将新元素放入座位中。

so    增加总的分为2部,1、让位(移)2、填。   ——显然主要复杂在移位。

算法的最主要步骤是:通过2个指针,一个指针指向需要增加的数据(插入位置)。  另外一个指向队列之后的数,让其移位。

q=L.elem[i-1]/ /          插入到第  i 位置,实际在数组中是插到下标为  i-1的位置上。

for(p=&(L.elem[L.length-1];p>=q;p--)

                    *(p+1) = *p;  //后移一位

*q=e;  //插入数据

++length  //长度加一

但是要考虑到溢出的状态

因此在移动之前要进行判断和处理:

if(L.length>=L.listSize){

                newbase=(elemType*)realloc(L.listSize+new)*sizeof(elemType));

                L.elem=newbase;

                L. listSize+=new;

}



数据的删除道理同样:

相比之下更为简单。


一个指针指向需要删除的数据点,另外一个指针指向需要指向终点在哪里,知道到底移动的界限在哪里。


P=&(L.elem[i-1]);

q=&(L.elem+L.length-1);

for(++p;p<=q;p++)      *(p-1)=*p;

L.length--;

}



  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值