线性表的结构体:
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--;
}