数据结构 ---- 顺序表

前言

经过一年的奋斗,作为软件工程的考生,依然参加完了考研初试,在准备复试的这段时间里,我很想把自己这段时间所学的知识整理出来,方便分享与记录,这一个篇章,我将专门介绍数据结构

系列文章目录

第一章 顺序表的线性表示


前言

数据结构是计算机科学中的一个重要概念,指的是组织和存储数据的方式。简单来说,它是一种数据的组织方式,可以帮助程序员更高效地存储和处理数据。不同的数据结构适用于不同的应用场景,例如栈、队列、链表、树、图等。数据结构的设计旨在优化时间和空间复杂度,使得程序的执行效率更高。
数据结构可以分为两类:线性结构和非线性结构。线性结构中的数据按照一定的顺序依次排列,例如数组、链表、队列和栈。非线性结构中的数据没有固定的顺序,它们之间的关系可能是任意的,例如树和图。
数据结构的选择取决于所要解决的问题。例如,如果需要在一组数据中查找一个值,那么可以使用数组或链表。如果需要实现先进先出的数据结构,那么可以使用队列。如果需要实现后进先出的数据结构,那么可以使用栈。
在软件开发中,数据结构是非常重要的,它们可以帮助程序员更好地组织和管理数据,提高程序的性能和可维护性。因此,学习和理解数据结构是程序员必备的技能之一。


一、顺序表是什么?

顺序表是一种线性表数据结构,它将数据元素顺序地存储在一段连续的存储区域内。顺序表可以通过下标随机访问其中的任何一个元素,因此访问速度较快。顺序表的实现通常使用数组来进行存储,因此它具有随机访问的优势,但插入和删除操作需要移动大量元素,因此效率较低。
顺序表的特点包括:

内存连续:顺序表中的元素在内存中是连续存储的,因此可以通过下标随机访问任意一个元素。

长度固定:顺序表的长度固定,一旦创建后就无法改变,如果需要增加或删除元素,需要重新创建一个更大或更小的顺序表。

随机访问快:由于顺序表的元素在内存中是连续存储的,因此可以通过下标随机访问任意一个元素,访问速度较快。

插入和删除慢:由于顺序表的元素在内存中是连续存储的,插入和删除操作需要移动大量元素,因此效率较低。
顺序表适用于需要随机访问元素的场景,例如需要快速查找某个元素或根据下标访问元素的场合。但如果需要频繁地插入或删除元素,则不适合使用顺序表。

二、结构体的定义

#define MaxSize 50
typedef int ElemType;
//静态分配
typedef struct{
	ElemType data[MaxSize];
	int length;//当前顺序表中有多少个元素
}SqList;
//动态分配
#define InitSize 100
typedef struct{
	ElemType *data;
	int capacity;//动态数组的最大容量
	int length;
}SeqList;

1.插入数据

代码如下(示例):

//i代表插入的位置,从1开始,e要插入的元素
bool ListInsert(SqList &L,int i,ElemType e)
{
	if(i<1||i>L.length+1)//判断要插入的位置是否合法
		return false;
	if(L.length>=MaxSize)//超出空间了
		return false;
	for(int j=L.length;j>=i;j--)//移动顺序表中的元素
		L.data[j]=L.data[j-1];
	L.data[i-1]=e;//数组下标从零开始,插入第一个位置,访问的下标为0
	L.length++;
	return true;
}

2.删除数据

代码如下(示例):

//删除使用元素e的引用的目的是拿出对应的值
bool ListDelete(SqList &L,int i,ElemType &e)
{
	if(i<1||i>L.length)//如果删除的位置是不合法
		return false;
	e=L.data[i-1];//获取顺序表中对应的元素,赋值给e
	for(int j=i;j<L.length;j++)
		L.data[j-1]=L.data[j];
	L.length--;//删除一个元素,顺序表长度减1
	return true;
}

2.查找数据,返回位置

代码如下(示例):

//查找成功,返回位置,位置从1开始,查找失败,返回0
int LocateElem(SqList L,ElemType e)
{
	int i;
	for(i=0;i<L.length;i++)
		if(L.data[i]==e)
			return i+1;//加1就是元素在顺序表中的位置
	return 0;
}

3.打印顺序表元素

代码如下(示例):

//打印顺序表元素
void PrintList(SqList &L)
{
	for(int i=0;i<L.length;i++)
	{
		printf("%4d",L.data[i]);
	}
	printf("\n");
}

注意

如上文,我们有两种方法来定义顺序表,在内存中,用动态分配的顺序表存储在堆空间,而用数组定义的顺序表存储在栈空间,因此要十分注意空间的分配与释放。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

popcorn_min

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值