数据结构——双向链表(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;
}
总结

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

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

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

相关推荐
二十雨辰20 分钟前
[Java]-数据集合
数据结构
是隼人34 分钟前
buuctf-pwn axb_2019_fmt32题解(学习过程持续更新)
c语言·学习·安全·pwn入门·ctf入门
老一岁1 小时前
c问题总结(2)
c语言·开发语言
奶茶树1 小时前
【C++】13. C++11新特性【上】
c语言·开发语言·c++·git·github
吴声子夜歌1 小时前
Java面试——数据结构(一)
java·数据结构·面试
wabs6661 小时前
关于栈【力扣1047. 删除字符串中的所有相邻重复项的思考】
数据结构·c++·算法·leetcode··代码随想录
疯狂打码的少年2 小时前
【数据结构】选择类排序:简单选择与堆排序
java·数据结构·笔记·算法
xys_6782 小时前
深挖C语言:动态内存管理
c语言·开发语言
疯狂打码的少年2 小时前
【数据结构】排序算法:归并排序与基数排序
数据结构·笔记·算法·排序算法
wuminyu3 小时前
JDK21 FFM异步读取MSG_ZEROCOPY错误队列揭秘
java·linux·c语言·jvm·c++