当前位置: 首页 > article >正文

数据结构(三)链表

链表的概念及结构

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

链表的分类

实际中链表的结构非常多样,以下情况组合起来就有8种链表结构:

1. 单向或者双向

2. 带头或者不带头

3. 循环或者非循环

虽然有这么多的链表的结构,但是我们实际中最常用还是两种结构:

1.无头单向非循环链表

结构简单,一般不会单独用来存数据。实际中更多是作为其他数据结构的子结 构,如哈希桶、图

的邻接表等等。另外这种结构在笔试面试中出现很多

2.带头双向循环链表

结构最复杂,一般用在单独存储数据,实际中使用的链表数据结构,都是带头双向循环链表

另外这个结构虽然结构复杂,但是使用代码实现以后会发现结构会带来很多优势,实现反而简单

链表的实现

无头单向非循环链表的实现

// 1、无头+单向+非循环链表增删查改实现
typedef int SLTDateType;
typedef struct SListNode
{
 SLTDateType data;
 struct SListNode* next;
}SListNode;
// 动态申请一个节点
SListNode* BuySListNode(SLTDateType x);
// 单链表打印
void SListPrint(SListNode* plist);
// 单链表尾插
void SListPushBack(SListNode** pplist, SLTDateType x);
// 单链表的头插
void SListPushFront(SListNode** pplist, SLTDateType x);
// 单链表的尾删
void SListPopBack(SListNode** pplist);
// 单链表头删
void SListPopFront(SListNode** pplist);
// 单链表查找
SListNode* SListFind(SListNode* plist, SLTDateType x);
// 单链表在pos位置之后插入x
// 分析思考为什么不在pos位置之前插入?
void SListInsertAfter(SListNode* pos, SLTDateType x);
// 单链表删除pos位置之后的值
// 分析思考为什么不删除pos位置?
void SListEraseAfter(SListNode* pos);

带头双向循环链表的实现

// 2、带头+双向+循环链表增删查改实现
typedef int LTDataType;
typedef struct ListNode
{
 LTDataType _data;
 struct ListNode* next;
 struct ListNode* prev;
}ListNode;
// 创建返回链表的头结点.
ListNode* ListCreate();
// 双向链表销毁
void ListDestory(ListNode* plist);
// 双向链表打印
void ListPrint(ListNode* plist);
// 双向链表尾插
void ListPushBack(ListNode* plist, LTDataType x);
// 双向链表尾删
void ListPopBack(ListNode* plist);
// 双向链表头插
void ListPushFront(ListNode* plist, LTDataType x);
// 双向链表头删
void ListPopFront(ListNode* plist);
// 双向链表查找
ListNode* ListFind(ListNode* plist, LTDataType x);
// 双向链表在pos的前面进行插入
void ListInsert(ListNode* pos, LTDataType x);
// 双向链表删除pos位置的节点
void ListErase(ListNode* pos);

顺序表和链表的区别

存储空间上 

顺序表:物理上一定连续 

链表:逻辑上连续,但物理上不一定连续

随机访问

顺序表:支持:O(1)

链表:不支持:O(N)

任意位置插入或者删除元素

顺序表:可能需要搬移元素,效率低O(N)

链表:只需修改指针指向

插入

顺序表:动态顺序表,空间不够时需要扩 容

链表:没有容量的概念

应用场景

顺序表:元素高效存储+频繁访问

链表:任意位置插入和删除频繁

缓存利用率

顺序表:

链表:

备注:缓存利用率参考存储体系结构以及局部原理性


http://www.kler.cn/a/570502.html

相关文章:

  • 使用 CodeMirror 6 和 React 构建一个支持只读模式的 JSON 编辑器
  • 基于QSSH开源库实现SSH远程连接和SFTP文件传输
  • DeepSeek集成到VScode工具,让编程更高效
  • 玩转python: 几个案例-掌握贪心算法
  • 基于AT89C52单片机的停车场车位管理系统
  • VsCode + EIDE + OpenOCD + STM32(野火DAP) 开发环境配置
  • doris:阿里云 DLF
  • PyTorch 中使用多进程实现增量训练
  • 使用cursor ai 开发 UniApp JSON 工具开发文档
  • 第十四届蓝桥杯:(二分算法)字串简写
  • 【MySQL】CAST()在MySQL中的用法以及其他常用的数据类型转换函数
  • 【部署】Docker Compose 指令备忘清单(超级详细!)
  • docker拉取乌班图并且ssh连接
  • C++小课堂——变量的声明,赋值和初始化
  • Redis是什么?如何使用Redis进行缓存操作?
  • Powershell和BTEQ工具实现带多组参数和标签的Teradata数据库批量数据导出程序
  • 深度学习-13.深度强化学习:深度 Q 学习
  • 【网络编程】之TCP通信步骤
  • 基础篇——深入解析SQL多表操作与关联查询:构建复杂数据关系的桥梁
  • 《解锁HarmonyOS NEXT高阶玩法:艺术图像识别功能开发全攻略》