顺序表的插入,删除,按值查找操作
顺序表的插入,删除,按值查找操作
-
线性表的顺序存储又称为顺序表。顺序表的特点是表中元素的逻辑顺序和其物理顺序相同,我的理解就是在内存中找到一块空地,就像平时占座一样,先占住一块连续的地(室友嘛,肯定要坐一块),然后把相同的数据类型依次往里面放,(但不一定坐满,毕竟你占了,室友也不一定来~~)C语言的一维数组就是实现了顺序结构的存储。但要注意以下几点:
-
线性表的长度不一定等于数组的长度,但是一定小于等于数组的最大长度,即length <= MAXSIZE
-
线性表的长度就是数据元素的个数,它会随着插入删除操作会变化,而数组可能是静态分配或者动态分布的,静态分布时,一旦空间被占满,再加入新的数据将会溢出,动态分配时,一旦空间被占满,就可以另外开辟新的更大的存储空间(这点我不是很理解,我记得java中ArrayList底层也是以数组的形式来实现的,若需要扩容,就是原始容量右移再加自身容量,相当于扩为原来的1.5倍,那是创建了一个新的数组?)
-
线性表是从1开始计数的,而数组下标是从0开始的!
c语言初始动态分配语句为:
L.data = (ElemType *) malloc (sizeof(ElemType)*IniteSize) ;
笔记:
- L.data 是动态分配数组的指针
- sizeof(ElemType)*IniteSize 是每个元素的长度成语初始的长度,值为malloc(size)的参数
- malloc分配的内存大小至少为size参数所指定的字节数,其返回值是一个指针,指向可用内存的起始地址
- ElemType *声明其为ElemType (元素类型)类型的指针
(1)插入操作
bool ListInsert (SqLIst &L ,int i,ElemType e){
if(i < 1 || i > L.length +1) //有可能插在最后一个元素的后面``
return false;
if(L.length >= MaxSize)
return false;
for(int j = L.length ; j >= i ; j--) //模拟下句语句执行可知道 j >=i
//data[length -1]到data[i -1] ——> data[length]到data[i ]
L.data[j] = L.data[j-1]; //往下标大的位置移动
L.data[j-1] = e; //先往后移再插入
L.length ++;
return true;
}
(2)删除操作
bool ListInsert (SqLIst &L ,int i,ElemType &e){
if(i < 1 || i > L.length )
return false;
e =L.data[j-1] ; //先删除再移动
for(int j=i; j < L.length ; j++) //模拟下句语句执行可知道 j <= L.length-1
//data[i]到data[length -1] ——> data[i-1]到data[length-2]
L.data[j-1] = L.data[j]; //往下标小的位置移动
L.length --;
return true;
}
(额,for循环中具体加不加等于号,我还是用画图模拟其执行过程来解决吧)(3)按值查找
bool ListInsert (SqLIst L ,ElemType e){
int i;
for(i = 0; i <L.length;i++)
if (L.data[i] == e)
return i+1;
return 0;
}