📜  C程序删除右侧具有较大值的节点(1)

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

C程序删除右侧具有较大值的节点

在链表中,如果一个节点的右侧节点比其自身的值更大,则称该节点具有“较大值”。本文将介绍如何编写C程序来删除具有较大值的节点。

实现思路

我们可以遍历整个链表,每次比较当前节点和其右侧节点的值。如果右侧节点的值更大,则删除右侧节点,否则继续遍历下一个节点。当遍历到链表末尾时,删除最后一个节点(如果存在)。

代码实现

首先,我们需要定义一个链表节点的结构体:

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

接下来,我们可以编写一个函数来删除具有较大值的节点:

void delete_nodes_with_larger_values(Node *head) {
    Node *p, *q, *prev;

    if (head == NULL) {
        return; // 空链表
    }

    prev = head;
    p = head->next;

    while (p != NULL) {
        if (p->data > prev->data) {
            if (p->next != NULL) {
                q = p->next;
                free(p);
                prev->next = q;
                p = q;
            } else {
                free(p);
                prev->next = NULL;
                break;
            }
        } else {
            prev = p;
            p = p->next;
        }
    }
}

该函数的参数是链表的头指针(即指向第一个节点的指针)。首先,我们定义了三个指针变量: pqprevp指向当前节点,q指向当前节点的右侧节点(如果存在),prev指向p的前一个节点。接下来,我们进入一个循环,直到遍历到链表的末尾。在循环中,我们检查当前节点是否具有较大的值。如果是,则删除右侧节点,否则,我们将指针变量向后移动(即将prev指向pp指向p->next)并继续遍历下一个节点。

请注意,当我们在删除节点时,我们需要调整指针以确保链表仍然保持完整。例如,当我们要删除p时,我们需要将prev->next指向q(即当前节点的右侧节点),以确保链表不会断开。当我们要删除链表的最后一个节点时,我们只需要将prev->next指向 NULL 即可。

使用示例

要使用delete_nodes_with_larger_values函数,首先我们需要创建链表并插入一些节点:

int main() {
    Node *head = malloc(sizeof(Node));
    Node *p = head;

    p->data = 1;

    p->next = malloc(sizeof(Node));
    p = p->next;
    p->data = 2;

    p->next = malloc(sizeof(Node));
    p = p->next;
    p->data = 3;

    p->next = malloc(sizeof(Node));
    p = p->next;
    p->data = 4;

    p->next = malloc(sizeof(Node));
    p = p->next;
    p->data = 2;

    p->next = malloc(sizeof(Node));
    p = p->next;
    p->data = 5;

    p->next = NULL;

    delete_nodes_with_larger_values(head);

    // 输出链表中剩余的节点
    p = head;
    while (p != NULL) {
        printf("%d -> ", p->data);
        p = p->next;
    }
    printf("NULL\n");

    // 释放内存
    p = head;
    while (p != NULL) {
        Node *temp = p->next;
        free(p);
        p = temp;
    }

    return 0;
}

在运行该程序后,输出的链表将是:

1 -> 2 -> 2 -> NULL
结论

到目前为止,我们已经了解了如何删除具有较大值的节点。现在你可以应用这个方法来解决你的链表问题了。