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

数据结构——双向链表(C语言版)

上一章:数据结构——单向链表(C语言版)-CSDN博客

目录

什么是双向链表?

双向链表的节点结构

双向链表的基本操作

完整的双向链表示例

总结


什么是双向链表?

双向链表是一种常见的数据结构,它由一系列节点组成,每个节点包含两个指针:一个指向前一个节点,一个指向后一个节点。双向链表可以在任意位置高效地插入和删除节点,相比单向链表,双向链表可以双向遍历,但相应地需要更多的内存空间存储额外的指针。

双向链表的节点结构
typedef struct Node {int data;struct Node* prev;struct Node* next;
} Node;
双向链表的基本操作
  1. 初始化双向链表

    Node* initLinkedList() {Node* head = (Node*)malloc(sizeof(Node));head->prev = NULL;head->next = NULL;return head;
    }
  2. 插入节点 

    void insertNode(Node* prevNode, int data) 
    { Node* newNode = (Node*)malloc(sizeof(Node)); 
    newNode->data = data;newNode->prev = prevNode;newNode->next = prevNode->next;prevNode->next->prev = newNode;prevNode->next = newNode;}

    3.删除节点

void deleteNode(Node* delNode) {delNode->prev->next = delNode->next;delNode->next->prev = delNode->prev;free(delNode);
}
  1. 遍历双向链表
    void printLinkedList(Node* head) {Node* current = head->next;while (current != NULL) {printf("%d ", current->data);current = current->next;}printf("\\n");
    }
完整的双向链表示例
#include <stdio.h>
#include <stdlib.h>typedef struct Node {int data;struct Node* prev;struct Node* next;
} Node;Node* initLinkedList() {Node* head = (Node*)malloc(sizeof(Node));head->prev = NULL;head->next = NULL;return head;
}void insertNode(Node* prevNode, int data) {Node* newNode = (Node*)malloc(sizeof(Node));newNode->data = data;newNode->prev = prevNode;newNode->next = prevNode->next;prevNode->next->prev = newNode;prevNode->next = newNode;
}void deleteNode(Node* delNode) {delNode->prev->next = delNode->next;delNode->next->prev = delNode->prev;free(delNode);
}void printLinkedList(Node* head) {Node* current = head->next;while (current != NULL) {printf("%d ", current->data);current = current->next;}printf("\\n");
}int main() {Node* head = initLinkedList();insertNode(head, 1);insertNode(head->next, 2);insertNode(head->next->next, 3);printLinkedList(head);deleteNode(head->next);printLinkedList(head);return 0;
}
总结

通过上述代码示例,我们实现了双向链表的基本操作,包括初始化、插入和删除节点,以及遍历链表。双向链表是一种灵活且高效的数据结构,适用于需要频繁插入和删除操作的场景。通过深入理解双向链表的实现原理,我们可以更好地应用它解决实际问题。

由以上内容我们其实就可以看到在应用与理解层面,双向链表相较于单向链表有很大的优势,但在具体应用中还需要我们实际情况实际判断。

感谢观看,还请各位大佬点赞支持以下!!!

相关文章:

数据结构——双向链表(C语言版)

上一章&#xff1a;数据结构——单向链表&#xff08;C语言版&#xff09;-CSDN博客 目录 什么是双向链表&#xff1f; 双向链表的节点结构 双向链表的基本操作 完整的双向链表示例 总结 什么是双向链表&#xff1f; 双向链表是一种常见的数据结构&#xff0c;它由一系列节…...

缓存雪崩、缓存穿透、缓存预热、缓存更新、缓存降级等问题

一、缓存雪崩 简单理解&#xff1a;由于原有缓存失效&#xff0c;新缓存未到期间 (例如&#xff1a;设置缓存时采用了相同的过期时间&#xff0c;在同一时刻出现大面积的缓存过期)&#xff0c;所有原本应该访问缓存的请求都去查询数据库了&#xff0c;而对数据库CPU和内存造成…...

