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

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

目录

什么是双向链表?

双向链表的节点结构

双向链表的基本操作

完整的双向链表示例

总结


什么是双向链表?

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

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

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

    cpp 复制代码
    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.删除节点

cpp 复制代码
void deleteNode(Node* delNode) {
    delNode->prev->next = delNode->next;
    delNode->next->prev = delNode->prev;
    free(delNode);
}
  1. 遍历双向链表

    cpp 复制代码
    void printLinkedList(Node* head) {
     Node* current = head->next;
     while (current != NULL) {
         printf("%d ", current->data);
         current = current->next;
     }
     printf("\\n");
    }
完整的双向链表示例
cpp 复制代码
#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;
}
总结

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

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

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

相关推荐
橘颂TA4 分钟前
【剑斩OFFER】算法的暴力美学——交易逆序对的总数
数据结构·算法·leetcode
2401_8414956413 分钟前
【LeetCode刷题】合并区间
数据结构·python·算法·leetcode·合并·遍历·排序
xu_yule22 分钟前
数据结构(14)二叉树的模拟实现和便利代码
数据结构·算法
代码游侠34 分钟前
应用——文件I/O操作代码
linux·运维·c语言·笔记·学习·算法
UP_Continue41 分钟前
哈希表实现--开放定址法
数据结构·哈希算法·散列表
lxh011343 分钟前
合并区间题解
数据结构·算法·leetcode
yongui478341 小时前
基于MATLAB的轴承表面织构油膜参数计算程序
数据结构·算法·matlab
立志成为大牛的小牛1 小时前
数据结构——五十七、插入排序(王道408)
数据结构·笔记·程序人生·考研·算法
亭上秋和景清1 小时前
计算器回调函数
c语言·数据结构·算法
枫叶丹41 小时前
【Qt开发】Qt窗口(八) -> QFileDialog 文件对话框
c语言·开发语言·数据库·c++·qt