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

C语言实现链表保留M删N功能段错误问题排查

段错误原因及潜在异常说明

触发段错误的根本原因

问题出在retainMdeleteN函数的保留M节点遍历逻辑,未做空指针校验:
针对M=2、10节点的测试用例,执行到第四轮循环时,curr指针指向节点10,仍满足while(curr)的循环入口条件:

  1. 进入保留M个节点的for循环:for (x = 1; x < M; x++),M=2时会执行1次curr = curr->next,执行后curr变为NULL
  2. 后续执行t = curr->next时,对空指针进行解引用操作,直接触发段错误。

其他未识别的异常运行场景

  • 链表剩余节点数小于待保留的M个节点数时,都会触发上述空指针解引用问题,不属于特例
  • 删除N个节点的逻辑未校验t非空:当剩余待删除节点数小于N时,执行t = t->next会出现空指针解引用,例如剩余2个待删节点、N=3的场景
  • 参数合法性缺失:输入M≤0时,保留节点的逻辑无法正常执行,同时也会增加空指针风险;输入N<0时删除逻辑会出现死循环
  • 输入空链表(头指针为NULL)时无业务兼容处理
  • main函数中存储节点值的数组长度固定为100,当输入节点数n>100时会触发栈溢出。

核心逻辑修复参考

仅需给两处循环增加非空校验即可解决大部分问题:

void retainMdeleteN(struct Node* head, int M, int N)
{
    // 新增参数合法性校验
    if (head == NULL || M <= 0 || N < 0) return;
    struct Node *curr = head, *t;
    int x;
    while (curr)
    {
        // 保留M个节点时增加非空判断
        for (x = 1; x < M && curr != NULL; x++)
            curr = curr->next;
        if (curr == NULL)
            return;
        t = curr->next;
        // 删除N个节点时增加非空判断
        for (x = 1; x <= N && t != NULL; x++)
        {
            struct Node* temp = t;
            t = t->next;
            free(temp);
        }
        curr->next = t;
        curr = t;
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 09:48:03