顺序表、链表

目录

1.线性表

2.顺序表

3.链表

4.顺序表和链表的区别

1.线性表

线性表是一种在实际中广泛应用的数据结构,常见的线性表有顺序表、链表、栈、队列、字符串等......

线性表在逻辑上是线性结构,也就是说是连续的一条直线。但在物理结构上不一定连续,线性表在物理上存储时通常以数组和链式结构的形式存储。

2.顺序表

2.1概念及分类

顺序表是在计算机内存中以数组的形式保存的线性表,线性表的顺序存储是指用一组地址连续的存储单元依次存储线性表中的元素、使得线性表中在逻辑结构上相邻的数据元素存储在物理存储单元中,即通过数据元素物理存储的相邻关系来反映数据元素之间逻辑上的相邻关系,采用顺序存储结构的线性表通常称为顺序表。

根据数组位置不同,顺序表一般分为:

1.静态顺序表:使用定长数组存储元素

2.动态顺序表:使用动态开辟的数组存储

2.2动态顺序表的接口实现

顺序表只适用于确定知道需要存多少数据的场景。静态顺序表的定长数组导致N定大了,空间开辟多了浪费,开辟少了不够用。所以现实中基本都是用动态顺序表,根据需要动态的分配空间大小。

顺序表的实现:


typedef int SLDataType;

//顺序表的动态存储

typedef struct SeqList
{
	SLDataType* arr;指向动态开辟的数组
	size_t size; //有效数据个数
	size_t capacity;//容量空间大小
}SeqList;

//基本增删查改接口
//顺序表初始化
void SeqListInit(SeqList* ps);

//检查空间,如果满了,进行扩容
void CheckCapacity(SeqList* ps1);

//顺序表尾插
void SeqListPushBack(SeqList* ps1, SLDataType x);

//尾删
void SeqListPopBack(SeqList* ps1);

//头插
void SeqListPushFront(SeqList* ps1, SLDataType x);

//头删
void SeqListPopFront(SeqList* ps1);

//顺序表查找
void SeqListFind(SeqList* ps1, SLDataType x);

//在pos位置插入x
void SeqListInsert(SeqList* ps1, size_t pos, SLDataType x);

//删除pos位置的值
void SeqListErase(SeqList* ps1, size_t pos);

//顺序表销毁
void SeqListDestroy(SeqList* ps1);

//打印
void SeqListPrint(SeqList* ps1);

3.链表

3.1概念及结构

链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。

3.2分类

3.2.1单向或双向

3.2.2带头或不带头

3.2.3循环或非循环

虽然有很多链表的结构,但是实际中最长用的就两种:

1. 无头单向非循环链表:结构简单,一般不会单独用来存数据。实际中更多是作为其他数据结构的子结 ,如哈希桶、图的邻接表等等。另外这种结构在笔试面试中出现很多。

2. 带头双向循环链表: 结构最复杂 ,一般用在单独存储数据。实际中使用的链表数据结构,都是带头双向
循环链表。另外这个结构虽然结构复杂,但是使用代码实现以后会发现结构会带来很多优势,实现反而
简单了,后面我们代码实现了就知道了。
3.3链表的实现

//无头、单向、非循环链表增删查改的实现

typedef int SLTDataType;
typedef struct SListNode
{
	SLTDataType data;
	struct SListNode* next;
}SListNode;

//动态申请一个节点
SListNode* BuySListNode(SLTDataType x);

//单链表打印
void SListPrint(SListNode* plist);

// 单链表尾插
void SListPushBack(SListNode** pplist, SLTDataType x);

// 单链表的头插
void SListPushFront(SListNode** pplist, SLTDataType x);

// 单链表的尾删
void SListPopBack(SListNode** pplist);

// 单链表头删
void SListPopFront(SListNode** pplist);

// 单链表查找
SListNode* SListFind(SListNode* plist, SLTDataType x);

// 单链表在pos位置之后插入x
// 分析思考为什么不在pos位置之前插入?
void SListInsertAfter(SListNode* pos, SLTDataType x);

// 单链表删除pos位置之后的值
// 分析思考为什么不删除pos位置?
void SListEraseAfter(SListNode* pos);

4.顺序表和链表的区别

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值