深度学习pytorch——多层感知机反向传播(持续更新)

在讲解多层感知机反向传播之前&#xff0c;先来回顾一下多输出感知机的问题&#xff0c;下图是一个多输出感知机模型&#xff1a; 课时44 反向传播算法-1_哔哩哔哩_bilibili 根据上一次的分析深度学习pytorch——感知机&#xff08;Perceptron&#xff09;&#xff08;持续更新…...

五、分布式锁-redission

源码仓库地址&#xff1a;gitgitee.com:chuangchuang-liu/hm-dingping.git 1、redission介绍 目前基于redis的setnx特性实现的自定义分布式锁仍存在的问题&#xff1a; 问题描述重入问题同一个线程无法多次获取统一把锁。当方法A成功获取锁后&#xff0c;调用方法B&#xff0…...

ARM的三个按键实验

main.c #include "key_inc.h"//封装延时函数void delay(int ms){int i,j;for(i0;i<ms;i){for(j0;j<2000;j){}}}int main(){//按键中断初始化key1_it_config();key2_it_config();key3_it_config();while(1){printf("in main pro\n");delay(1000);}re…...

高架学习笔记之需求工程

目录 一、什么是软件需求 二、需求工程 2.1. 需求获取 2.2. 需求分析 2.3. 形成需求规格 2.4. 需求确认 2.5. 需求管理 2.5.1. 变更控制 2.5.2. 版本控制 2.5.3. 需求跟踪 2.5.4. 需求状态跟踪 一、什么是软件需求 软件需求目前没有统一的定义&#xff0c;一般是指用…...

mysql基础2多表查询

多表查询 多表关系: 一对多 案例: 部门 与 员工的关系 关系: 一个部门对应多个员工&#xff0c;一个员工对应一个部门 实现: 在多的一方建立外键&#xff0c;指向一的一方的主键 多对多 案例: 学生 与 课程的关系 关系: 一个学生可以选修多门课程&#xff0c;一门课程也可以…...

Qt 写一个邮件发送程序

最近在完成一个邮箱代替的告警功能&#xff0c;写了一个邮件发送的demo 以下为代码&#xff1a; #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow> #include<QTcpSocket> namespace Ui { class MainWindow; }class MainWindow : public QMainWin…...

swagger3快速使用

目录 &#x1f37f;1.导入依赖 &#x1f32d;2.添加配置文件 &#x1f9c2;3.添加注解 &#x1f96f;4.访问客户端 1.导入依赖 引入swagger3的依赖包 <dependency><groupId>io.springfox</groupId><artifactId>springfox-boot-starter</artif…...

一键入门Ubuntu22!

目录 一、安装 二、常用目录 三、常用指令 四、用户指令 五、ssh与scp 六、服务相关 七、Python与Pycharm 八、Vim编辑器 九、Ubuntu22下使用Mysql 十、Ubuntu22下使用mongodb 十一、Ubuntu22下使用redis Ubuntu是一个基于Debian的开源操作系统&#xff0c;由Canoni…...

阿里云服务器价格购买价格表,2024新版报价查询

2024年腾讯云服务器优惠价格表&#xff0c;一张表整理阿里云服务器最新报价&#xff0c;阿里云服务器网整理云服务器ECS和轻量应用服务器详细CPU内存、公网带宽和系统盘详细配置报价单&#xff0c;大家也可以直接移步到阿里云CLUB中心查看 aliyun.club 当前最新的云服务器优惠券…...

实现防抖函数并支持第一次立刻执行(vue3 + ts环境演示)

1、先看一效果&#xff1a; 2、实现思路&#xff1a; 使用定时器setTimeout和闭包实现常规防抖功能&#xff1b;增加immediate字段控制第一次是否执行一次函数&#xff08;true or false&#xff09;&#xff1b;增加一个flag标识&#xff0c;在第一次执行时&#xff0c;将标…...

