以下是使用C语言实现在链表中删除值为x的结点的函数:

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

// 定义单链表节点的结构体
typedef struct Node {
    int data;
    struct Node* next;
} Node;

// 在链表中删除值为x的结点
void deleteNode(Node** head, int x) {
    Node* current = *head;
    Node* prev = NULL;

    // 遍历链表,找到值为x的结点及其前驱结点
    while (current != NULL && current->data != x) {
        prev = current;
        current = current->next;
    }

    // 若找到了值为x的结点,删除它
    if (current != NULL) {
        if (prev == NULL) {
            // 若删除的是头结点,则移动头指针
            *head = current->next;
        } else {
            // 若删除的是中间结点,则更新前驱结点的next指针
            prev->next = current->next;
        }

        // 释放删除结点的内存
        free(current);
    }
}

// 创建链表
Node* createLinkedList(int arr[], int n) {
    Node* head = NULL;
    Node* tail = NULL;

    for (int i = 0; i < n; i++) {
        Node* newNode = (Node*)malloc(sizeof(Node));
        newNode->data = arr[i];
        newNode->next = NULL;

        if (head == NULL) {
            head = newNode;
            tail = newNode;
        } else {
            tail->next = newNode;
            tail = newNode;
        }
    }

    return head;
}

// 打印链表
void printLinkedList(Node* head) {
    Node* current = head;

    while (current != NULL) {
        printf('%d ', current->data);
        current = current->next;
    }
    printf('\n');
}

// 销毁链表
void destroyLinkedList(Node* head) {
    Node* current = head;
    Node* next = NULL;

    while (current != NULL) {
        next = current->next;
        free(current);
        current = next;
    }
}

int main() {
    int arr[] = {1, 2, 3, 4, 5};
    int n = sizeof(arr) / sizeof(arr[0]);

    Node* head = createLinkedList(arr, n);

    printf("原始链表:");
    printLinkedList(head);

    int x = 3;
    deleteNode(&head, x);

    printf("删除值为%d的结点后的链表:", x);
    printLinkedList(head);

    destroyLinkedList(head);

    return 0;
}

以上代码实现了在链表中删除值为x的结点的逻辑。首先定义了单链表节点的结构体,然后实现了deleteNode函数来删除链表中值为x的节点。主函数中创建了一个链表,并打印出原始链表。然后调用deleteNode函数删除值为x的节点,并打印删除节点后的链表。最后销毁链表,释放内存。


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

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