【数据结构】双向链表(C语言)
哈喽铁子们,这里是博主鳄鱼皮坡。这篇文章将分享交流双向链表的相关知识,下面正式开始。
1. 双向链表的结构

2. 双向链表的实现

以尾插为例:
第一步:assert(phead); 防止为空。
第二步:创建新节点,和单链表一样用LTBuyNode()函数即可。
第三步:先将新节点指向原链表,由双向链表的特性,我们就不需要像单链表一样遍历去找。newnode->prev即为上图的d3。
(1) newnode->prev = phead->prev;先将新节点的头部指向原链表的最后一个节点,即d3。
(2) newnode->next = phead;而后将新节点的尾部指向原链表的哨兵位。
第四步:将原链表相应的位置指向新节点
(1)phead->prev->next = newnode;原链表的最后节点尾部指向新节点
(2)phead->prev = newnode;原链表的哨兵位头部指向新节点
//尾插
void LTPushBack(LTNode* phead, LTDataType x)
{assert(phead);LTNode* newnode = LTBuyNode(x);//phead phead->prev newnodenewnode->prev = phead->prev;newnode->next = phead;phead->prev->next = newnode;phead->prev = newnode;
}
只要理清楚双向链表节点的指向关系,之后和单链表结构相似。
双链表的代码如下:
//List.c
#include"List.h"void LTPrint(LTNode* phead)
{LTNode* pcur = phead->next;while (pcur != phead){printf("%d->", pcur->data);pcur = pcur->next;}printf("\n");
}//申请节点
LTNode* LTBuyNode(LTDataType x)
{LTNode* node = (LTNode*)malloc(sizeof(LTNode));if (node == NULL){perror("malloc fail!");exit(1);}node->data = x;node->next = node->prev = node;return node;
}
//初始化
//void LTInit(LTNode** pphead)
//{
// //给双向链表创建一个哨兵位
// *pphead = LTBuyNode(-1);
//}
LTNode* LTInit()
{LTNode* phead = LTBuyNode(-1);return phead;
}//尾插
void LTPushBack(LTNode* phead, LTDataType x)
{assert(phead);LTNode* newnode = LTBuyNode(x);//phead phead->prev newnodenewnode->prev = phead->prev;newnode->next = phead;phead->prev->next = newnode;phead->prev = newnode;
}//头插
void LTPushFront(LTNode* phead, LTDataType x)
{assert(phead);LTNode* newnode = LTBuyNode(x);//phead newnode phead->nextnewnode->next = phead->next;newnode->prev = phead;phead->next->prev = newnode;phead->next = newnode;
}//尾删
void LTPopBack(LTNode* phead)
{//链表必须有效且链表不能为空(只有一个哨兵位)assert(phead && phead->next != phead);LTNode* del = phead->prev;//phead del->prev deldel->prev->next = phead;phead->prev = del->prev;//删除del节点free(del);del = NULL;
}//头删
void LTPopFront(LTNode* phead)
{assert(phead && phead->next != phead);LTNode* del = phead->next;//phead del del->nextphead->next = del->next;del->next->prev = phead;//删除del节点free(del);del = NULL;
}LTNode* LTFind(LTNode* phead, LTDataType x)
{LTNode* pcur = phead->next;while (pcur != phead){if (pcur->data == x){return pcur;}pcur = pcur->next;}//没有找到return NULL;
}//在pos位置之后插入数据
void LTInsert(LTNode* pos, LTDataType x)
{assert(pos);LTNode* newnode = LTBuyNode(x);//pos newnode pos->nextnewnode->next = pos->next;newnode->prev = pos;pos->next->prev = newnode;pos->next = newnode;
}//删除pos节点
void LTErase(LTNode* pos)
{//pos理论上来说不能为phead,但是没有参数phead,无法增加校验assert(pos);//pos->prev pos pos->nextpos->next->prev = pos->prev;pos->prev->next = pos->next;free(pos);pos = NULL;
}void LTDesTroy(LTNode* phead)
{assert(phead);LTNode* pcur = phead->next;while (pcur != phead){LTNode* next = pcur->next;free(pcur);pcur = next;}//此时pcur指向phead,而phead还没有被销毁free(phead);phead = NULL;
}
//List.h
#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>//定义节点的结构
//数据 + 指向下一个节点的指针
typedef int SLTDataType;typedef struct SListNode {SLTDataType data;struct SListNode* next;
}SLTNode;void SLTPrint(SLTNode* phead);//尾插
void SLTPushBack(SLTNode** pphead, SLTDataType x);
//头插
void SLTPushFront(SLTNode** pphead, SLTDataType x);
//尾删
void SLTPopBack(SLTNode** pphead);
//头删
void SLTPopFront(SLTNode** pphead);//查找
SLTNode* SLTFind(SLTNode* phead, SLTDataType x);//在指定位置之前插入数据
void SLTInsert(SLTNode** pphead, SLTNode* pos, SLTDataType x);
//在指定位置之后插入数据
void SLTInsertAfter(SLTNode* pos, SLTDataType x);//删除pos节点
void SLTErase(SLTNode** pphead, SLTNode* pos);
//删除pos之后的节点
void SLTEraseAfter(SLTNode* pos);//销毁链表
void SListDesTroy(SLTNode** pphead);
3. 顺序表和双向链表的优缺点分析
| 不同点 | 顺序表 | 链表(单链表) |
| 存储空间上 | 物理上⼀定连续 | 逻辑上连续,但物理上不⼀定连续 |
| 随机访问 | ⽀持O(1) | 不⽀持:O(N) |
| 任意位置插⼊或者删除元素 | 可能需要搬移元素,效率低O(N) | 只需修改指针指向 |
| 插⼊ | 动态顺序表,空间不够时需要扩容 | 没有容量的概念 |
| 应⽤场景 | 元素⾼效存储+频繁访问 | 任意位置插⼊和删除频繁 |
在接下来我们将会学习利用实现贪吃蛇小游戏等有意思的东西,如果本篇有不理解的地方,欢迎私信我或在评论区指出,期待与你们共同进步。创作不易,望各位大佬一键三连!
相关文章:
【数据结构】双向链表(C语言)
哈喽铁子们,这里是博主鳄鱼皮坡。这篇文章将分享交流双向链表的相关知识,下面正式开始。 1. 双向链表的结构 注意:这里的“带头”跟前面我们说的“头节点”是两个概念,实际前面的在单链表阶段称呼不严 谨,但是为了老…...
【TensorFlow深度学习】WGAN与DCGAN在图像生成中的应用实例
WGAN与DCGAN在图像生成中的应用实例 WGAN与DCGAN在图像生成中的应用实例:一场深度学习的视觉盛宴DCGAN简介WGAN简介应用实例:基于DCGAN的图像生成应用实例:WGAN的图像生成实践结语 WGAN与DCGAN在图像生成中的应用实例:一场深度学习…...
垫付商贩任务补单平台补单系统网站源码提供
垫付商贩任务补单平台补单系统网站源码提供...
vue富文本wangeditor加@人功能(vue2 vue3都可以)
依赖 "wangeditor/editor": "^5.1.23", "wangeditor/editor-for-vue": "^5.1.12", "wangeditor/plugin-mention": "^1.0.0",RichEditor.vue <template><div style"border: 1px solid #ccc; posit…...
######## redis各章节终篇索引(更新中) ############
其他 父子关系(ctx、协程)#### golang存在的父子关系 ####_子goroutine panic会导致父goroutine挂掉吗-CSDN博客 参数传递(slice、map)#### go中参数传递(涉及:切片slice、map、channel等) ###…...
一个基于MySQL的数据库课程设计的基本框架
数据库课程设计(MySQL)通常涉及多个步骤,以确保数据库的有效设计、实现和维护。以下是一个基于MySQL的数据库课程设计的基本框架,结合参考文章中的相关信息进行整理: ### 一、引言 * **背景**:简要介绍为…...
架构设计基本原则
开闭原则 开闭原则(Open Closed Principle,OCP)是面向对象编程(OOP)中的一个核心原则,主要强调的是软件实体(类、模块、函数等)应该对扩展开放,对修改封闭。 解释&…...
云原生应用开发培训,开启云计算时代的新征程
在云计算时代,云原生应用开发技术已经成为IT领域的热门话题。如果您想要转型至云原生领域,我们的云原生应用开发培训将帮助您开启新征程。 我们的课程内容涵盖了云原生技术的基础概念、容器技术、微服务架构、持续集成与持续发布(CI/CD&#…...
【数据库设计】宠物商店管理系统
目录 🌊1 问题的提出 🌊2 需求分析 🌍2.1 系统目的 🌍2.2 用户需求 🌻2.2.1 我国宠物行业作为新兴市场,潜力巨大 🌻2.2.2 我国宠物产品消费规模逐年增大 🌻2.2.3 我国宠物主选…...
前端 JS 经典:node 的模块查找策略
前言:我们引入模块后,node 大概的查找步骤分为 文件查找、文件夹查找、内置模块查找、第三方模块查找,在 node 中使用 ESM 模块语法,需要创建 package.json 文件,并将 type 设置为 module。简单起见,我们用…...
C++中的23种设计模式
目录 摘要 创建型模式 1. 工厂方法模式(Factory Method Pattern) 2. 抽象工厂模式(Abstract Factory Pattern) 3. 单例模式(Singleton Pattern) 4. 生成器模式(Builder Pattern࿰…...
vue.js+node.js+mysql在线聊天室源码
vue.jsnode.jsmysql在线聊天室源码 技术栈:vue.jsElement UInode.jssocket.iomysql vue.jsnode.jsmysql在线聊天室源码...
浏览器无痕模式和非无痕模式的区别
无痕模式 1. 历史记录:在无痕模式下,浏览器不会保存浏览记录、下载记录、表单数据和Cookies。当你关闭无痕窗口后,这些信息都会被删除。 2. Cookies:无痕模式会在会话期间临时存储Cookies,但在关闭无痕窗口…...
WPF框架,修改ComboBox控件背景色 ,为何如此困难?
直接修改Background属性不可行 修改控件背景颜色,很多人第一反应便是修改Background属性,但是修改过后便会发现,控件的颜色没有发生任何变化。 于是在网上搜索答案,便会发现一个异常尴尬的情况,要么就行代码简单但是并…...
Diffusers代码学习: 文本引导深度图像生成
StableDiffusionDepth2ImgPipeline允许传递文本提示和初始图像,以调节新图像的生成。此外,还可以传递depth_map以保留图像结构。如果没有提供depth_map,则管道通过集成的深度估计模型自动预测深度。 # 以下代码为程序运行进行设置 import o…...
网络的下一次迭代:AVS 将为 Web2 带去 Web3 的信任机制
撰文:Sumanth Neppalli,Polygon Ventures 编译:Yangz,Techub News 本文来源香港Web3媒体:Techub News AVS (主动验证服务)将 Web2 的规模与 Web3 的信任机制相融合,开启了网络的下…...
OpenCV 的模板匹配
OpenCV中的模板匹配 模板匹配(Template Matching)是计算机视觉中的一种技术,用于在大图像中找到与小图像(模板)相匹配的部分。OpenCV提供了多种模板匹配的方法,主要包括基于相关性和基于平方差的匹配方法。…...
26.0 Http协议
1. http协议简介 HTTP(Hypertext Transfer Protocol, 超文本传输协议): 是万维网(WWW: World Wide Web)中用于在服务器与客户端(通常是本地浏览器)之间传输超文本的协议.作为一个应用层的协议, HTTP以其简洁, 高效的特点, 在分布式超媒体信息系统中扮演着核心角色. 自1990年提…...
IO流打印流
打印流 IO流打印流是Java中用来将数据打印到输出流的工具。打印流提供了方便的方法来格式化和输出数据,可以用于将数据输出到控制台、文件或网络连接。 分类:打印流一般是指:PrintStream,PrintWriter两个类 特点1:打印流只操作文件目的地,…...
Cohere reranker 一致的排序器
这本notebook展示了如何在检索器中使用 Cohere 的重排端点。这是在 ContextualCompressionRetriever 的想法基础上构建的。 %pip install --upgrade --quiet cohere %pip install --upgrade --quiet faiss# OR (depending on Python version)%pip install --upgrade --quiet…...
CLIP图文匹配测试工具实战:上传商品图,自动匹配最佳描述文案
CLIP图文匹配测试工具实战:上传商品图,自动匹配最佳描述文案 1. 工具价值与核心功能 电商运营每天都要处理大量商品图片与文案的匹配工作,传统人工筛选效率低下且容易出错。这款基于CLIP-GmP-ViT-L-14模型的图文匹配测试工具,正…...
Nanbeige 4.1-3B惊艳效果展示:黄金色强调色×森林绿贤者气泡动态生成实录
Nanbeige 4.1-3B惊艳效果展示:黄金色强调色森林绿贤者气泡动态生成实录 1. 复古像素风AI对话新体验 在当今AI交互界面普遍追求极简风格的趋势下,Nanbeige 4.1-3B带来了一股清新之风。这套专为4.1-3B模型设计的像素游戏风对话前端,将AI对话体…...
干货来了:学生热捧的降AI率软件 —— 千笔
在AI技术席卷学术写作的今天,越来越多的学生、研究人员和职场人士选择借助AI辅助完成论文、报告和学术材料。然而,随之而来的“AI率超标”问题却成为横亘在学术道路上的隐形障碍——知网、维普、万方等主流查重系统纷纷升级算法,严打AI生成内…...
仓储空间智能管理平台:融合动态三维建模与行为分析的全域感知系统
《仓储空间智能管理平台:融合动态三维建模与行为分析的全域感知系统》副标题:基于 Pixel-to-Space 的空间感知与智能决策一体化平台发布单位:镜像视界(浙江)科技有限公司一、引言:仓储管理正在从“系统化”…...
Vscode Git插件实战:5分钟搞定自动驾驶代码版本管理(附Git History配置)
Vscode Git插件实战:5分钟搞定自动驾驶代码版本管理(附Git History配置) 自动驾驶领域的代码开发往往涉及复杂的算法迭代和频繁的版本更新。对于使用Apollo等开源框架的工程师来说,高效的代码版本管理工具不仅能节省时间ÿ…...
UG CAM API 获取、设置切削层中的切削方式类型方法,如设置仅底面、恒定、临界深度的类型
/*这里operTag为一个工序操作,可以是已经创建好的操作,也可以是新创建的操作。获取或设置切削层的类型方式,使用 UF_PARAM_CUTLEV_METHOD,具体查看以下代码 */ tag_t operTag; //这里请根据你的功能需求获得operTag//获取切削层中…...
mrpack-install:高效部署Modpack的创新方案
mrpack-install:高效部署Modpack的创新方案 【免费下载链接】mrpack-install Modrinth Modpack server deployment 项目地址: https://gitcode.com/gh_mirrors/mr/mrpack-install 一、问题:Minecraft服务器部署的痛点 搭建Minecraft模组服务器时…...
Qwen-Image镜像新手实操:RTX4090D上用Qwen-VL完成考试题图识别与答案推理
Qwen-Image镜像新手实操:RTX4090D上用Qwen-VL完成考试题图识别与答案推理 1. 环境准备与快速部署 1.1 硬件要求确认 在开始之前,请确保您的设备满足以下要求: GPU:RTX 4090D(24GB显存)内存:…...
别再让业务同事催你取数了!用Java+SpringBoot手把手搭建一个ChatBI数据助手
用JavaSpringBoot构建智能数据助手:告别重复取数烦恼 每次业务同事发来"帮我查一下上个月华东区的销售数据"这类需求时,你是否感到疲惫?作为Java开发者,我们可以用技术改变这种被动局面。本文将带你从零开始,…...
快速上手Qwen3-Embedding-4B:构建可视化知识库,搜索效率翻倍
快速上手Qwen3-Embedding-4B:构建可视化知识库,搜索效率翻倍 1. 告别关键词搜索:为什么你需要语义搜索? 想象一下这个场景:你正在为公司搭建一个内部知识库,里面存放了上千份技术文档、会议纪要和产品手册…...