WPF —— DataGrid数据网格

1 &#xff1a;DataGrid简介 DataGrid 是数据网格 : 可以显示网格数据的控件&#xff0c;通过自定义列模版 来去实现各种网格效果 &#xff0c; 可以使用以下几中标签显示不同数据 2 &#xff1a;DataGrid常用的组件 显示文本: DataGridTextColumn 显示复选框: DataGridChec…...

牛客题霸-SQL进阶篇(刷题记录一)

本文基于前段时间学习总结的 MySQL 相关的查询语法&#xff0c;在牛客网找了相应的 MySQL 题目进行练习&#xff0c;以便加强对于 MySQL 查询语法的理解和应用。 由于涉及到的数据库表较多&#xff0c;因此本文不再展示&#xff0c;只提供 MySQL 代码与示例输出。 部分题目因…...

网络安全实训Day12

写在前面 注意根据笔记中的缩进判断该文本所在层级。 网络空间安全实训-网络安全技术 SSL VPN SSL协议 定义&#xff1a;一种应用层的安全保护技术 工作流程 1.客户端与服务器通过三次握手建立TCP连接 2.客户端向服务器发送Client-Hello信息&#xff0c;消息中包含希望访问的…...

对话Midjourney创始人:图片仅是起步,人工智能将全面改变学习、创意和组织。

ChatGPT狂飙160天&#xff0c;世界已经不是之前的样子。 新建了人工智能中文站https://ai.weoknow.com 每天给大家更新可用的国内可用chatGPT资源 ​ 发布在https://it.weoknow.com 关注我 Midjourney 是一家神奇的公司&#xff0c;11 人改变世界&#xff0c;创造伟大的产品。…...

Elasticsearch:将 ILM 管理的数据流迁移到数据流生命周期

警告&#xff1a;此功能处于技术预览阶段&#xff0c;可能会在未来版本中更改或删除。 Elastic 将努力解决任何问题&#xff0c;但技术预览版中的功能不受官方 GA 功能的支持 SLA 的约束。目前的最新版本为 8.12。 在本教程中&#xff0c;我们将了解如何将现有数据流&#xff0…...

LeetCode刷题记录——day6

1、https://leetcode.cn/problems/length-of-last-word/description/?envTypestudy-plan-v2&envIdtop-interview-150 直接从后往前遍历就好 class Solution { public:int lengthOfLastWord(string s) {int length0;int lens.length();for(int ilen-1;i>0;i--){if(s[i]…...

C++String类

1. 前言 String是C中操作字符串的类&#xff0c;它是在比较早的时候设计的STL模板&#xff0c;因此在某些地方设计的有些冗余 对于String类&#xff0c;不仅仅是学会使用它&#xff0c;更重要的是要从底层去理解它&#xff1b;本篇文章将从底层出发&#xff0c;模拟实现常用的S…...

Linux docker7--私有镜像仓库registry和UI搭建及使用

一、对于开源的镜像&#xff0c;如redis&#xff0c;nginx等&#xff0c;可以通过官方仓库Docker Hub&#xff0c;或者国内的阿里云等共有仓库下载获取到镜像。但是企业内对于自己的研发产品不可能往公共仓库去发布镜像的&#xff0c;一般都会搭建私有的镜像仓库&#xff0c;保…...

深度学习模型压缩:从理论到实践

深度学习模型压缩&#xff1a;从理论到实践 1. 背景与意义 深度学习模型在取得显著性能提升的同时&#xff0c;也带来了模型规模的急剧增长。大型模型往往需要大量的计算资源和内存&#xff0c;这限制了它们在资源受限设备上的部署。模型压缩技术的意义在于&#xff1a; 减少模…...

从TUM数据集评测到真实项目:手把手教你评估ORB-SLAM3的实战表现

