【零基础学数据结构】双向链表

1.双向链表的概念

1.1头节点 

 1.2带头双向循环链表

注意: 哨兵位创建后,首尾连接自己

1.3双链表的初始化

// 双向链表的初始化
void ListInit(ListNode** pphead)
{// 给双链表创建一个哨兵位*pphead = ListBuyNode(-1);
}

2.双向链表的打印 

// 双向链表的打印
void ListPrint(ListNode* phead)
{// 遍历链表ListNode* pcur = phead->next;while (pcur != phead){// 打印printf("%d->", pcur->data);pcur = pcur->next;}printf("\n");
}

 3.双向链表的尾插 

// 双向链表的尾插
void ListPushBack(ListNode* phead, ListDatatype x)
{// 创建一个存放数据的新节点ListNode* newnode = ListBuyNode(x);// 进行尾插// 新节点连接newnode->prev = phead->prev;newnode->next = phead;// 改变原来链表的连接phead->prev->next = newnode;phead->prev = newnode;
}

4.双向链表的头插 

void ListPushFront(ListNode* phead, ListDatatype x)
{// 创建一个存放数据的新节点ListNode* newnode = ListBuyNode(x);// 进行头插// 新节点连接newnode->prev = phead;newnode->next = phead->next;// 改变原来链表的连接phead->next->prev = newnode;phead->next = newnode;
}

5.双向链表的尾删 

void ListPopBack(ListNode* phead)
{assert(phead && phead->next != phead);// 进行尾删除ListNode* del = phead->prev;del->prev->next = del->next; del->next->prev = del->prev;// 释放空间free(del);del = NULL;
}

6.双向链表的头删 

void ListPopFront(ListNode* phead)
{assert(phead && phead->next != phead);// 进行头删除ListNode* del = phead->next;del->next->prev = phead;phead->next = del->next;// 释放空间free(del);del = NULL;
}

7.双向链表的查找  

ListNode* ListFind(ListNode* phead, ListDatatype x)
{// 遍历双向链表ListNode* pcur = phead->next;while (pcur != phead){// 打印if (pcur->data == x){return pcur;}pcur = pcur->next;}// 没有找到return NULL;
}

 8.双向链表在pos位置之后插入 

void ListInsret(ListNode* pos, ListDatatype x)
{assert(pos);// 创建一个存放数据的新节点ListNode* newnode = ListBuyNode(x);// 插入// 新节点连接newnode->prev = pos;newnode->next = pos->next;// 原链表连接pos->next->prev = newnode;pos->next = newnode;
}

9.双向链表删除pos节点 

void ListErase(ListNode* pos)
{//pos理论上来说不能为phead,但是没有参数phead,无法增加校验assert(pos);pos->prev->next = pos->next;pos->next->prev = pos->prev;free(pos);pos = NULL;
}

 10.双向链表的销毁

void ListDesTroy(ListNode* phead)
{assert(phead);// 遍历删除ListNode* pcur = phead->next;while (pcur != phead){ListNode* next = pcur->next;free(pcur);pcur = next;}//此时pcur指向phead,而phead还没有被销毁free(phead);phead = NULL;printf("销毁成功!");
}

 测试文件:

#include "List.h"void ListNodetext()
{ListNode* plist;ListInit(&plist);// 测试尾插ListPushBack(plist, 1);/*ListPrint(plist);*/ListPushBack(plist, 2);/*ListPrint(plist);*/ListPushBack(plist, 3);ListPrint(plist); // 1->2->3->// 测试头插//ListPushFront(plist, 6);//ListPrint(plist);//ListPushFront(plist, 7);//ListPrint(plist);//ListPushFront(plist, 8);//ListPrint(plist);// 测试尾删//ListPopBack(plist);//ListPrint(plist);//ListPopBack(plist);//ListPrint(plist);//ListPopBack(plist);//ListPrint(plist);// 测试头删//ListPopFront(plist);//ListPrint(plist);//ListPopFront(plist);//ListPrint(plist);//ListPopFront(plist);//ListPrint(plist);// 测试查找//ListNode* find = ListFind(plist, 30);//if (find == NULL)//{//	printf("没有找到!");//}//else//{//	printf("找到了!");//}// 测试pos位置之后插入//ListNode* find = ListFind(plist, 2);//ListInsret(find, 5);//ListPrint(plist);// 测试删除pos节点//ListNode* find = ListFind(plist, 3);//ListErase(find);//find = NULL;//ListPrint(plist);ListDesTroy(plist);plist = NULL;
}int main()
{ListNodetext();return 0;
}

 

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

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

相关文章

为什么在cmd中输入jupyter notebook会出现问题

C:\Users\REBECCA329>jupyter notebook jupyter 不是内部或外部命令,也不是可运行的程序 或批处理文件。 这是什么意思?这个说明在cmd中找不到jupyter notebook,说明没有添加到环境变量里去,在配置R内核的时候找不到&#xff…

TSINGSEE青犀AI智能分析网关V4叉车载货出入库检测算法介绍及应用

随着物流行业的快速发展,叉车作为物流运输的重要设备,其安全性和效率性越来越受到人们的关注。然而,在实际操作中,由于人为因素和操作环境的复杂性,叉车事故时有发生,给企业和个人带来了巨大的损失。为了提…

一些错误的记录

Linux使用rz命令出现乱码? 使用下面的命令上传: rz -besz filename //从linux操作系统上下载文件(夹)到本地云服务器上的redis连接不上,本地的图形化界面 1.在云服务器控制台-防火墙开放6379端口(使用命令开放端口不…

