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

简介: 数据结构——双向链表(C语言版)
什么是双向链表

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

双向链表的节点结构
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;
}

插入节点

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);
}

遍历双向链表

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;
}
总结

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


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


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

相关文章
|
1天前
|
机器学习/深度学习 算法 C语言
【C/数据结构与算法】:10道链表经典OJ
【C/数据结构与算法】:10道链表经典OJ
7 1
|
16小时前
|
存储 算法 搜索推荐
【数据结构和算法】--- 基于c语言排序算法的实现(2)
【数据结构和算法】--- 基于c语言排序算法的实现(2)
3 0
|
19小时前
|
存储 缓存 前端开发
【数据结构/C语言】深入理解 双向链表
【数据结构/C语言】深入理解 双向链表
|
20小时前
|
搜索推荐 算法 C语言
【数据结构和算法】--- 基于c语言排序算法的实现(1)
【数据结构和算法】--- 基于c语言排序算法的实现(1)
7 0
|
20小时前
|
存储
【数据结构】详解链表结构
【数据结构】详解链表结构
3 0
|
21小时前
【数据结构】链表经典OJ题,常见几类题型(二)
【数据结构】链表经典OJ题,常见几类题型(二)
5 0
|
21小时前
【数据结构】链表经典OJ题,常见几类题型(一)
【数据结构】链表经典OJ题,常见几类题型(一)
6 0
|
1天前
|
存储 算法 前端开发
【C/数据结构与算法】:链表的实现(单向链表+双向链表)
【C/数据结构与算法】:链表的实现(单向链表+双向链表)
5 0
|
1天前
数据结构篇:链表和树结构的操作方法
数据结构篇:链表和树结构的操作方法
2 0
|
5天前
|
存储 算法 Java
Java数据结构与算法:线性数据结构之链表
Java数据结构与算法:线性数据结构之链表