从TUM数据集到真实场景&#xff1a;ORB-SLAM3性能评估全流程实战指南 当你在TUM数据集上运行完ORB-SLAM3&#xff0c;看着终端里不断输出的位姿数据&#xff0c;是否曾思考过这些数字背后真正的含义&#xff1f;如何从冰冷的轨迹文件中提炼出对算法性能的深刻理解&#xff1f;本…...

【花雕学编程】嵌入式 AI Agent:从云端到终端,开启物理世界智能新范式

【花雕学编程】嵌入式 AI Agent&#xff1a;从云端到终端&#xff0c;开启物理世界智能新范式 ——当 AI 不再只是屏幕里的聊天窗口&#xff0c;而是真正走进工厂、家庭和城市——嵌入式 AI Agent 正在重新定义“智能”的边界 引言 当下 AI 热潮的本质&#xff0c;是对“AI 从云…...

UniApp安卓端MQTT连接踩坑记:mqtt.js 3.0版本与原生插件到底怎么选?

UniApp安卓端MQTT方案深度对比&#xff1a;从协议适配到性能优化的实战指南 去年接手一个智能家居控制项目时&#xff0c;我曾在mqtt.js和原生插件之间反复横跳。那个凌晨三点还在调试WSS协议的夜晚让我明白——技术选型从来不是非黑即白的选择题。本文将用真实项目经验&#…...

php中闭包(Closure)的bindTo函数用法详解

Closure::bindTo 是 PHP 中的一个方法&#xff0c;用于改变闭包&#xff08;Closure&#xff09;内部的 $this 上下文以及其静态范围。这意味着你可以将一个闭包从一个对象或类绑定到另一个对象或类上&#xff0c;使其在调用时使用新的上下文。这对于在不同的对象实例间复用闭包…...

基于N2N实现Windows异地局域网联机:从公网服务器搭建到游戏联机实战

1. 为什么需要异地局域网联机&#xff1f; 和朋友联机打游戏是很多玩家的刚需&#xff0c;尤其是《文明6》《我的世界》这类支持局域网联机的游戏。但传统局域网联机有个致命限制——所有玩家必须处在同一个物理网络环境下。这就导致异地好友想联机时&#xff0c;要么忍受官方…...

3大优势!Scarab模组管理工具使用技巧:从新手到高手的进阶指南

3大优势&#xff01;Scarab模组管理工具使用技巧&#xff1a;从新手到高手的进阶指南 【免费下载链接】Scarab An installer for Hollow Knight mods written in Avalonia. 项目地址: https://gitcode.com/gh_mirrors/sc/Scarab 你是否在安装空洞骑士模组时遇到过文件路…...

别再忍受龟速下载!保姆级教程:Ubuntu 18.04一键更换阿里云/清华源(附SSH无桌面操作)

Ubuntu 18.04国内软件源极速配置指南&#xff1a;告别蜗牛速度的终极方案 每次执行apt update时盯着缓慢爬升的进度条&#xff0c;是否让你产生砸键盘的冲动&#xff1f;作为国内Ubuntu用户&#xff0c;默认国际源的龟速下载堪称开发效率的头号杀手。本文将彻底解决这个痛点——…...

python-langchain框架(3-9-word文档加载 )

二、基于 LangChain 的功能亮点1. 原生 LangChain 组件&#xff0c;开箱即用直接使用 LangChain 社区提供的专业文档加载器&#xff0c;属于框架原生支持能力&#xff0c;无需自己编写解析逻辑&#xff0c;与 LangChain 整个 AI 开发生态无缝衔接。2. 纯文本精准提取&#xff0…...

如何轻松备份你的QQ空间回忆?GetQzonehistory三步搞定完整导出

如何轻松备份你的QQ空间回忆&#xff1f;GetQzonehistory三步搞定完整导出 【免费下载链接】GetQzonehistory 获取QQ空间发布的历史说说 项目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory 你是否曾担心那些记录青春时光的QQ空间说说会随着时间消失&am…...