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

2024-06-14 20:55:10 浏览数 (1)

什么是双向链表?

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

双向链表的节点结构
代码语言:javascript复制
typedef struct Node {
    int data;
    struct Node* prev;
    struct Node* next;
} Node;
双向链表的基本操作

初始化双向链表

代码语言:javascript复制
Node* initLinkedList() {
 Node* head = (Node*)malloc(sizeof(Node));
 head->prev = NULL;
 head->next = NULL;
 return head;
}

插入节点

代码语言:javascript复制
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.删除节点

代码语言:javascript复制
void deleteNode(Node* delNode) {
    delNode->prev->next = delNode->next;
    delNode->next->prev = delNode->prev;
    free(delNode);
}

遍历双向链表

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

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

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

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

0 人点赞