线性表的顺序存储实现

前言

线性表的顺序存储及基本操作的实现


一、线性表

线性表(List)是由同类型数据元素构成有序序列的线性结构,用户处理线性表数据时常常需要初始化、查找、插入、删除、计算数据长度等操作。

线性表还包含以下几个要素:

表中元素个数称为线性表的长度

线性表没有元素时,称为空表

表的起始位置称表头 ,表的结束位置称表尾

数据Data利用数组存储,利用下标使得查找 等操作十分方便。Last始终存储最后一个元素的数组下标,可以用于判断数组长度。在初始化时,Last的值为-1。

复制代码
typedef struct LNode*List;
struct LNode{
	ElementType Data[MAXSIZE];  //利用数组的连续存储空间顺序存放线性表的各元素 
	int Last;         //指向最后一个元素
};
struct LNode L;
List PtrL;

二、操作集

线性表的基本操作包括:

c 复制代码
List MakeEmpty(); //初始化一个空线性表 
ElementType KFind(int K,List L); //根据位序K,返回相应元素 
int Find(ElementType X,List L); //在线性表L中查找X第一次出现的位置 
void Insert(ElementType X,int i,List L); //在位序i前插入一个新元素X 
void Delete(int i,List L); //删除指定位序i的元素 
int Length(List L); //返回线性表L的长度 

基本操作的实现

1.初始化:

复制代码
List MakeEmpty()
{
	List PtrL;
	PtrL = (List)malloc(sizeof(struct LNode));
	PtrL->Last = -1;
	
	return PtrL;
}

创建一个空线性表并返回其指针。

2.查找

复制代码
int Find(ElementType X,List PtrL)
{
	int i = 0;
	while(i <= PtrL->Last && PtrL->Data[i] != X)
		i++;
	if(i > PtrL->Last)   //如果没找到,返回-1
		return -1;
	else
		return i;
}

3.插入

复制代码
void Insert(ElementType X,int i,List PtrL)
{
	int j;
	if(PtrL->Last == MAXSIZE - 1)    //表满,无法插入 
	{
		printf("表满\n");
		return ;
	}
	if(i < 1 || i > PtrL->Last+2)    //检查插入位置合法性 
	{
		printf("插入位置不合法\n");
		return ;
	}
	for(j = PtrL->Last;j >= i-1;j--)
		PtrL->Data[j+1] = PtrL->Data[j];
	PtrL->Data[i-1] = X;
	PtrL->Last++;
}

4.删除

复制代码
void Delete(int i,List PtrL)
{
	int j;
	if(i < 1 || i > PtrL->Last + 1) //检查空表及删除位置的合法性 
	{
		printf("不存在第%d个元素\n",i);
		return ;
	}
	for(j = i;j < PtrL->Last;j++)
		PtrL->Data[j-1] = PtrL->Data[j];
	PtrL->Last--;
} 

三、应用举例

我们以多项式的存储为例:

要表示一元多项式

我们就需要分别存储每一项的次数 i 及其对应的系数 ,有时候需要知道其所含的项数(非零项)。

法1:顺序结构直接存储 我们可以用数组下标 i 表示次数,数组元素Arri 表示该项系数:

而用一般数组存储的弊端就在于数组的下标是一定的,如果不含该次项,我们就只能在其对应的位置填0,并且如果想要知道这个多项式含有几个非零项就只能通过遍历来实现,但实质上我们只需要存储非零项的次数和系数 。

法2:顺序结构存储非零项 我们可以利用结构体数组,定义两个分量分别存储次数 i 和 系数

这样就大大节省了存储所需的空间,我们只需要定义两个指针分别对应系数和指数两个数组,就可以在一个循环里表示出所有非零项,在对两个多项式运算时(加减乘除),只需要在遍历时对两个结构体表示指数的数组进行检查,构造一个新的结构数组表示运算结果即可。

复制代码
struct P{
    int coef;  //存储系数coefficient
    int expon; //存储指数exponent
}P1[n];
//一个结构体是一个非零项
//数组P1[n]表示一个包含n个非零项的多项式P1

以上两种方法都是基于数组存储多项式这一线性结构的


例图及思路来源于浙江大学《数据结构》MOOC,该系列文章为题主学习课程的总结笔记

相关推荐
YaraMemo38 分钟前
元启发式算法框架
人工智能·算法·5g·信息与通信·启发式算法·信号处理
weixin_307779131 小时前
一维无粘 Burgers 方程的激波形成问题:MacCormack 格式求解
c++·算法·matlab
HugoStudio_SWAN1 小时前
洛谷 B4500 / B4449 / B3843 凯撒密码、密码强度与密码合规——加密与安全的三道门
c++·学习·程序人生·算法·安全
枫叶林FYL2 小时前
【群体智能集群控制工程实践】第3章 一致性协同算法
算法
禹凕3 小时前
滑动窗口算法实战指南
python·算法
DisonTangor3 小时前
【腾讯混元雪耻归来】 Hy4 preview:770B 参数 MoE 旗舰模型,1M 上下文全面开源
人工智能·算法·开源·aigc·腾讯云·腾讯云ai代码助手
明月_清风4 小时前
从二叉树到 B+ 树:一文搞懂工程中「树」的演化之道
数据结构·算法·go
渡我白衣4 小时前
并查集:基础认识与模拟实现
android·java·javascript·数据结构·c++·算法·并查集
hetao17338374 小时前
2026-09-01~09-04 hetao1733837 的刷题记录
c++·算法
Evand J5 小时前
【MATLAB例程,图像滤波5】 反谐波均值滑动窗口滤波(CHMF)图像降噪与质量评价,附代码下载链接
图像处理·算法·计算机视觉·matlab·均值算法·滑动窗口滤波·均值滑动