MySQL-进阶篇-一条sql更新语句是如何执行的(redo log和binlog)

上一篇:一条sql查询语句是如何执行的 http://t.csdnimg.cn/nV3EY 摘自:林晓斌MySQL实战45讲——第二篇 更新语句的执行过程与上一篇查询流程相同,本篇简写。 但多了两个重要的日志模块:redo log(重做日志&#xff0…

CorelDRAW2024破解注册机授权码分享

CorelDRAW是一款由加拿大Corel公司开发的平面设计软件,主要用于矢量图形制作、排版和编辑。它以其强大的功能和用户友好的界面而广受欢迎,被广泛应用于各个领域,包括设计、广告、出版和印刷等。 CDR2017-2024全版本下载网盘汉化版链接: http…

js可视化爬取数据生成当前热点词汇图

功能 可以爬取到很多数据,并且生成当前的热点词汇图,词越大越热门(词云图) 这里以b站某个评论区的数据为例,爬取63448条数据生成这样的图片 让我们能够更加直观的看到当前的热点 git地址 可以直接使用,中文…

如何通过多媒体设计迅速为科普展厅制作提供清晰的思路?

随着数字化信息时代的迅速发展,各类领域的知识内容变得愈发繁杂,于是为了针对性地向大众普及各方面知识,各地域都会选择建设科普展厅的方式来实现这一目的,并在当中运用先进的多媒体技术,用以加强公众对相关知识的理解…

使用 HBuilderX自动上传Uniapp 微信小程序代码

HBuilderX内置相关环境,开箱即用,无需配置nodejs。本文只介绍发布微信小程序的步骤。 1.下载和安装 HBuilderX hbuilder首页:https://www.dcloud.io/hbuilderx.html 下载hbuilder编辑器,选择对应的系统,Windows和mac正式版即可,下载后免安…

海康4G摄像机国标注册失败,接入国标28181视频监控平台失败的问题分析、排查、解决

目录 一、问题现象 (一)背景 (二)在平台端,设备显示在线,通道不能传到平台端 (二)直接把通道接入进来,查看是否,显示请求超时 二、问题分析 &#xff0…

【计算机毕业设计】企业销售人员培训——后附源码

🎉**欢迎来到琛哥的技术世界!**🎉 📘 博主小档案: 琛哥,一名来自世界500强的资深程序猿,毕业于国内知名985高校。 🔧 技术专长: 琛哥在深度学习任务中展现出卓越的能力&a…

Windows下使用PanguVip实现浮动IP

在某些高可用场景下,我们往往需要使用浮动IP来进行实际访问的切换,比如为了保证Web应用的高可用,当主节点宕机后,我们将浮动IP切换到备节点,那么备节点就继续可以提供服务,在linux下我们可以使用keepalived…

常见点云文件解析

常见点云文件解析 1. 为什么会有这么多的点云文件2. 常见的点云文件格式解析2.1 pcd格式2.2 off格式2.3 xyz格式2.4 ply格式2.5 obj格式2.6 stl格式 1. 为什么会有这么多的点云文件 我们在做2D视觉时,处理的就是类似一系列类似的二维数组,数组以图片的形…

第1章 计算机网络体系结构

王道学习 【考纲内容】 (一)计算机网络概述 计算机网络的概念、组成与功能;计算机网络的分类; 计算机网络的性能指标 (二)计算机网络体系结构与参考模型 计算机网络分层结…

数据结构排序篇上

排序的概念及其运用 排序的概念 排序 :所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。 稳定性 :假定在待排序的记录序列中,存在多个具有相同的关键字的记录&…

面向电力行业定制安全云工作站解决方案,麒麟信安出席2024年电力企业信创替代技术研讨会

日前,由中国电子企业协会主办的“2024年电力企业信创替代技术研讨会”在江苏南京正式召开。会议以国家推进实现自主可控、加快建设“数字中国”为大背景,聚焦电力企业紧抓“信创替代”机遇,通过安全可靠的软硬件迭代升级,实现企业…

android studio 网络请求okhttp3、okgo

一、在build.gradle文件里添加 implementation com.squareup.okhttp3:okhttp:4.9.0 implementation com.squareup.okhttp3:okhttp:3.12.0 implementation com.squareup.okio:okio:1.17.4 implementation com.lzy.net:okgo:3.0.4 implementation com.alibaba:fastjson:1.2.57 i…

ssm046人事管理信息系统+jsp

人事管理信息系统设计与实现 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本人事管理信息系统就是在这样的大环境下诞生,其可以帮助管理者在短…

软考高级架构师:存储管理-页式存储真题解析

背景知识 题目 进程P有8个页面,页号分别为0~7,页面大小为4K ,假设系统给进程P分配了4个存储块,进程P的页面变换表如下所示。表中状态位等于1和0分别表示页面在内存和不在内存。若进程P要访问的逻辑地址为十六进制 514…

QThread的学习

锁住该线程直到下面的情况之一出现: (1)和该线程连接的对象已经执行完成(例如:当它从run()中返回时) 如果该线程已经结束,该函数将返回true。 如果该线程还没有开始,它也返回true。 (2)time毫秒已经过去。如…

嵌入式面试的中的一些潜规则

潜规则1:面试的本质不是考试,而是告诉面试官你会做什么 经验不够的小伙伴特别容易犯的一个错误,不清楚面试官到底想问什么,其实整个面试中面试官并没有想难倒你的意思,只是想通过提问的方式来知道你会什么。 比如stm32单片机的启动过程是怎样的? 没入门的说从main函数…