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

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,一经查实,立即删除!

相关文章

怎么用docker安装MySQL

可以访问 Docker Hub 上的 MySQL 镜像仓库。在 MySQL 官方仓库页面上,会列出所有可用的镜像标签及其对应的版本。 以下是使用 Docker 安装 MySQL 8 的基本步骤: 拉取官方的 MySQL 8 镜像: docker pull mysql:8 运行一个 MySQL 容器实例&a…

蓝桥杯备考随手记: 常见的二维数组问题

在Java中,二维数组是一种可以存储多个元素的数据结构。它由多个一维数组组成,这些一维数组可以看作是行和列的组合,形成了一个矩阵。 1. 二维数组旋转问题 二维数组的旋转是指将数组中的元素按照一定规则进行旋转。通常有两种常见的旋转方式…

SpringBoot 面试题(四)

1. 如何使用SpringBoot实现定时任务? 在Spring Boot中实现定时任务,通常可以使用Scheduled注解。以下是一个简单的例子说明如何在Spring Boot应用中创建一个定时任务: 首先,确保你的Spring Boot项目中包含了Spring Scheduler的依…

安卓Android.nfc读卡

使用安卓手机,通过NFC功能可以读取IC卡信息,。 IC卡有很多种卡标准,协议,等等,这些具体就不细讨论。 主要讨论,2种卡,一种是M1卡,另外是CPU卡。 1、 M1卡 M1卡是市面上比较常见的卡…

利用Tess4J实现图片文字识别

利用Tess4J实现图片文字识别 前言 光学字符识别(OCR)技术允许计算机通过扫描仪、摄像头等设备来识别并转换印刷或手写文本的图像数据为可编辑的文本格式。Tess4J是一个优秀的Java库,提供了与Tesseract OCR引擎的集成,方便进行图片…

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

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

cocos creator开发中遇到的问题和解决方案

前言 总结一下使用cocos开发遇到的坑,不定期更新。 问题汇总 代码修改Position坐标不生效 首先要通过打log或者断点排除下是不是逻辑上的问题,还有是不是有动画相关把位置修改了。我遇到的问题是坐标修改被widget组件覆盖了。 纹理压缩包体变大 co…

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…

Java 中什么是同步集合什么是并发集合,同步集合与并发集合有什么区别

该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 面试官:Java 中的同步集合与并发集合有什么区别 同步集合适用于简单的并发场景,其中线程对集合的访问和修改不频繁。而并发集合则更适用于高并发场景,其…

CorelDRAW2024破解注册机授权码分享

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

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

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

pyqt 标题栏设置

在PyQt中,可以通过QWidget或其子类(如QMainWindow或QDialog)的setWindowTitle()方法来设置窗口的标题栏。以下是一个简单的例子,展示了如何为应用程序的主窗口设置标题: import sys from PyQt5.QtWidgets import QApp…

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

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

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

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

java实现简易计算器

题目描述: 给定一个包含正整数、加()、减(-)、乘(*)、除(/)的算数表达式(括号除外),计算其结果。 表达式仅包含非负整数,, - ,*,/ 四种运算符和空格 。 整数除法仅保留整数部分。 示例 1: 输入: "…

FNP preptool has not been run on this executable

pycharm导入arcgis pro的python运行程序后提示 我也看了很多解决方法,也重新安装过一遍,终于看到一个说法是你的arcgis pro是学习版所以才会有这个提示,不会影响输入 测试代码 import arcpy print(arcpy.GetInstallInfo()[Version])输出结果…

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

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

【b站李同学的Lee】NodeJS+Gulp基础入门+实战

课程地址:【NodeJSGulp基础入门实战】 https://www.bilibili.com/video/BV1aE411n737/?share_sourcecopy_web&vd_sourceb1cb921b73fe3808550eaf2224d1c155 目录 1 Node 开发概述 1.1 为什么要学习服务器端开发基础 1.2 服务器端开发要做的事情 1.3 为什么…