C语言实现链表保留M删N功能段错误问题排查
段错误原因及潜在异常说明
触发段错误的根本原因
问题出在retainMdeleteN函数的保留M节点遍历逻辑,未做空指针校验:
针对M=2、10节点的测试用例,执行到第四轮循环时,curr指针指向节点10,仍满足while(curr)的循环入口条件:
- 进入保留M个节点的for循环:
for (x = 1; x < M; x++),M=2时会执行1次curr = curr->next,执行后curr变为NULL - 后续执行
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
相关产品推荐
相关产品推荐

