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

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

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

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

相关推荐
天选之女wow35 分钟前
【Hard——Day4】25.K 个一组翻转链表
数据结构·算法·leetcode·链表
曾经的三心草1 小时前
Java数据结构-List-栈-队列-二叉树-堆
java·数据结构·list
橘子真甜~1 小时前
C/C++ Linux网络编程5 - 网络IO模型与select解决客户端并发连接问题
linux·运维·服务器·c语言·开发语言·网络·c++
wangjialelele2 小时前
详解mysql命令行操作与语言链接
c语言·数据库·c++·mysql·oracle
一直在努力的小宁3 小时前
《代码随想录-精华内容提取》07 二叉树
数据结构·算法·链表·面试
多彩电脑3 小时前
死循环逻辑检测
数据结构·python·算法·动态规划
cs麦子3 小时前
C语言--详解--冒泡排序(Bubble Sort)
c语言·算法·排序算法
一叶之秋14126 小时前
从零开始:打造属于你的链式二叉树
数据结构·算法
Creeper.exe7 小时前
【C语言】分支与循环(上)
c语言·开发语言
序属秋秋秋7 小时前
《Linux系统编程之进程基础》【进程状态】
linux·运维·c语言·c++·笔记·操作系统·进程状态