数据结构之C语言实现线性表的顺序表示(学习笔记)

一、顺序表的定义

顺序表:线性表的顺序存储结构,指的是用一段地址连续的存储单元依次存储线性表的数据元素,使得逻辑上相邻的元素在物理位置上也相邻。

数据结构之C语言实现线性表的顺序表示(学习笔记)_第1张图片

二、顺序表的插入与删除

首先做好准备工作

#define true 1
#define false 0
#define MAXSIZE 20 /*顺序表的最大容量*/
typedef int ElemType; /*ElemType类型根据实际情况而定,这里假设为int*/
typedef int Status;/*Status 是函数的类型,其值是函数结果状态代码*/
typedef struct{
ElemType data[MAXSIZE]; /*数组存储数据元素*/
ine length;   /*线性表当前长度*/
}SqList;
1.插入算法思路

1.如果插入位置不合理,抛出异常
2.如果线性表长度大于等于数组长度,则抛出异常或动态增加容量
3.从最后一个元素开始遍历到第i个位置,分别将它们都向后移动一个位置
4.将要插入元素填入位置i处
5.表长加1

注意:插入位置的i是相对顺序表来说的,对应的数组下标是i-1
代码实现
/*初始条件:顺序表L已存在*/
/*操作结果:在L中第i个位置之前插入新的数据元素e,L的长度加1*/
Status ListInsert(SqList *L,int i,ElemType e)
{
	if(L->length==MAXSIZE) /*顺序表已经满*/
		return false;
	if(i<1||i>L->length+1) /*当插入位置不合法,i是可以插入到最后一个元素后面*/
		return false;
	if(i<=L->length) /*若插入位置不在表尾*/
	{
		for(int j=L->length;j<=i;j--)
			L->data[j]=L->data[j-1];  
		/*顺序表中第i个位置对应数组下标i-1;则数组中的i-1中的元素往后移动,赋值给第i个元素*/
	}
	L->data[i-1]=e; /*将新元素插入*/
	L->length++;
	return true;
}
2.删除算法思路

1.如果删除位置不合理,抛出异常
2.取出删除元素
3.从删除元素位置开始遍历到最后一个元素,分别将它们向前移动一个位置
4.表长减1

注意:删除位置的i是相对顺序表来说的,对应的数组下标是i-1
代码实现
/*初始条件:顺序表L已存在*/
/*操作结果:删除L的第i个数据元素,并用e返回其值,L的长度减1*/
Status ListDelete(SqList *L,int i,ElemType *e)
{
	if(L->length==0)  /*顺序表为空*/
		return false;
	if(i<1||i>L->length) /*删除位置不合法*/
		return false;
	*e=L->data[i-1];
	if(i<L->length) //如果删除的不是最后位置
	{
		for(int j=i;j<L->length;j++)
			L->data[j-1]=L->data[j];
		//顺序表中第i个位置对应数组下标的i-1,则数组中的第i个元素向前移动,赋值给第i-1个元素
	}
	L->length--;
	return true;
}

三、顺序表按值查询

1.按值查询算法思路

1.从顺序表第一个位置开始遍历并与目标值比较直到找到目标值

代码实现
/*初始条件:顺序表L已存在*/
/*操作结果:查找成功返回该值在顺序表中的位置,查找失败则返回0*/
int LocateElem(SqList L,ElemType e)
{
	for(int i=0;i<L->length;i++)
	{
		if(L->data[i]==e)
			return i+1; //顺序表的位置是对应数组下标+1
	}
	return 0;
}

顺序表存储结构的优缺点

优点

无需为表示表中元素之间的逻辑关系而增加额外的存储空间
可以快速地存取表中任一位置的元素

缺点

插入和删除操作需要移动大量元素
当线性表长度变化较大时,难以确定存储空间的容量
造成存储空间的“碎片”

你可能感兴趣的:(笔记)