【C语言实现双向循环链表】

好的,以下是用C语言实现双向循环链表的代码:

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

typedef struct Node {
    int data;
    struct Node *prev;
    struct Node *next;
} Node;

typedef struct List {
    Node *head;
    Node *tail;
} List;

List* createList() {
    List *list = (List*) malloc(sizeof(List));
    list->head = NULL;
    list->tail = NULL;
    return list;
}

void insertAtHead(List *list, int data) {
    Node *newNode = (Node*) malloc(sizeof(Node));
    newNode->data = data;
    newNode->prev = NULL;
    newNode->next = list->head;
    if (list->head != NULL) {
        list->head->prev = newNode;
    }
    list->head = newNode;
    if (list->tail == NULL) {
        list->tail = newNode;
    }
}

void insertAtTail(List *list, int data) {
    Node *newNode = (Node*) malloc(sizeof(Node));
    newNode->data = data;
    newNode->prev = list->tail;
    newNode->next = NULL;
    if (list->tail != NULL) {
        list->tail->next = newNode;
    }
    list->tail = newNode;
    if (list->head == NULL) {
        list->head = newNode;
    }
}

void deleteAtHead(List *list) {
    Node *temp = list->head;
    list->head = temp->next;
    if (list->head != NULL) {
        list->head->prev = NULL;
    }
    free(temp);
}

void deleteAtTail(List *list) {
    Node *temp = list->tail;
    list->tail = temp->prev;
    if (list->tail != NULL) {
        list->tail->next = NULL;
    }
    free(temp);
}

void printList(List *list) {
    Node *temp = list->head;
    while (temp != NULL) {
        printf("%d ", temp->data);
        temp = temp->next;
    }
    printf("\n");
}

int main() {
    List *list = createList();
    insertAtHead(list, 1);
    insertAtHead(list, 2);
    insertAtTail(list, 3);
    insertAtTail(list, 4);
    printList(list); // 输出:2 1 4 3
    deleteAtHead(list);
    printList(list); // 输出:1 4 3
    deleteAtTail(list);
    printList(list); // 输出:1 4
    return 0;
}

以上代码中,我们定义了一个 Node 结构体来表示链表中的节点,包含一个整型数据域 data 和两个指向前后节点的指针 prevnext。然后定义了一个 List 结构体来表示整个链表,包含一个头节点指针 head 和一个尾节点指针 tail

接下来,我们实现了几个基本的操作函数,包括创建链表、在链表头部插入节点、在链表尾部插入节点、删除链表头部节点和删除链表尾部节点。最后,我们还实现了一个打印链表的函数,用于输出链表中所有节点的值。

在主函数中,我们首先创建了一个空链表,然后在链表头部插入了两个节点,在链表尾部插入了两个节点。接着,我们打印了整个链表,然后删除了链表头部的节点和尾部的节点,并再次打印了链表。

相关推荐

  1. C语言实现双向循环

    2024-07-16 23:30:04       57 阅读
  2. C语言实现双向循环

    2024-07-16 23:30:04       23 阅读
  3. C语言实现双向

    2024-07-16 23:30:04       49 阅读
  4. 双向C语言实现

    2024-07-16 23:30:04       33 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-16 23:30:04       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-16 23:30:04       72 阅读
  3. 在Django里面运行非项目文件

    2024-07-16 23:30:04       58 阅读
  4. Python语言-面向对象

    2024-07-16 23:30:04       69 阅读

热门阅读

  1. 前端面试题日常练-day88 【面试题】

    2024-07-16 23:30:04       18 阅读
  2. flex主轴元素控制优先级

    2024-07-16 23:30:04       19 阅读
  3. 从零开始学C语言第五天(练习)

    2024-07-16 23:30:04       22 阅读
  4. Python正则表达式中的分组

    2024-07-16 23:30:04       20 阅读
  5. 电容蓄电能力测试总结

    2024-07-16 23:30:04       21 阅读
  6. 【C++】使用gtest做单元测试框架写单元测试

    2024-07-16 23:30:04       18 阅读
  7. 探索Perl语言:入门学习与实战指南

    2024-07-16 23:30:04       19 阅读
  8. C# volatile关键字

    2024-07-16 23:30:04       23 阅读
  9. (138)SRAM接口--->(001)基于FPGA实现SRAM接口

    2024-07-16 23:30:04       20 阅读
  10. 排序之 快速排序、归并排序、堆排序

    2024-07-16 23:30:04       24 阅读
  11. Oracle或MySQL数据迁移到国产数据库后的注意事项

    2024-07-16 23:30:04       19 阅读
  12. Redis的中BitMap的应用

    2024-07-16 23:30:04       24 阅读