当前位置: 首页 > news >正文

双向链表<数据结构 C版>

目录

关于链表的分类

 双向链表结构体

初始化

尾插

头插

打印

判断是否为空

尾删

头删

查找

指定位置之后的插入

指定位置的删除

销毁


关于链表的分类

根据链表的三大特性,单向or双向、带头or不带头、循环or不循环,可将链表分为2*2*2,8种链表,前面我们已经实现了单链表,即:不带头单向非循环链表,它的结构简单,不常用于单独存储数据,而是作为其他数据结构的子结构。

实际运用中,只有单链表(不带头单向非循环链表)和双向链表(带头双向循环链表)运用最多,带头双向循环链表,结构最复杂,常常运用于单独存储数据,使用的链表结构也几乎都是双向带头链表。

附上一张bit课件的图:


 双向链表结构体

放一张bi课件的图片很形象:

//重定义一下类型,方便统一修改
typedef int LNDataType;typedef struct ListNode {LNDataType data;//数据struct ListNode* prev;//前一个结点struct ListNode* next;//后一个结点
}LN;

初始化

双向链表的初始化,应创建一个哨兵结点(也称头结点),它存放的数据是无效数据(假定-1),

所以我们先实现一个创建单节点的函数:

//创建新节点
LN* LNBuyNode(LNDataType x) {LN* node = (LN*)malloc(sizeof(LN));//开辟空间if (!node) {//判断为空perror("malloc fail!");exit(1);}node->data = x;//传入数据node->next = node->prev = node;//双向循环链表单节点也应满足循环,不能初始化为NULL;return node;
}

接着我们就可方便地调用,创建一个哨兵结点:

//初始化
void LNInit(LN** pphead) {assert(pphead);*pphead=LNBuynode(-1);
}

尾插

//尾插
void LNPushBack(LN* phead, LNDataType x) {assert(phead);LN* node = LNBuyNode(x);//创建新结点node->next = phead;//先对新申请的结点参数进行操作,防止对原链表造成改变node->prev = phead->prev;phead->prev->next = node;//更改尾结点的next参数的指向phead->prev = node;//更改头结点prev结点的指向
}

运行测试一下:


头插

注意头插的操作是在哨兵位后插入,双向链表为空的情况也是只剩下哨兵位,因为哨兵位并没有存储有效数据。

//头插
void LNPushFront(LN* phead, LNDataType x) {assert(phead);LN* node = LNBuyNode(x);//创建新结点node->next = phead->next;//先对新申请的结点参数进行操作,防止对原链表造成改变node->prev = phead;phead->next->prev = node;//更改头结点的下一个结点的prev指向phead->next = node;//更改头结点的next指向
}

运行测试一下:


打印

//打印
void LNPrint(LN* phead) {assert(phead);LN* pcur = phead->next;//因为头结点内存储的是无效数据,所以我们让它指向下一个结点while (pcur!=phead) {//与头结点相遇说明我们已经遍历完整个链表了printf("%d->", pcur->data);pcur = pcur->next;}printf("\n");
}

判断是否为空

双向链表为空的情况是只有一个哨兵结点而不是NULL

//判断是否为空
bool LNEmpty(LN* phead) {assert(phead);return phead->next == phead;
}

尾删

//尾删
void LNPopBack(LN* phead) {assert(phead);assert(!LNEmpty(phead));//删除操作至少有一个有效数据//LNEmptys是空返回true,取反保证不为空LN* del = phead->prev;//保存要删除的结点phead->prev = del->prev;//对要受影响的结点的参数进行更改phead->prev->next = phead;free(del);//释放掉该地址del = NULL;
}

运行测试一下:


头删

//头删
void LNPopFront(LN* phead) {assert(phead);assert(!LNEmpty(phead));LN* del = phead->next;//保存要删除的结点phead->next = del->next;//对要受影响的结点的参数进行更改phead->next->prev = phead;free(del);//释放掉该地址del = NULL;
}

运行测试一下:


查找

因为后面涉及到任意位置的操作,所以这里要写一个查找方法:

