线性表的顺序存储实现

前言

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


一、线性表

线性表(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,该系列文章为题主学习课程的总结笔记

相关推荐
2501_906565121 小时前
数学之美探究
算法
oier_Asad.Chen1 小时前
【洛谷题解/AcWing题解/OI学习笔记】洛谷P2868【USACO07DEC】Sightseeing Cows G(01分数规划求最大比率)
算法·图论·spfa·二分·负环
leisoo80973 小时前
财报数据怎么排雷本地化Python构建财务异常预警系统
人工智能·python·算法
luj_17685 小时前
塔防牌:策略与卡牌的智慧碰撞
服务器·c语言·开发语言·经验分享·算法
wuyk5555 小时前
3.链表:用指针串联的动态数据结构
c语言·开发语言·数据结构·链表
郝学胜-神的一滴6 小时前
干货版《算法导论》17:二叉树核心原理、遍历逻辑与高阶实操全解
数据结构·c++·python·算法·计算机·编程
爱编程的小新☆6 小时前
【LeetCode】从递归到 Flood Fill:5 道题吃透 DFS 的选择、回溯与标记
java·算法·leetcode·深度优先·回溯·flood fill
Water_Sunzhipeng6 小时前
2024牛客暑期多校训练营1
算法
hetao17338376 小时前
2026-08-09~08-14 hetao1733837 的刷题记录
c++·算法
技术小黑6 小时前
RNN算法实战系列06 | LSTM 实现糖尿病探索与预测
rnn·算法·lstm