【数据结构】单链表带头双向循环链表的实现

一、链表的概念及结构

1.链表的概念

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

2.链表的结构

一般讲的链表包括数据域和指针域:

二、链表的种类

实际中链表的结构非常多样,由以下三组类型自由组合可得8种链表结构:

1.单向、双向:

2.带头、不带头:

3.循环、非循环:

虽然有这么多类型,但我们最长使用的就是以下两种:

在此我们只实现这两种链表

三、单链表的实现

1.自定义链表结点struct SListNode
typedef int SLTDateType;
typedef struct SListNode
{SLTDateType data;struct SListNode* next;
}SListNode;
2.链表打印数据SListPrint
//打印
void SListPrint(SListNode* plist)
{if (plist == NULL)return;while (plist){printf("%d->", plist->data);plist = plist->next;}
}
3.链表创建结点BuyListNode
//创建节点
SListNode* BuySListNode(SLTDateType x)
{SListNode* new_node = (SListNode*)malloc(sizeof(SListNode));if (new_node == NULL){perror("malloc fail");return NULL;}new_node->data = x;new_node->next = NULL;return new_node;
}
4.链表尾部插入数据SListPushBack
//尾插
void SListPushBack(SListNode** pplist, SLTDateType x)
{//无节点if (*pplist == NULL){(*pplist) = BuySListNode(x);}//有节点SListNode* tail = *pplist;while (tail->next){tail = tail->next;}tail->next = BuySListNode(x);
}
5.链表头部插入数据SListPushFront
//头插
void SListPushFront(SListNode** pplist, SLTDateType x)
{SListNode* new_node = BuySListNode(x);new_node->next = *pplist;*pplist = new_node;
}
6.链表尾部删除数据SListPopBack
//尾删
void SListPopBack(SListNode** pplist)
{//空链表if ((*pplist) == NULL)return;//一个节点if ((*pplist)->next == NULL){SListNode* tmp = *pplist;free(tmp);tmp = NULL;}//多个节点else{SListNode* cur = *pplist;SListNode* next = cur->next;//找尾while (cur->next->next){cur = next;next = next->next;}free(next);cur->next = NULL;}}
7.链表头部删除数据SListPopFront
//头删
void SLPopFront(SListNode** pplist)
{//没有节点if ((*pplist) == NULL)return;//一个节点//多个节点SListNode* tmp = *pplist;*pplist = (*pplist)->next;free(tmp);tmp = NULL;
}
8.链表查找数据
//查找
SListNode* SListFind(SListNode* plist, SLTDateType x)
{SListNode* cur = plist;while (cur){if (cur->data == x){return cur;}cur = cur->next;}return NULL;
}
9.链表在pos位置之后插入数据
// 单链表在pos位置之后插入x
void SListInsertAfter(SListNode* pos, SLTDateType x)
{SListNode* newnode = BuySListNode(x);//在非尾节点插入if (pos->next != NULL){newnode->next = pos->next;pos->next = newnode;}else{SListPushBack(&pos, x);}
}

10.删除pos位置之后的值

// 单链表删除pos位置之后的值
void SListEraseAfter(SListNode* pos)
{if (pos->next == NULL){printf("erroe");return;}SListNode* del = pos->next;pos->next = del->next;free(del);del = NULL;
}

11.销毁链表

//销毁链表
void SLTDestroy(SListNode** pphead)
{if (*pphead == NULL)return;SListNode* next = (*(pphead))->next;while (*pphead){//销毁SListNode* del = *pphead;free(del);del = NULL;//迭代*pphead = next;if(next)next = next->next;}
}

四.带头双向循环链表的实现

1.自定义链表结点 ListNode

typedef int LTDataType;
typedef struct ListNode
{LTDataType _data;struct ListNode* _next;struct ListNode* _prev;
}ListNode;

2.创建新节点


//创建新节点
ListNode* BuyLTNode(LTDataType x)
{ListNode* newnode = (ListNode*)malloc(sizeof(ListNode));if (newnode == NULL){perror("malloc fail");return NULL;}newnode->_data = x;newnode->_next = NULL;newnode->_prev = NULL;return newnode;
}

3.创建一个新链表,返回头结点

// 创建返回链表的头结点.
ListNode* ListCreate()
{ListNode* Phead = BuyLTNode(-1);Phead->_next = Phead;Phead->_prev = Phead;return Phead;
}

4.打印链表

//打印链表
void ListPrint(ListNode* pHead)
{if (pHead == NULL)return;ListNode* cur = pHead->_next;printf("pHead <=> ");while (cur!=pHead){printf("%d <=> ", cur->_data);cur = cur->_next;}
}

5.在pos之前插入值为x节点

//在pos前插入
void ListInsert(ListNode* pos, LTDataType x)
{ListNode* pre = pos->_prev;ListNode* newnode = BuyLTNode(x);newnode->_next = pos;pos->_prev = newnode;pre->_next = newnode;newnode->_prev = pre;
}

6.尾插

//尾插
void ListPushBack(ListNode* pHead, LTDataType x)
{ListInsert(pHead,  x);
}

7.头插

//头插
void ListPushFront(ListNode* pHead, LTDataType x)
{ListInsert(pHead->_next, x);
}

8.删除pos位置节点

//删除pos位置的节点
void ListErase(ListNode* pos)
{ListNode* pre = pos->_prev;ListNode* next = pos->_next;free(pos);pos = NULL;pre->_next = next;next->_prev = pre;
}

9.双向链表头删

// 双向链表头删
void ListPopFront(ListNode* pHead)
{ListErase(pHead->_next);
}

10.双向链表尾删

// 双向链表尾删
void ListPopBack(ListNode* pHead)
{ListErase(pHead->_prev);
}

11.查找

// 双向链表查找
ListNode* ListFind(ListNode* pHead, LTDataType x)
{ListNode* cur = pHead->_next;while (cur != pHead){if (cur->_data == x)return cur;cur = cur->_next;}return NULL;
}

12.销毁链表

//销毁链表
void ListDestory(ListNode* pHead)
{ListNode* cur = pHead->_next;while (cur){ListNode* next = cur->_next;free(cur);pHead->_next = next;cur = next;}
}

注:带头双向循环链表的头插头删,尾插尾删直接复用了插入删除代码。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/50768.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【HashMap源码学习】

HashMap的底层结构 HashMap是基于分离链表法解决散列冲突的动态散列表。 1、在jdk7中&#xff0c;使用的是“数组 链表”&#xff0c;发生散列冲突的时候键值对会用头插法添加到单链表中&#xff1b; 2、在jdk8中&#xff0c;使用的是“数组 链表 红黑树”&#xff0c;发…

【Python】成功解决: [Errno 24] Too many open files

【Python】成功解决: [Errno 24] Too many open files 在Python编程中&#xff0c;遇到[Errno 24] Too many open files错误是一个常见的系统资源限制问题。这个错误表明你的程序尝试打开的文件数量超过了操作系统允许的最大文件描述符数量。在Linux和Unix系统中&#xff0c;每…

昇思25天学习打卡营第1天|简单深度学习

前言 昇思MindSpore是一个全场景深度学习框架&#xff0c;旨在实现易开发、高效执行、全场景统一部署三大目标。 其中&#xff0c;易开发表现为API友好、调试难度低&#xff1b;高效执行包括计算效率、数据预处理效率和分布式训练效率&#xff1b;全场景则指框架同时支持云、边…

从 Pandas 到 Polars 三十八:Polars 的“瘦身”功能

Polars 有一个内置工具来进行 dtype 瘦身。调用 shrink_dtype 表达式&#xff0c;它会根据列中的数据将列转换为需要最少内存量的 dtype。 shrink_dtype 是 Polars 中一个非常有用的函数&#xff0c;它用于优化 DataFrame 中列的数据类型&#xff0c;以减小内存占用并可能提高…

react子组件向父组件传参

在React中&#xff0c;子组件向父组件传参&#xff08;或称为“通信”&#xff09;通常通过事件回调的方式实现。父组件向子组件传递一个函数作为props&#xff0c;子组件在需要时调用这个函数&#xff0c;并可以通过参数的形式向父组件传递数据。 下面是一个简单的例子来说明…

C++之map和set封装以及哈希(unordered_map和unordered_set)的封装(仅代码)

个人主页&#xff1a;点我进入主页 专栏分类&#xff1a;C语言初阶 C语言进阶 数据结构初阶 Linux C初阶 C进阶​ ​​​​算法 欢迎大家点赞&#xff0c;评论&#xff0c;收藏。 一起努力&#xff0c;一起奔赴大厂 目录 一. map和set封装 1.1红黑树 1.2map …

fatal: refusing to merge unrelated histories

出现本地仓库和远程仓库的代码合并不兼容问题&#xff0c;解决方法&#xff1a; 添加--allow-unrelated-histories&#xff0c;让git允许提交不关联的历史代码。 成功提交&#xff1a;

Nuitka,一个超厉害的 Python 库

在众多高级编程语言中,Python 以其简洁的语法和强大的功能深受广大开发者的喜爱。然而,Python 程序的执行速度常常成为其被诟病之处。今天,我们要介绍的 Nuitka,正是一款可以将 Python 代码编译成 C++ 代码的工具,从而大幅提升程序执行效率。那么,Nuitka 究竟是什么呢?它…

python基础知识点(蓝桥杯python科目个人复习计划75)

第一题&#xff1a;ip补充 题目描述&#xff1a; 小蓝的ip地址为192.168.*.21&#xff0c;其中*是一个数字&#xff0c;请问这个数字最大可能是多少&#xff1f; import os import sys# 请在此输入您的代码 print("255") 第二题&#xff1a;出现最多的字符 题目描…

gitee的fork

通过fork操作&#xff0c;可以复制小组队长的库。通过复制出一模一样的库&#xff0c;先在自己的库修改&#xff0c;最后提交给队长&#xff0c;队长审核通过就可以把你做的那一份也添加入库 在这fork复制一份到你自己的仓库&#xff0c;一般和这个项目同名 现在你有了自己的库…

git 学习总结

文章目录 一、 git 基础操作1、工作区2、暂存区3、本地仓库4、远程仓库 二、git 的本质三、分支git 命令总结 作者: baron 一、 git 基础操作 如图所示 git 总共有几个区域 工作区, 暂存区, 本地仓库, 远程仓库. 1、工作区 存放项目代码的地方&#xff0c;他有两种状态 Unm…

Vue3时间选择器datetimerange在数据库存开始时间和结束时间

♥️作者&#xff1a;小宋1021 &#x1f935;‍♂️个人主页&#xff1a;小宋1021主页 ♥️坚持分析平时学习到的项目以及学习到的软件开发知识&#xff0c;和大家一起努力呀&#xff01;&#xff01;&#xff01; &#x1f388;&#x1f388;加油&#xff01; 加油&#xff01…

什么是埋点?前端如何埋点?

什么是埋点 “埋点” 是一种在应用程序或网站中插入代码的技术&#xff0c;用于收集用户行为数据或特定事件的信息。它是用于分析和监控用户行为、应用性能和其他关键指标的一种常用方法。通过在特定位置插入代码或调用特定的 API&#xff0c;开发人员可以捕获有关用户如何与应…

a,a,a【0】,a【0】,指针解析数组,用作(左值,右值)的区别

a&#xff0c;&a&#xff0c;a【0】&#xff0c;&a【0】&#xff0c;指针解析数组&#xff0c;用作&#xff08;左值&#xff0c;右值&#xff09;的区别

大数据-49 Redis 缓存问题中 穿透、雪崩、击穿、数据不一致、HotKey、BigKey

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff08;已更完&#xff09;HDFS&#xff08;已更完&#xff09;MapReduce&#xff08;已更完&am…

《GPT-4o mini:开启开发与创新的新纪元》

在科技发展的快速进程中&#xff0c;OpenAI 推出的 GPT-4o mini 模型如同一阵春风&#xff0c;给开发者们带来了新的希望和机遇。它以其卓越的性能和极具吸引力的价格&#xff0c;成为了行业内热议的焦点。 当我首次听闻 GPT-4o mini 的消息时&#xff0c;内心充满了好奇与期待…

解锁Conda配置的秘密:conda config --get命令全指南

&#x1f511; 解锁Conda配置的秘密&#xff1a;conda config --get命令全指南 Conda是一个功能强大的包管理器和环境管理器&#xff0c;它允许用户通过配置文件来自定义其行为。有时&#xff0c;了解当前的配置状态对于诊断问题、优化设置或确保环境的一致性至关重要。本文将…

Linux下学习Python包管理器Poetry教程 零基础入门到精通

Poetry [官网 - Poetry] https://python-poetry.org/ 安装 pip install poetry简单使用 初始化 poetry 项目 cd ~ && mkdir demo poetry init管理虚拟环境 poetry 预设了很多自己的虚拟环境配置&#xff0c;这些配置可以通过 poetry config 进行修改 当用户在执…

使用git工具管理泰山派内核源码目录及抽打补丁简易流程

目录 使用git工具管理泰山派内核源码目录及抽打补丁简易流程 一、使用git维护源码 二、git 常用的一些操作 三、抽补丁 四、打补丁 五、补充 使用git工具管理泰山派内核源码目录及抽打补丁简易流程 最近&#xff0c;在做linux开发的过程中入手了一块泰山派RK3566的开发板…

嵌入式初学-C语言-前言

概述 C语言是一种计算机编程语言&#xff0c;我们是利用代码来控制计算机的运行&#xff0c;从而达到某种目的&#xff0c;我们 就很有必要了解计算机的运行原理。 计算机组成 OS 应用程序 计算机硬件 基本组成&#xff1a; 输入设备&#xff1a;输入数据给计算机处理&…