数据结构(一)——顺序表

线性表——顺序表

线性表概念

​ 线性表是一种最基本、最简单、也是最常用的一种数据结构。一个线性表是 n 个具有相同特性的数据元素的有限序列。线性表中数据元素的对应关系是一对一,第一个元素没有直接前驱元素,最后一个元素没有直接后继元素,其他的元素都有唯一的前驱和后继元素。

顺序表

​ 顺序表是指在内存中以数组的形式保存的线性表,用一组地址连续的存储单元依次存储线性表中的元素,使逻辑结构相邻的两个元素存储在相邻的物理存储单元中,即顺序存储结构。

顺序表定义

​ MAXSIZE 为顺序表的最大允许存放多少个元素

​ 定义顺序表的结构体变量,data 代表存放元素值的数组,因为数组中每个相邻元素在内存中的物理地址也是相邻的,length 表示顺序表中现有元素的个数,即顺序表的长度

#define MAXSIZE 10

typedef struct
{
	int data[MAXSIZE];
	int length;
}Seqlist;

顺序表初始化

​ 初始化的过程就是内存中申请了顺序表结构体的资源后,将顺序表的长度设置成 0,即新生成的空的顺序表,需要传入顺序表结构体的指针作为参数

void Initlist(Seqlist* s)
{
	s->length = 0;
}

判断顺序表是否为空

​ 判断顺序表是否为空的过程就是取出结构体中 length 的值,检测其是否为 0

int Listempty(Seqlist* s)
{
	if (s->length == 0)
		return 1;
	else
		return 0;
}

按照元素索引查找元素

​ 按照元素索引查找元素,首先需要检测输入的 index 是否合法,如果输入合法,即取出该索引位置的元素值并返回 1,不合法就返回 0

int Searchforindex(Seqlist* s, int index, int* e)
{
	if (index < 0 || index >= s->length)
		return -1;
	*e = s->data[index];
	return 1;
}

按照元素值查找元素

​ 使用 for 循环遍历结构体中存放元素值的数组,使传入的值与数组中的值一一比对,成功返回 1,失败返回 0

int Searchfordata(Seqlist* s, int d)
{
	for (int i = 0; i < s->length; i++)
	{
		if (d == s->data[i])
			return i;
	}
	return 0;
}

在指定索引位置插入元素

​ 首先检测 index 是否合法,再判断顺序表是否已满,满就返回 1,符合就给索引位置的数组元素赋值,并使顺序表长度 +1 后返回 1

int Insertlist(Seqlist* s, int index, int d)
{
	if (index < 0 || index > s->length)
		return -1;
	else if (s->length == MAXSIZE)
	{
		return 0;
	}
	s->data[index] = d;
	s->length++;
	return 1;
}

删除指定索引位置的元素

​ 同样先检测 index,非法返回 -1,然后通过 for 循环将 index 位置后(包括 index)的元素全部前移一位来确保顺序表的连续性,length - 2 的意思:如果顺序表是满状态,最后一位元素的 index 是 length - 1,删除一位之后只需要执行道 length - 2 的元素就可以实现元素前移,最后将 length - 1 并返回 1

int Deletelist(Seqlist* s, int index)
{
	if (index < 0 || index > s->length)
		return -1;
	else
	{
		for (int i = index; i < s->length - 2; i++)
		{
			s->data[i] = s->data[i + 1];
		}
		s->length--;
		return 1;
	}
}

总结

(一)优点:无须关心表中元素之间的关系,所以不用增加额外的存储空间;可以快速地取表中任意位置的元素。

(二)缺点:插入和删除操作需要移动大量元素。使用前需事先分配好内存空间,当线性表长度变化较大时,难以确定存储空间的容量。分配空间过大会造成存储空间的巨大浪费,分配的空间过小,难以适应问题的需求。

发布了38 篇原创文章 · 获赞 44 · 访问量 3437

猜你喜欢

转载自blog.csdn.net/scfor333/article/details/103210653