双链表(C语言实现)

#include <stdio.h>
#include <stdlib.h>

// 双向链表节点结构体定义
typedef struct Node{
    int data; // 数据域
    struct Node* next; // 指向下一个节点的指针
    struct Node* prev; // 指向上一个节点的指针
}Node;

// 创建一个新的双向链表节点
Node* create_node(int data){
    Node* node = (Node*)malloc(sizeof(Node));
    node->data = data;
    node->next = NULL;
    node->prev = NULL;
    return node;
}

// 插入一个新节点到链表头部
void insert_node_head(Node** head, int data){
    Node* node = create_node(data);
    if (!(*head)){
        *head = node;
        return;
    }
    (*head)->prev = node;
    node->next = (*head);
    *head = node;
}

// 插入一个新节点到链表尾部
void insert_node_tail(Node** head, int data){
    Node* node = create_node(data);
    if (!(*head)){
        *head = node;
        return;
    }
    Node* tail = *head;
    while (tail->next){
        tail = tail->next;
    }
    tail->next = node;
    node->prev = tail;
}

// 删除链表中的某个节点
void delete_node(Node** head, Node* node){
    if (*head == node){
        *head = node->next;
    }
    if (node->next){
        node->next->prev = node->prev;
    }
    if (node->prev){
        node->prev->next = node->next;
    }
    free(node);
}

// 输出链表中所有节点的数据
void print_list(Node* head){
    printf("List Content:\n");
    while (head){
        printf("%d ", head->data);
        head = head->next;
    }
    printf("\n");
}

// 搜索链表中是否包含某个值为 data 的节点
Node* search_list(Node* head, int data){
    while (head){
        if (head->data == data){
            return head;
        }
        head = head->next;
    }
    return NULL;
}

// 释放链表内存
void free_list(Node* head){
    while (head){
        Node* node = head;
        head = head->next;
        free(node);
    }
    printf("List Memory Freed.\n");
}

// 测试代码
int main(){
    Node* list_head = NULL;
    
    insert_node_head(&list_head, 1);
    insert_node_head(&list_head, 2);
    insert_node_tail(&list_head, 3);
    insert_node_head(&list_head, 4);
    insert_node_tail(&list_head, 5);
    print_list(list_head);
    
    Node* node_to_delete = search_list(list_head, 2);
    delete_node(&list_head, node_to_delete);
    node_to_delete = search_list(list_head, 5);
    delete_node(&list_head, node_to_delete);
    print_list(list_head);
    
    free_list(list_head);
    
    return 0;
}
List Content:
4 2 1 3 5
List Content:
4 1 3
List Memory Freed.

这个双向链表示例实现了节点的创建、插入到链表的头部和尾部、删除链表中的某一节点、输出链表中所有节点数据、搜索链表中是否包含某个值为 data 的节点,以及释放链表内存。这只是一个简单的实现,不过足够说明双向链表的基本操作。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值