第二章 线性表-----顺序表

本文深入解析了静态与动态顺序表的存储结构、初始化、插入、删除等关键操作,并提供了具体的算法实现步骤。针对动态顺序表,特别介绍了如何进行空间扩容以支持更多的数据元素。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

数据元素的地址计算公式:L(ai)=L(a1)+(i-1)*c (c为一个数据元素所占的存储量。)
顺序表结构图。
在这里插入图片描述

1静态顺序存储结构

//顺序表的静态存储结构。 
#define MaxSize 80 
typedef struct{
	ElemType elem[MaxSize];
	int length;//当前表的长度。 
}Sqlisttp;
//静态线性表的初始化 
status InitList(Sqlisttp&L){
	L.length=0;
	return 0;
}
//静态顺序表上实现插入操作。
status ListInsert_sqtp(SqListtp&L,int i,ElemType e){
	if(i<1||i>L.length) return ERROR;//i值不合法 ,i指的是第几个元素。(1<=i<=L.length; 
	if(L.length>=MaxSize) return OVERFLOW;//当前存储空间已满。
	for(j=L.length;j>=i-1;--i){
		L.elem[j+1]=L.elem[j];
	} 
	L.elem[i-1]=e;
	++L.length;
	return ok;
}
//插入操作的基本步骤,
//检测
//后移
//插入
//修正表长(表长加1) 

2动态顺序表存储结构

//动态顺序存储结构的描述。

#define LIST_INIT_SIZE 100// 线性表存储空间的初始分配量
#define LISTCREAMENT 10 //   线性表存储空间的分配增量
typedef struct{
	ElemType*elem;//存储空间基址
	int length;//当前长度
	int listsize;//当前分配的存储容量(以sizeof(ElemType)为单位) 
}SqList;

//动态线性表的初始化。

status InitList(SqList&L){
	L.elem=(ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));
	if(!L.elem) exit(OVERFLOW);//存储分配失败 
	L.length=0;//空表长度为0 
	L.listsize=LIST_INIT_SIZE;//初始存储容量。 
	return ok; 
}

//动态顺序表的插入
在这里插入图片描述

ListInsert_sq(&L,i,e);
//动态顺序表L中第i个元素ai前插入一个值为e的元素,其中1<=i<=L.length+1  
 
主要操作步骤及其实现方法。
![在这里插入图片描述](https://img-blog.csdnimg.cn/20190401160805202.png)
1.检测(判断参数i是否合理即及空间是否满)。
i)  i<1 ||i>L.length+1
ii)  L.length>=L.listsize   则空间已满,需要增加分配空间。
2.后移(插入位置及之后的所有元素后移一位。)
q=&(L.elem[i-1]);//q指示插入位置。 
for(p=&(L.eleme[L.length-1]);p>=q;--p){
 	*(p+1)=*p;//后移一位。 
}

3.插入(将元素插入到指定位置上)
*q=e;//插入e
4.修正表长(表长加+1)
++L.length;//表长增1;
实现算法。

status ListInsert_sq(SqList&L,int i,ElemType e){
	if(i<1||i>L.length+1) return ERROR;
 	if(L.length>=L.listsize){
	 	newbase=(ElemType*)realloc(L.elem,(listsize+LISTINCRENMENT).sizeof(ElemType));
	 	if(!newbase) exit(OVERFLOW);
	 	L.elem=L.newbase;
	 	L.listsize+=LISTCREAMENT;
	 }
	 q=&(L.elem[i-1]);
	 for(p=&(L.elem[L.length-1]);p>=q;--p){
 		*(p+1)=*p;
 	} 
 	*q=e;
 	++L.length;
 	return ok;
}

//顺序表的删除。
ListDelete_sq(SqList&L,int i,ElemType &e)
动态顺序表L中删除第i个元素ai,并返回e, (1<=i<=n):
在这里插入图片描述
操作步骤及其实现
1.检测(判断参数i是否合理)
i<1||i>L.length,删除位置不合理,算法结束。
2.前移(删除元素之后的所有元素前移一位).
p=&(L.elem[i-1]);//p指示删除位置
e=*p;//用e返回被删元素的值。
q=&(L.elem[L.length-1];//p指示表尾位置。
for(++p;p>=q;++p){
*(p-1)=*p;
}

实现算法:

status ListDelete_sq(SqList&L,int i,ElemType&e){
	if(i<l||i>L.length) return ERROR;
	p=&(L.elem[i-1]);
	e=*p;//记录被删除元素的值。
	q=&(L.elem[L.length-1]);
	for(++p;p<=q;++p){
		*(p-1)=*p;
	}
	--L.length;
	return ok; 
}

题目:有序顺序表中删除所有重复数据元素的算法。

status delSqList(SqList &L){
	i=0;
	while(i<L.length-1){
		if(L.elem[i-1]==L.elem[i+1]){
			for(j=i+1;j<L.length;j++){
				L.elem[j-1]=L.elem[j]; 
			}
			--L.length;//修正表长。 
		}else{
			i++;
		}
	}
	return ok;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值