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

无动态内存分配静态链表增删节点后打印无变化问题求助

问题根因

你的Del_Node函数存在三处核心逻辑错误,导致删除操作完全没有实际生效:

  1. 仅修改临时变量,未改动链表结构:函数末尾的temp = temp->next修改的是栈上的局部临时指针,不会改变链表中原有节点的next指向,相当于你根本没修改链表的节点关联关系,删除操作等于没执行。
  2. 节点遍历逻辑错误:删除指定位置的节点需要先找到它的前驱节点,再修改前驱节点的next指针跳过待删除节点,你当前的逻辑是直接遍历到待删除节点本身,无法完成指针重连。
  3. 边界情况未校验:没有处理空链表、删除头节点、index超出链表长度等特殊场景,容易触发野指针崩溃。

修正方案

修正后的Del_Node函数

void Del_Node(node **head, uint8_t index)
{
    // 空链表直接返回
    if (*head == NULL) return;
    node *temp = *head;
    // 删除头节点的特殊情况
    if (index == 0) {
        *head = temp->next;
        next_node--;
        return;
    }
    // 找到待删除节点的前驱节点(index-1的位置)
    for (uint8_t run = 0; temp != NULL && run < index-1; run++) {
        temp = temp->next;
    }
    // 校验index是否超出链表长度,或者待删除节点不存在
    if (temp == NULL || temp->next == NULL) return;
    // 跳过待删除节点,完成删除
    temp->next = temp->next->next;
    next_node--;
}

额外说明

你当前使用的头插法逻辑下,main函数中插入节点后的链表实际顺序为5 → 4 → 3 → 2,如果按从0开始计数:

  • 位置0对应值5,位置1对应值4,位置2对应值3,位置3对应值2

如果需要删除值为3的节点,调用Del_Node时的index参数应该传2而非3,调整后打印输出为5 4 2。

另外你当前代码里的next_node变量没有实际作用:你是手动传入index参数指定使用静态数组的哪个节点,并没有通过next_node来分配空闲节点索引,增删时的next_node增减逻辑不影响节点的实际使用。


内容的提问来源于stack exchange,提问作者Nguyễn Phùng Thái Cường

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 06:36:05