📜  C中循环链表上所有操作的程序(1)

📅  最后修改于: 2023-12-03 15:14:24.843000             🧑  作者: Mango

C循环链表操作程序

循环链表是一种链表,其尾节点指向头节点,形成一个环状结构。本文介绍在C语言中,如何对循环链表进行基本操作。

定义循环链表节点结构体

首先,我们需要定义循环链表中一个节点的结构体。该结构体包含两个成员变量,一个是存储数据的变量,另一个是指向下一个节点的指针。

typedef struct Node{
    int data;
    struct Node *next;
}Node;
创建循环链表

创建循环链表需要定义一个头节点,并将尾节点的指针指向头节点。然后,将新节点插入到尾节点后面即可。

Node* createList(int data){
    Node *head = (Node*)malloc(sizeof(Node)); // 创建头节点
    Node *node = (Node*)malloc(sizeof(Node)); // 创建新节点
    head->next = node; // 将尾节点的指针指向头节点
    node->data = data; // 设置新节点的数据
    node->next = head; // 将新节点指向头节点,形成循环链表
    return head; // 返回头节点
}
插入节点

在循环链表中插入新节点,需要找到插入的位置,然后将新节点插入到该位置。

Node* insertNode(Node *head, int data, int pos){
    Node *node = (Node*)malloc(sizeof(Node)); // 创建新节点
    node->data = data; // 设置新节点的数据
    int count = 0; // 记录遍历到的节点数
    Node *p = head->next; // 从第一个节点开始遍历
    while(p && count < pos-1){ // 搜索插入位置
        p = p->next;
        count++;
    }
    node->next = p->next; // 将新节点插入到链表中
    p->next = node;
    return head; // 返回头节点
}
删除节点

要从循环链表中删除节点,需要找到要删除的节点,并将它的前一个节点的指针指向它的后一个节点。

Node* deleteNode(Node *head, int data){
    Node *p = head->next; // 从第一个节点开始遍历
    Node *pre = head; // 记录p的前一个节点
    while(p != head){ // 搜索需要删除的节点
        if(p->data == data){
            pre->next = p->next; // 将p的前一个节点指向p的后一个节点
            free(p); // 释放p节点
            return head; // 返回头节点
        }
        pre = p;
        p = p->next;
    }
    return head; // 没有找到需要删除的节点
}
修改节点

要修改循环链表中节点的数据,需要找到该节点,然后将它的data值修改即可。

Node* updateNode(Node *head, int oldData, int newData){
    Node *p = head->next; // 从第一个节点开始遍历
    while(p != head){ // 搜索需要修改的节点
        if(p->data == oldData){
            p->data = newData; // 修改节点数据
            return head; // 返回头节点
        }
        p = p->next;
    }
    return head; // 没有找到需要修改的节点
}
遍历循环链表

要遍历循环链表,可以使用一个指针从第一个节点开始遍历,直到指针重新指向头节点为止。

void traverseList(Node *head){
    Node *p = head->next; // 从第一个节点开始遍历
    while(p != head){
        printf("%d ", p->data); // 输出节点数据
        p = p->next;
    }
    printf("\n");
}
完整代码
#include <stdio.h>
#include <stdlib.h>

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

Node* createList(int data){
    Node *head = (Node*)malloc(sizeof(Node)); // 创建头节点
    Node *node = (Node*)malloc(sizeof(Node)); // 创建新节点
    head->next = node; // 将尾节点的指针指向头节点
    node->data = data; // 设置新节点的数据
    node->next = head; // 将新节点指向头节点,形成循环链表
    return head; // 返回头节点
}

Node* insertNode(Node *head, int data, int pos){
    Node *node = (Node*)malloc(sizeof(Node)); // 创建新节点
    node->data = data; // 设置新节点的数据
    int count = 0; // 记录遍历到的节点数
    Node *p = head->next; // 从第一个节点开始遍历
    while(p && count < pos-1){ // 搜索插入位置
        p = p->next;
        count++;
    }
    node->next = p->next; // 将新节点插入到链表中
    p->next = node;
    return head; // 返回头节点
}

Node* deleteNode(Node *head, int data){
    Node *p = head->next; // 从第一个节点开始遍历
    Node *pre = head; // 记录p的前一个节点
    while(p != head){ // 搜索需要删除的节点
        if(p->data == data){
            pre->next = p->next; // 将p的前一个节点指向p的后一个节点
            free(p); // 释放p节点
            return head; // 返回头节点
        }
        pre = p;
        p = p->next;
    }
    return head; // 没有找到需要删除的节点
}

Node* updateNode(Node *head, int oldData, int newData){
    Node *p = head->next; // 从第一个节点开始遍历
    while(p != head){ // 搜索需要修改的节点
        if(p->data == oldData){
            p->data = newData; // 修改节点数据
            return head; // 返回头节点
        }
        p = p->next;
    }
    return head; // 没有找到需要修改的节点
}

void traverseList(Node *head){
    Node *p = head->next; // 从第一个节点开始遍历
    while(p != head){
        printf("%d ", p->data); // 输出节点数据
        p = p->next;
    }
    printf("\n");
}

int main(){
    Node *head = createList(1);
    insertNode(head, 2, 1);
    insertNode(head, 3, 2);
    traverseList(head);
    deleteNode(head, 2);
    traverseList(head);
    updateNode(head, 3, 4);
    traverseList(head);
    return 0;
}