You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言链表奇数元素删除功能异常问题求助

C语言链表奇数元素删除功能异常问题求助

你好呀!看了你的代码和问题描述,发现有几个关键问题导致了一直输出“Deleted 1”的异常,咱们一步步来梳理和修正:

一、Delete_Node函数的核心问题

  1. 未初始化的deleted_number变量
    在else分支(删除非首节点)里,你没有给deleted_number赋值,但最后却用printf输出它。局部变量如果未初始化,会包含栈上的残留值,这就是为什么你一直看到输出1的原因——刚好栈里残留了第一次删除时的1的值。
    修正:在else分支里也要给deleted_number赋值:deleted_number = oldNode->value;

  2. 未释放删除节点的内存
    在else分支里,你只是把oldNode设为NULL,但没有调用free(oldNode),这会造成内存泄漏,程序运行久了会占用越来越多的内存。
    修正:把oldNode = NULL;改成free(oldNode);

  3. 缺少边界检查
    如果传入的position超过了链表当前的size,你的代码会访问空指针,导致程序崩溃。建议在函数开头加一个判断:

    if (position < 1 || position > queue->size) {
        printf("\nInvalid position!");
        return;
    }
    

二、DeleteUneven函数的逻辑问题

你的循环逻辑太绕,用pos跟踪位置容易出错,而且删除节点后temp的处理不够简洁。其实可以换一种思路:遍历链表时,直接跟踪当前节点和前一个节点,不需要用位置来定位,这样更直观也不容易出错。

修正后的DeleteUneven函数可以写成这样:

void DeleteUneven(Queue *queue)
{
    Node *current = queue->head;
    Node *prev = NULL;

    while (current != NULL) {
        if (current->value % 2 == 1) {
            // 需要删除当前节点
            if (prev == NULL) {
                // 删除首节点
                queue->head = current->next;
                printf("\nDeleted: %d", current->value);
                free(current);
                current = queue->head;
            } else {
                // 删除中间节点
                prev->next = current->next;
                printf("\nDeleted: %d", current->value);
                free(current);
                current = prev->next;
            }
            queue->size--;
        } else {
            // 不需要删除,移动指针
            prev = current;
            current = current->next;
        }
    }
}

这样修改后,不需要维护pos变量,直接通过指针跟踪节点,删除逻辑更清晰,也避免了位置计算错误。

三、修正后的完整Delete_Node函数

为了让Delete_Node更健壮,修正后的代码如下:

void Delete_Node(Queue *queue, int position)
{
    Node *oldNode;
    Node *prev;
    int deleted_number;

    // 边界检查
    if (position < 1 || position > queue->size) {
        printf("\nInvalid position!");
        return;
    }

    if (position == 1) {
        oldNode = queue->head;
        deleted_number = queue->head->value;
        queue->head = queue->head->next;
        free(oldNode);
        queue->size--;
    } else {
        prev = queue->head;
        for (int i = 1; i < position - 1; i++) {
            prev = prev->next;
        }
        oldNode = prev->next;
        deleted_number = oldNode->value; // 新增赋值
        prev->next = oldNode->next;
        free(oldNode); // 新增释放内存
        queue->size--;
    }

    printf("\nDeleted: %d", deleted_number);
}

为什么原来的代码会一直输出1?

因为在删除非首节点时,deleted_number没有被赋值,而局部变量的初始值是栈上的残留数据。第一次删除首节点时,deleted_number被设为1,之后每次调用Delete_Node删除其他节点时,deleted_number刚好拿到了栈里残留的1,所以就一直输出1了。

备注:内容来源于stack exchange,提问作者muniek7

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.21 09:49:51