当前位置: 首页 > 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;
}
总结

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

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

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

相关文章:

  • 20.Python从入门到精通—参数 位置参数 关键字参数 默认参数 匿名函数 return 语句 强制位置参数
  • 20240318-2-推荐算法Graph_Embedding
  • C++ 的标准模板库(STL)常用算法介绍
  • 微信小程序事件处理
  • 操作系统内功篇:硬件结构之软中断
  • 树形递归模板
  • 面试算法-88-反转链表
  • 【软件测试_黑白盒测试】白盒测试黑盒测试 区别
  • window下安装并使用nvm(含卸载node、卸载nvm、全局安装npm)
  • [Repo Git] manifests的写法
  • 【LLM多模态】Cogvlm图生文模型结构和训练流程
  • mysql的实训操作任务指南
  • 2024.3.9|第十五届蓝桥杯模拟赛(第三期)
  • java 实现发送邮件功能
  • YoloV8改进策略:BackBone改进|PKINet
  • 2017 年终总结 —— 在路上
  • angular2 简述
  • canvas 高仿 Apple Watch 表盘
  • JavaWeb(学习笔记二)
  • js算法-归并排序(merge_sort)
  • mysql中InnoDB引擎中页的概念
  • oldjun 检测网站的经验
  • Yeoman_Bower_Grunt
  • yii2权限控制rbac之rule详细讲解
  • 七牛云 DV OV EV SSL 证书上线,限时折扣低至 6.75 折!
  • 如何合理的规划jvm性能调优
  • 新版博客前端前瞻
  • 如何正确理解,内页权重高于首页?
  • #mysql 8.0 踩坑日记
  • #我与Java虚拟机的故事#连载06:收获颇多的经典之作
  • (07)Hive——窗口函数详解
  • (2)Java 简介
  • (C语言)fgets与fputs函数详解
  • (分布式缓存)Redis持久化
  • (六) ES6 新特性 —— 迭代器(iterator)
  • (算法)前K大的和
  • (算法二)滑动窗口
  • (五)MySQL的备份及恢复
  • (一)RocketMQ初步认识
  • .net中的Queue和Stack
  • .NET中两种OCR方式对比
  • /dev/sda2 is mounted; will not make a filesystem here!
  • @Validated和@Valid校验参数区别
  • [ vulhub漏洞复现篇 ] GhostScript 沙箱绕过(任意命令执行)漏洞CVE-2019-6116
  • [Go WebSocket] 多房间的聊天室(五)用多个小锁代替大锁,提高效率
  • [Hive] INSERT OVERWRITE DIRECTORY要注意的问题
  • [iOS]-NSTimer与循环引用的理解
  • [JavaWeb]——获取请求参数的方式(全面!!!)
  • [LeetBook]【学习日记】数组内乘积
  • [leetcode top100] 0924 找到数组中消失的数,合并二叉树,比特位计数,汉明距离
  • [SageMath] 关于SageMath本地环境的搭建与基本使用
  • [Web开发] Web开发者必读:《IE8 开发技术概述》
  • [zt]提问的艺术
  • [大数据]数据可视化 -- 练习卷
  • [导入]厚度仅9.5mm的SSD硬盘问世