双向链表的实现

news/2024/5/21 7:35:31/文章来源:https://blog.csdn.net/challenglistic/article/details/127981045

这里以结构体的方式来实现链表,也可以使用类。结构体在没有修饰符的情况下,默认是共有访问。如有不对,希望能指出


目录

一、链表和结点结构体的声明 (ListNode.h)

二、链表各个功能的实现

1、增

(1) 构造函数(创建链表头结点)

 (2) 尾插

(3) 头插

(4) 任意位置的插入

2、删

(1) 尾删

 (2) 任意位置的删除

(3) 链表释放

3、查

(1) 获取元素个数

(2) 正向打印

(3) 反向打印


一、链表和结点结构体的声明 (ListNode.h)

typedef int data_t;typedef struct ListNode {		// 结点声明data_t data;ListNode* next;ListNode* prev;
}ListNode;typedef struct SeqLinkList {SeqLinkList();void list_print();					// 从前往后打印链表void list_reverse_print();			// 从后往前打印链表size_t size();						// 链表大小(链表结点个数)int push_back(data_t val);			// 尾插void pop_back();					// 尾删int push_front(data_t val);			// 头插int list_find(data_t val);			// 查找某个结点int list_insert(int pos, data_t val);	// 在某个位置插入一个结点int list_delete(int pos);				// 删除某个位置的结点void list_destroy();					// 释放整个链表private:ListNode* _phead;					// 链表头结点的地址ListNode* _ptail;					// 链表尾结点的地址size_t _num;						// 链表元素的个数}SeqLinkList;

二、链表各个功能的实现

1、增

(1) 构造函数(创建链表头结点)

创建一个空的头结点,同时初始化元素个数

SeqLinkList::SeqLinkList() {_phead = (ListNode*)malloc(sizeof(ListNode));assert(_phead);_ptail = _phead;		// 此时头尾指向同一个地方_num = 0;		// 初始化结点的个数
}

 (2) 尾插

int SeqLinkList::push_back(data_t val) {ListNode* newNode = (ListNode*)malloc(sizeof(ListNode));if (newNode == NULL)return -1;newNode->data = val;newNode->next = NULL;newNode->prev = _ptail;_ptail->next = newNode;	// 链接新的结点_ptail = newNode;		// 尾节点移动_num++;return 0;
}

(3) 头插

int SeqLinkList::push_front(data_t val) {ListNode* newNode = (ListNode*)malloc(sizeof(ListNode));if (newNode == NULL)return -1;ListNode* nextNode = _phead->next;		// _phead的下一个结点newNode->data = val;newNode->next = nextNode;newNode->prev = _phead;_phead->next = newNode;if (nextNode != NULL)nextNode->prev = newNode;_num++;return 0;
}

(4) 任意位置的插入

int SeqLinkList::list_insert(int pos, data_t val) {if (pos > _num - 1)return -1;ListNode* current = _phead;while (pos-- && (current = current->next) != NULL);ListNode* nextNode = current->next;			// 记录下当前节点的下一个结点ListNode* newNode = (ListNode*)malloc(sizeof(ListNode));if (newNode == NULL)return -1;newNode->data = val;            // 链接新的结点current->next = newNode;newNode->next = nextNode;newNode->prev = current;if (nextNode != NULL)nextNode->prev = newNode;		// 考虑尾插_num++;return 0;
}

2、删

(1) 尾删

void SeqLinkList::pop_back() {ListNode* tailNode = _ptail;		// 记录尾节点_ptail = _ptail->prev;			_ptail->next = NULL;free(tailNode);tailNode = NULL;_num--;
}

 (2) 任意位置的删除

int SeqLinkList::list_delete(int pos) {if (pos > _num - 1)return -1;ListNode* current = _phead;while (pos-- && (current = current->next) != NULL);if (current == _phead)_phead = current->next;		// 考虑头删else{ListNode* prevNode = current->prev;ListNode* nextNode = current->next;prevNode->next = nextNode;if (nextNode != NULL)nextNode->prev = prevNode;}free(current);current = NULL;_num--;return 0;
}

(3) 链表释放

void SeqLinkList::list_destroy() {_num++;			// 补上一个头结点,下面是连带着头结点一起释放了while (_phead != NULL){ListNode* lastNode = _phead;_phead = _phead->next;free(lastNode);lastNode = NULL;_num--;}
}

 

3、查

(1) 获取元素个数

size_t SeqLinkList::size() {return _num;
}

(2) 正向打印

void SeqLinkList::list_print(){ListNode* current = _phead;while ((current = current->next) != NULL){printf("%d->", current->data);}
}

(3) 反向打印

void SeqLinkList::list_reverse_print() {ListNode* current = _ptail;while (current != _phead){printf("%d->", current->data);current = current->prev;}
}

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

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

相关文章

信息安全工程实践笔记--Day1 信息收集漏洞扫描

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录实验目标(一)信息收集一、搜索引擎二、域名1.whois 查询2.子域名查询3.真实ip(1)什么是cdn?(2) 如何验证目标服务器是否挂载cdn&a…

零基础自学javase黑马课程第十六天

零基础自学javase黑马课程第十六天 ✨欢迎关注🖱点赞🎀收藏⭐留言✒ 🔮本文由京与旧铺原创,csdn首发! 😘系列专栏:java学习 💻首发时间:🎞2022年11月21日&…

中国市场杂志社中国市场编辑部2022年第32期目录

前沿理论 新冠肺炎疫情下跨境冷链物流的新思考——以大连冷链业疫情为例 廖燕莲;谷玉红;尚书山; 1-3《中国市场》投稿:cnqikantg126.com 数字经济背景下数字服务税问题探析 李瑞玲; 4-6 我国工业能源效率提升的阻碍及其对策探究 韩洁平;田振东;张诗雅; …

Linux 之 Linux/Ubuntu 中开发操作中常用的命令整理

Linux 之 Linux/Ubuntu 中开发操作中常用的命令整理 目录 Linux 之 Linux/Ubuntu 中开发操作中常用的命令整理 一、简单介绍 二、常用命令 1、 打开终端 :Ctrl Alt T 2、退出终端:exit 3、查看安装 Ubuntu 版本/显示系统等信息:uname…

Advances in Graph Neural Networks笔记4:Heterogeneous Graph Neural Networks

诸神缄默不语-个人CSDN博文目录 本书网址:https://link.springer.com/book/10.1007/978-3-031-16174-2 本文是本书第四章的学习笔记。 感觉这一章写得不怎么样。以研究生组会讲异质图神经网络主题论文作为标准的话,倒是还行,介绍了HGNN的常见…

csdn月入过万的作者是如何练成的?

很多年前,我有一个成为作家的梦想。 后来从事了技术,觉得与作家梦越来越远了。 虽然梦想远去,但写字的欲望没有停止。 这些年,一直在有道云笔记上记录自己的工作心得,偶尔会来csdn上写一写。 我在csdn真正发力的时候…

openGauss数据库客户端连接工具之Datastudio安装

Datastudio使用前电脑必须安装jdk1.8版本或者1.11版本,如未安装可点击以下连接,参考第一步把jdk给安装成功。 点击此处查看jdk安装步骤 Datastudio下载地址:软件包|Datastudio 下载完成后,解压安装包,双击exe文件打开…

链表中快慢指针的应用

目录 一、链表的中间结点 二、回文链表 三、链表中倒数第K个结点 四、删除链表的倒数第n个结点 五、环形链表 六、环形链表Ⅱ 一、链表的中间结点 给定一个头结点为 head 的非空单链表,返回链表的中间结点。 如果有两个中间结点,则返回第二个中间…

基于Spring Cloud的架构使用学习升级之路

引言 Spring Cloud全家桶用了挺长时间了,很长一段时间都是基于已有的架构进行需求研发。今年成为团队技术负责人,承担了新的项目,这是很好的一个机会,于是开启了项目架构升级之路。 架构,是团队项目的根基。在一个团…

为什么开源在线表单工具能做好数据管理?

在数字化时代,数据的有效应用和管理可以说是企业的无形资产,做好数据管理既能提升办公效率,又能帮助企业从规律的数字化管理中获取高效的管理策略。那么,什么样的开源在线表单工具可以实现这一目的?对于企业而言&#…

token的使用

一:什么是token及token的作用? 1.什么是token? Token是首次登录时,由服务器下发,作为客户端进行请求时的一个令牌。当请求后台方法时,用于身份验证 当第一次登录后,服务器生成一个Token便将此…

【SpringBoot】SpringBoot+SpringSecurity+CAS实现单点登录

文章目录一.CAS的概述1.SSO2.CAS3.概念二.CAS的流程三.CAS服务端部署1.下载地址2.源码打包3.部署运行4. java.io.FileNotFoundException: \etc\cas\thekeystore (系统找不到指定的文件。)四.CAS的定制1.定制数据源2.兼容 HTTP3.定制登录页五.SpringBoot集成CAS1.工程创建2.导入…

【OpenCV 例程 300篇】248. 特征描述之HOG描述符

『youcans 的 OpenCV 例程300篇 - 总目录』 【youcans 的 OpenCV 例程 300篇】248. 特征描述之HOG描述符 1. 方向梯度直方图 方向梯度直方图(Histogram of Oriented Gradient, HOG)使用梯度方向的分布作为特征来构造描述符,应用非常广泛。 梯…

十万部冷知识:“澳大利亚”为什么属于亚洲球队?

在2022年卡塔尔世界杯上,总共有6支球队入围,他们分别是日本队,韩国队,沙特队,伊朗队,澳大利亚队,还有就是东道主卡塔尔队。但是我们知道,澳大利亚,并不是亚洲的国家&…

前端面试题(JS部分)

目录一, 数据类型1,什么是引用类型,值类型?2,哪些值类型3,哪些引用类型4,判断数据类型5,typeof判断6,instanceof7,construtor二,浅拷贝 / 深拷贝1…

在阿里云 ACK 上部署 EMQX MQTT 服务器集群

云进入以「应用为中心」的云原生阶段,Operator 模式的出现,则为 Kubernetes 中的自动化任务创建配置与管理提供了一套行之有效的标准规范。通过将运维知识固化成高级语言 Go/Java 代码,使得运维知识可以像普通软件一样交付,并能支…

Jmeter的使用说明

一、安装Jmeter工具 链接:https://pan.baidu.com/s/1ZYc15eq9DO-r0ChKHxMXlg?pwdckcd 提取码:ckcd --来自百度网盘超级会员V5的分享二、Jmeter的常用元器件说明 jmeter八大元件件:取样器,前置处理器,后置处理器&a…

MySQL的高阶学习:索引、B+树

1.索引 索引是一种数据结构,如果没有索引,查找一个数据就需要从第一页开始全局检索直至找到需要的数据,有了索引可以先在目录中根据拼音查找到该数据所在的页数,因此通过索引可以大大减少了查询时间。 索引有两种存储类型&#xf…

汽车安全气囊设计?Abaqus/Part特殊建模方法-附案例step-by-step教学

作者 | 邓怡超 Abaqus/Part基于特征的建模功能可以说非常齐全,基本能够满足一般的分析要求,更复杂的模型则可以通过与专业三维建模软件之间的接口来导入,今天要说的是部件的另外一种建模方法。 有一种类型的分析,部件自身的初始…

Linux基础8 - 网络配置

Linux基础8 - 网络配置 一、网络连接的三种方式 Vmware为我们提供了三种网络工作模式,它们分别是:Bridged(桥接模式)、NAT(网络地址转换模式)、Host-Only(仅主机模式)。 1、桥接模式…