顺序表的插入,删除,按值查找操作

顺序表的插入,删除,按值查找操作

  • 线性表的顺序存储又称为顺序表。顺序表的特点是表中元素的逻辑顺序和其物理顺序相同,我的理解就是在内存中找到一块空地,就像平时占座一样,先占住一块连续的地(室友嘛,肯定要坐一块),然后把相同的数据类型依次往里面放,(但不一定坐满,毕竟你占了,室友也不一定来~~)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; 		
}