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

C语言单链表节点删除函数运行异常,求帮忙排查代码问题

单链表del函数问题排查

你的代码存在以下几类问题:

  • 参数传递错误:函数形参struct node *l是值传递,函数内部对l的修改(比如删除头结点时的l=l->next)仅作用于函数内的局部副本,无法修改外部传入的头指针,导致删除头结点后外部链表完全失效。
  • 不必要的malloc造成内存泄漏:temp1、temp2只是遍历用的临时指针,不需要调用malloc申请内存,代码中先malloc再直接赋值为l,会直接丢失申请的内存地址,产生内存泄漏。
  • 变量未初始化:第一个while循环中使用的变量i没有初始化,是随机垃圾值,会导致循环执行次数完全不符合预期,甚至直接访问野指针崩溃。
  • 缺少入参合法性校验:没有判断n是否小于1、或者n是否超过链表总长度,当n超出范围时会出现指针越界访问,引发段错误。
  • 多余的遍历逻辑:找前驱节点和待删除节点只需要一次遍历就能完成,代码里用了两个独立的while循环遍历,完全冗余效率低下。

修改后的代码实现

可以通过返回新头指针的方式解决头结点修改不生效的问题,修改后代码如下:

// 调用方需要用原头指针接收返回值,比如 head = del(head, 3);
struct node* del(struct node *l,int n) {
    // 链表为空或者n不合法直接返回
    if (l == NULL || n < 1) {
        printf("list already empty or invalid n");
        return l;
    }
    // 处理删除头结点的情况
    if (n == 1) {
        struct node *temp = l->next;
        free(l);
        return temp;
    }
    // 找第n-1个节点(待删除节点的前驱节点)
    struct node *pre = l;
    int i = 1;
    while (pre != NULL && i < n-1) {
        pre = pre->next;
        i++;
    }
    // 校验n是否超过链表长度
    if (pre == NULL || pre->next == NULL) {
        printf("n is larger than list length");
        return l;
    }
    struct node *del_node = pre->next;
    pre->next = del_node->next;
    free(del_node);
    return l;
}

内容的提问来源于stack exchange,提问作者varsha

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 13:06:05