//查找
LN* LNFind(LN* phead, LNDataType x) {assert(phead);assert(!LNEmpty(phead));LN* pcur = phead->next;while (pcur!=phead) {//判断条件为!=phead,遇到哨兵位说明已经遍历完if (pcur->data == x) {return pcur;}pcur = pcur->next;}return NULL;
}

运行测试一下:


指定位置之后的插入

//指定位置之后的插入
void LNInsert(LN* pos, LNDataType x) {assert(pos);LN* node = LNBuyNode(x);node->next = pos->next;//先对要受影响的结点的参数进行更改node->prev = pos;pos->next->prev = node;//更改pos结点的后一个结点的prev参数pos->next = node;//更改pos结点的next参数
}

运行测试一下:


指定位置的删除

//任意位置的删除
void LNErase(LN* pos) {assert(pos);pos->next->prev = pos->prev;pos->prev->next = pos->next;free(pos);pos = NULL;
}

运行测试一下:


销毁

//销毁
void LNDestory(LN** phead) {assert(phead && *phead);LN* pcur = (*phead)->next;while (pcur != *phead) {LN* next = pcur->next;free(pcur);pcur = next;}free(*phead);*phead =pcur= NULL;
}

相关文章:

双向链表<数据结构 C版>

目录 关于链表的分类 双向链表结构体 初始化 尾插 头插 打印 判断是否为空 尾删 头删 查找 指定位置之后的插入 指定位置的删除 销毁 关于链表的分类 根据链表的三大特性,单向or双向、带头or不带头、循环or不循环,可将链表分为2*2*2&#xf…...

react18+

主要是围绕函数式组件讲,18主要用就是函数式组件,学习前先熟悉下原生js的基本使用,主要是事件 1、UI操作 1.1、书写jsx标签语言 基本写法和原生如同一则,只是放在一个方法里面返回而已,我们称这样的写法为函数式组件…...

rk3568 OpenHarmony4.1 Launcher定制开发—桌面壁纸替换

Launcher 作为系统人机交互的首要入口,提供应用图标的显示、点击启动、卸载应用,并提供桌面布局设置以及最近任务管理等功能。本文将介绍如何使用Deveco Studio进行单独launcher定制开发、然后编译并下载到开发板,以通过Launcher修改桌面背景…...

MySQL:送分or送命 varchar(30) 与 int(10)

摘要: VARCHAR(30) 和 INT(10) 在MySQL中代表两种不同类型的字段,它们之间的主要区别在于它们存储的数据类型、存储方式以及显示宽度的含义。 正文: INT(10) 在MySQL中,当你看到INT(10)这样的数据类型定义时,可能会…...

【odoo17】后端py方法触发右上角提示组件

概要 在前面文章中,有介绍过前端触发的通知服务。 【odoo】右上角的提示(通知服务) 此文章则介绍后端触发方法。 内容 直接上代码:但是前提一定是按钮触发!!!!! def bu…...

1775D - Friendly Spiders

题目链接:Friendly Spiders 首先我们可以考虑暴力做法,那就是每两个蜘蛛判断一下gcd,如果不等于1,那就连条边,这样的话时间复杂度是O(n^2),显然超时,因此我们可以采用类似…...

【python】OpenCV—Point Polygon Test

文章目录 1、完整代码2、涉及到的库cv2.pointPolygonTestcv2.minMaxLoc 1、完整代码 from __future__ import print_function from __future__ import division import cv2 as cv import numpy as np # Create an image r 100 src np.zeros((4*r, 4*r), dtypenp.uint8) # 创…...

6 Go语言的常量、枚举、作用域

本专栏将从基础开始,循序渐进,由浅入深讲解Go语言,希望大家都能够从中有所收获,也请大家多多支持。 查看相关资料与知识库 专栏地址:Go专栏 如果文章知识点有错误的地方,请指正!大家一起学习,…...

第十一章 数据结构

第十一章 数据结构 11.1 数组 数组是元素的顺序集合,通常这些元素具有相同的数据类型 索引表示元素在数组中的顺序号,顺序号从数组开始处计数 数组元素通过索引被独立给出了地址,数组整体上有一个名称,但每个元素利用数组的的…...

LeetCode704 二分查找

前言 题目: 704.二分查找 文档: 代码随想录——二分查找 编程语言: C 解题状态: 解答错误,变量定义位置错误。 思路 有序数组的查找,最直接的思路应该就是二分查找。但是在查找的过程中要考虑到区间的边界…...

[言简意赅] Matlab生成FPGA端rom初始化文件.coe

🎎Matlab生成FPGA端rom初始化文件.coe 本文主打言简意赅。 函数源码 function gencoeInitialROM(width, depth, signal, filepath)% gencoeInitialROM - 生成 Xilinx ROM 初始化格式的 COE 文件%% 输入参数:% width - ROM 数据位宽% depth - ROM 数据深度% s…...

【QAC】分布式部署下其他机器如何连接RLM

1、 文档目标 解决分布式部署下其他机器如何连接RLMLicense管理器。 2、 问题场景 分布式部署下QAC要在其他机器上单独运行扫描,必须先连接RLMLicense管理器,如何连接? 3、软硬件环境 1、软件版本:HelixQAC23.04 2、机器环境…...

从等保测评看行业安全趋势:洞察与预测

在当今数字化时代,网络安全已成为各行各业的头等大事。等保测评(等级保护测评),作为国家对信息系统安全的重要管理手段,不仅关乎企业的合规性,更是行业安全水平的重要衡量标准。本文将从等保测评的视角出发…...

HTTP模块(二)

HTTP 设置 HTTP 响应报文 HTTP报文常见属性: const http require(http);const server http.createServer((request, response) > {// 设置请求状态码 2xx 4xx 5xxresponse.statusCode 200;// 设置请求描述 了解即可response.statusMessage hello// 指定响…...

引入缓存带来的问题以及解决方案

目录 前言 问题与解决方案 缓存击穿 缓存穿透 缓存雪崩 缓存一致性 前言 在提升接口性能的方案中,毫无疑问,使用缓存是最有效果的,但同时也会带来新的问题。 缓存击穿缓存穿透缓存雪崩缓存一致性 以上问题都是引入缓存需要考虑的&am…...

力扣39题:组合总和的 Java 实现

引言 力扣(LeetCode)是一个在线编程平台,提供了大量的编程题目供开发者练习。第39题“组合总和”是一个经典的回溯算法问题,要求找出所有可能的组合,使得组合中的数字之和等于给定的目标值。本文将介绍如何使用 Java …...

使用el-table实现自动滚动

文章目录 概要技术实现完整代码 概要 在前端开发大屏的时候,我们会用到表格数据展示,有时候为了使用户体验更加好,会增加表格自动滚动。下边我将以示例代码,用element UI的el-table来讲一下。 技术实现 1 .增加dom监听&#xf…...

Angular由一个bug说起之八:实践中遇到的一个数据颗粒度的问题

互联网产品离不开数据处理,数据处理有一些基本的原则包括:准确性、‌完整性、‌一致性、‌保密性、‌及时性。‌ 准确性:是数据处理的首要目标,‌确保数据的真实性和可靠性。‌准确的数据是进行分析和决策的基础,‌因此…...

day13(DNS域名解析)

今天内容: 1、逆向解析 2、多域名 3、时间服务器 4、主从配置 1.设置逆向解析 (1)永久配置我们自己的DNS服务器 (2)关闭NetworkManager服务 NetworkManager 的自动管理功能可能会干扰定制化的网络配置。 在需要切换…...

uboot的mmc partconf命令

文章目录 命令格式参数解释具体命令解释总结 mmc partconf 是一个用于配置 MMC (MultiMediaCard) 分区的 U-Boot 命令。具体来说,这个命令允许你设置或读取 MMC 卡的分区配置参数。让我们详细解释一下 mmc partconf 0 0 1 0 命令的含义。 命令格式 mmc partconf &…...

蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练

前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1):从基础到实战的深度解析-CSDN博客,但实际面试中,企业更关注候选人对复杂场景的应对能力(如多设备并发扫描、低功耗与高发现率的平衡)和前沿技术的…...

智能在线客服平台:数字化时代企业连接用户的 AI 中枢

随着互联网技术的飞速发展,消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁,不仅优化了客户体验,还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用,并…...

ip子接口配置及删除

配置永久生效的子接口,2个IP 都可以登录你这一台服务器。重启不失效。 永久的 [应用] vi /etc/sysconfig/network-scripts/ifcfg-eth0修改文件内内容 TYPE"Ethernet" BOOTPROTO"none" NAME"eth0" DEVICE"eth0" ONBOOT&q…...

AI语音助手的Python实现

引言 语音助手(如小爱同学、Siri)通过语音识别、自然语言处理(NLP)和语音合成技术,为用户提供直观、高效的交互体验。随着人工智能的普及,Python开发者可以利用开源库和AI模型,快速构建自定义语音助手。本文由浅入深,详细介绍如何使用Python开发AI语音助手,涵盖基础功…...

git: early EOF

macOS报错: Initialized empty Git repository in /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core/.git/ remote: Enumerating objects: 2691797, done. remote: Counting objects: 100% (1760/1760), done. remote: Compressing objects: 100% (636/636…...

华为OD最新机试真题-数组组成的最小数字-OD统一考试(B卷)

题目描述 给定一个整型数组,请从该数组中选择3个元素 组成最小数字并输出 (如果数组长度小于3,则选择数组中所有元素来组成最小数字)。 输入描述 行用半角逗号分割的字符串记录的整型数组,0<数组长度<= 100,0<整数的取值范围<= 10000。 输出描述 由3个元素组成…...

comfyui 工作流中 图生视频 如何增加视频的长度到5秒

comfyUI 工作流怎么可以生成更长的视频。除了硬件显存要求之外还有别的方法吗&#xff1f; 在ComfyUI中实现图生视频并延长到5秒&#xff0c;需要结合多个扩展和技巧。以下是完整解决方案&#xff1a; 核心工作流配置&#xff08;24fps下5秒120帧&#xff09; #mermaid-svg-yP…...

【HarmonyOS 5】鸿蒙中Stage模型与FA模型详解

一、前言 在HarmonyOS 5的应用开发模型中&#xff0c;featureAbility是旧版FA模型&#xff08;Feature Ability&#xff09;的用法&#xff0c;Stage模型已采用全新的应用架构&#xff0c;推荐使用组件化的上下文获取方式&#xff0c;而非依赖featureAbility。 FA大概是API7之…...

Qt的学习(二)

1. 创建Hello Word 两种方式&#xff0c;实现helloworld&#xff1a; 1.通过图形化的方式&#xff0c;在界面上创建出一个控件&#xff0c;显示helloworld 2.通过纯代码的方式&#xff0c;通过编写代码&#xff0c;在界面上创建控件&#xff0c; 显示hello world&#xff1b; …...

【笔记】AI Agent 项目 SUNA 部署 之 Docker 构建记录

#工作记录 构建过程记录 Microsoft Windows [Version 10.0.27871.1000] (c) Microsoft Corporation. All rights reserved.(suna-py3.12) F:\PythonProjects\suna>python setup.py --admin███████╗██╗ ██╗███╗ ██╗ █████╗ ██╔════╝…...