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

这篇具有很好参考价值的文章主要介绍了数据结构——双向链表(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;
}
总结

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

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

感谢观看,还请各位大佬点赞支持以下!!!文章来源地址https://www.toymoban.com/news/detail-843522.html

到了这里,关于数据结构——双向链表(C语言版)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【数据结构】—C语言实现双向链表(超详细!)

                                          食用指南:本文在有C基础的情况下食用更佳                                       🔥 这就不得不推荐此专栏了:C语言                                     🍀 双向链表 前 置知识 :单链表      

    2024年02月13日
    浏览(49)
  • 【数据结构】C语言实现双向链表(带头结点、循环)

    结点定义: 接口定义: 我们将申请结点的代码封装成函数,方便后续使用 由于是带头结点的双向链表,因此在使用链表前,我们需要对链表进行初始化。 遍历链表,值得说的是,带头结点的双向链表的循环结束条件是 cur != phead 尾插时,需要先找到尾结点,然后将新结点插

    2024年02月03日
    浏览(72)
  • 【数据结构初阶】四、线性表里的链表(带头+双向+循环 链表 -- C语言实现)

    ========================================================================= 相关代码gitee自取 : C语言学习日记: 加油努力 (gitee.com)  ========================================================================= 接上期 : 【数据结构初阶】三、 线性表里的链表(无头+单向+非循环链表 -- C语言实现)-CSDN博客  ====

    2024年02月08日
    浏览(44)
  • 『初阶数据结构 • C语言』⑨ - 基于结点的数据结构——链表(单链表&&双向循环链表)附完整源码

      本章内容 1.什么是链表 2.链表常见几种形式 3.无头单向非循环链表的实现 3.1结点结构的定义 3.2函数接口的实现 3.2.1尾插 3.2.2尾删 4. 带头双向循环链表的实现 4.1结点结构的定义 4.2函数接口的实现 5.两种链表的差异 ①尾插与尾删的时间复杂度 ②头插与头删的时间复杂度 ③

    2024年02月16日
    浏览(82)
  • 链接未来:深入理解链表数据结构(二.c语言实现带头双向循环链表)

    上篇文章简述讲解了链表的基本概念并且实现了无头单向不循环链表:链接未来:深入理解链表数据结构(一.c语言实现无头单向非循环链表)-CSDN博客 那今天接着给大家带来带头双向循环链表的实现 : 头文件DoubleList.h:用来基础准备(常量定义,typedef),链表表的基本框架

    2024年01月16日
    浏览(61)
  • 数据结构_链表_双向循环链表的初始化、插入、删除、修改、查询打印(基于C语言实现)

    版本: 2024年4月26日 V1.0 发布于博客园 目录 目录 双向循环链表公式 初始化双向循环链表 构建双向循环链表结点 创建一个空链表(仅头结点) 创建一个新结点 插入数据 头插 中插 尾插 删除数据 头删 中删 尾删 查询打印数据 遍历打印 测试 测试结果: 完整代码 DoubleCirLList.h

    2024年04月27日
    浏览(55)
  • 数据结构-链表结构-双向链表

    双向链表也叫双链表,与单向链表不同的是,每一个节点有三个区域组成:两个指针域,一个数据域 前一个指针域:存储前驱节点的内存地址 后一个指针域:存储后继节点的内存地址 数据域:存储节点数据 以下就是双向链表的最基本单位 节点的前指针域指向前驱,后指针

    2024年02月04日
    浏览(47)
  • 【数据结构】双向奔赴的爱恋 --- 双向链表

    关注小庄 顿顿解馋๑ᵒᯅᵒ๑ 引言:上回我们讲解了单链表(单向不循环不带头链表),我们可以发现他是存在一定缺陷的,比如尾删的时候需要遍历一遍链表,这会大大降低我们的性能,再比如对于链表中的一个结点我们是无法直接访问它的上一个结点,那有什么解决方法呢

    2024年04月08日
    浏览(95)
  • 数据结构—双向链表

    目录 1.  链表的种类 2.  最实用的两种链表类型 3.  实现双向带头循环链表                   3.1 创建头节点         3.2 实现双向循环功能—返回头指针         3.3  尾插           3.4 头插         3.5 尾删         3.6 头删 4.  实现两个重要接口函数  

    2023年04月23日
    浏览(69)
  • 数据结构双向链表

    Hello,好久不见,今天我们讲链表的双向链表,这是一个很厉害的链表,带头双向且循环,学了这个链表,你会发现顺序表的头插头删不再是一个麻烦问题,单链表的尾插尾删也变得简单起来了,那废话不多说,让我们开始我们的学习吧! 首先我们要了解它的物理和逻辑结构

    2024年02月11日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包