数据结构——链表(超详细解读)
创作时间:
作者:
@小白创作中心
数据结构——链表(超详细解读)
引用
CSDN
1.
https://blog.csdn.net/2303_81146519/article/details/142530281
链表是数据结构中一种重要的线性表实现方式,与顺序表相比,链表在插入和删除操作上具有更高的效率。本文将详细介绍链表的基本概念、分类以及单链表的具体实现方法。
一、链表的概念和结构
链表是一种形式上连续,物理空间上可能不连续的结构,就像一个小火车一样。链表通过指针来连接各个节点,每个节点包含数据域和指向下一个节点的指针域。
图中的phead
指针中存放的是第一个节点的地址,根据这个地址可以找到第一个节点,然后通过节点中的指针找到下一个节点,以此类推,直到找到存放空地址的节点。
二、链表的分类
链表的结构多种多样,常见的有以下几种:
- 单向链表
- 双向链表
- 循环链表
- 带头结点的链表
虽然链表结构如此之多,但实际应用中常用的主要是单向链表和双向链表。
三、单链表的实现
单链表是最基本的链表结构,它是一种无头、单向、非循环的链表。
动态申请节点
SListNode* BuySListNode(SLTDateType x)
{
SListNode* newnode = (SListNode*)malloc(sizeof(SListNode));
assert(newnode);
newnode->data = x;
newnode->next = NULL;
return newnode;
}
单链表的插入
- 尾插
void SListPushBack(SListNode** pplist, SLTDateType x)
{
SListNode* newnode = BuySListNode(x);
if (*(pplist) == NULL)
{
*pplist = newnode;
}
else
{
SListNode* tail = *pplist;
while (tail->next != NULL)
{
tail = tail->next;
}
tail->next = newnode;
}
}
- 头插
void SListPushFront(SListNode** pplist, SLTDateType x)
{
SListNode* newnode = BuySListNode(x);
if (*pplist == NULL)
{
*pplist = newnode;
}
else
{
newnode->next = *pplist;
*pplist = newnode;
}
}
单链表的删除
- 尾删
void SListPopBack(SListNode** pplist)
{
assert(*pplist);
if ((*pplist)->next == NULL)
{
free(*pplist);
*pplist = NULL;
}
else
{
SListNode* tail = *pplist;
while (tail->next->next != NULL)
{
tail = tail->next;
}
free(tail->next);
tail->next = NULL;
}
}
- 头删
void SListPopFront(SListNode** pplist)
{
assert(*pplist);
if ((*pplist)->next == NULL)
{
free(*pplist);
*pplist = NULL;
}
else
{
SListNode* next = (*pplist)->next;
free(*pplist);
*pplist = next;
}
}
在指定位置插入和删除
- 在pos位置之后插入
void SListInsertAfter(SListNode* pos, SLTDateType x)
{
assert(pos);
SListNode* newnode = BuySListNode(x);
SListNode* next = pos->next;
pos->next = newnode;
newnode->next = next;
}
- 删除pos位置的值
void SListErase(SListNode** pplist, SListNode* pos)
{
assert(pos);
assert(*pplist);
if (pos == *pplist)
{
SListPopFront(pplist);
}
else
{
SListNode* prev = *pplist;
while (prev->next != pos)
{
prev = prev->next;
}
SListNode* next = pos->next;
free(pos);
prev->next = next;
}
}
单链表的销毁
void SListDestroy(SListNode** pplist)
{
assert(*pplist);
while (*pplist)
{
SListNode* prev = *pplist;
*pplist = (*pplist)->next;
free(prev);
}
}
总结
链表和顺序表是两种重要的线性表实现方式,链表在插入和删除操作上具有更高的效率。通过本文的介绍,相信读者已经对链表有了一个全面的了解。如果想了解更多关于顺序表的内容,可以参考相关资料。
本文原文来自CSDN
热门推荐
钱伟长:一位通澈的爱国者,一位通达的科学家,一位通识教育家,一位通才跨界者
向航空公司索赔指南:流程、证据及注意事项
2D+3D混制 国漫《民调局异闻录》豆瓣评分已达8.3!
闲置土地的调查和处置办法有哪些
IT界的大神:C语言之父丹尼斯·里奇(Dennis Ritchie)
孩子感冒怎么判断是不是甲流
办公软件Word页边距调整指南
应该怎么预防胃病
五代耀州窑:青瓷艺术的巅峰之作
弯道超车!中国无人机是如何崛起的?
如何选择PCB板材的Tg值?
肠道微生物代谢产物与宿主健康:短链脂肪酸、胆汁酸和色氨酸代谢产物研究详解
铁路时评:乘火车“慢”游,品华夏文化
螺母的种类有哪些 螺母的四种常见种类介绍
眼镜行业市场现状与发展趋势分析
肠胃感冒:症状、诊断与预防全攻略
50 亿数据如何去重&排序?海量数据去重、Top-k、BitMap问题整理
凝聚智慧 共创未来——博鳌亚洲论坛2025年年会前瞻
数控机床刀补:精准加工的利器
一份完整的全国高校青年教师教学竞赛教学设计编写思路,手把手级攻略!
手机号段知多少:一文看懂我国“电信网码号资源”分配情况!
室内用电规划指南:插座、电路与开关配置全攻略
太阳能逆变器:类型、优缺点及选购要点
治疗喉咙痛的五种方法
安徽宿松明堂山:华东第一胜景,探秘喀斯特仙境
十二星座的真正性格
可怕!小区突发火灾,消火栓竟无水可用!
多奈哌齐治疗轻中度阿尔茨海默病作用机制研究进展
脊椎压迫神经的10个征兆及治疗方法
《咬文嚼字》主编黄安靖谈2024年十大流行语