循环双向链表的定义如下:

typedef struct node {
    int data;               // 数据域
    struct node *prev;      // 前驱指针
    struct node *next;      // 后继指针
} Node, *LinkedList;

其中,LinkedList 表示链表的头指针,指向链表的第一个结点。链表的最后一个结点的 next 指针指向头结点,头结点的 prev 指针指向链表的最后一个结点。

循环双向链表的新增操作可以实现如下:

// 在链表尾部插入一个新结点
void insertNode(LinkedList list, int data) {
    Node *newNode = (Node *) malloc(sizeof(Node));
    newNode->data = data;
    newNode->prev = list->prev;
    newNode->next = list;
    list->prev->next = newNode;
    list->prev = newNode;
}

// 创建一个新的循环双向链表
LinkedList createList() {
    LinkedList list = (LinkedList) malloc(sizeof(Node));
    list->data = 0;
    list->prev = list;
    list->next = list;
    return list;
}

其中,createList 函数创建一个新的链表,并返回链表的头指针。insertNode 函数在链表的尾部插入一个新结点,其中 list->prev 表示链表的最后一个结点。

循环双向链表的删除操作可以实现如下:

// 删除链表中第一个值为 data 的结点
void deleteNode(LinkedList list, int data) {
    Node *p = list->next;
    while (p != list && p->data != data) {
        p = p->next;
    }
    if (p == list) {
        printf("Not found!\n");
        return;
    }
    p->prev->next = p->next;
    p->next->prev = p->prev;
    free(p);
}

其中,deleteNode 函数用于删除链表中第一个值为 data 的结点。首先从头结点开始遍历链表,找到第一个值为 data 的结点。如果不存在这样的结点,则输出提示信息并返回。否则,将该结点从链表中删除,并释放空间。

循环双向链表的插入操作可以实现如下:

// 在链表中第一个值为 data 的结点后面插入一个新结点
void insertAfter(LinkedList list, int data, int newData) {
    Node *p = list->next;
    while (p != list && p->data != data) {
        p = p->next;
    }
    if (p == list) {
        printf("Not found!\n");
        return;
    }
    Node *newNode = (Node *) malloc(sizeof(Node));
    newNode->data = newData;
    newNode->prev = p;
    newNode->next = p->next;
    p->next->prev = newNode;
    p->next = newNode;
}

其中,insertAfter 函数用于在链表中第一个值为 data 的结点后面插入一个新结点。首先从头结点开始遍历链表,找到第一个值为 data 的结点。如果不存在这样的结点,则输出提示信息并返回。否则,在该结点后面插入一个新结点,并更新指针


原文地址: https://www.cveoy.top/t/topic/fTpM 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录