C语言链表首节点删除异常:删除后student_ID为垃圾值
问题排查与解决
问题现象
向链表插入4-5个节点后,调用lilPrint可正常打印信息;但删除首节点时,节点未被完全删除:打印时该节点的student_ID变为垃圾值,其余字段仍正常显示。
核心原因
- 主函数未更新链表头指针:在
main的case 2中,调用Del(id,list)后,没有将返回的新链表头赋值给list。删除首节点时,Del函数会返回新的头指针,但原list变量仍指向已被free的内存块,后续打印时访问的是已释放的野指针,导致student_ID出现垃圾值(其余字段可能因内存暂未被覆盖而显示正常)。 Del函数逻辑冗余且存在风险:函数开头的if判断与后续while循环内的处理重复,且未先检查curr是否为NULL(若传入空链表会直接触发空指针访问错误)。
解决步骤
步骤1:修复主函数的调用逻辑
在main的case 2中,将Del(id,list);改为:
list = Del(id, list);
这样才能让主函数的链表头指针指向删除后的新链表。
步骤2:优化Del函数的逻辑
删除冗余的开头判断,统一用循环处理所有节点,同时增加空链表的判断:
StudentPtr Del(int id, StudentPtr list) { StudentPtr curr = list, prev = NULL; // 处理空链表情况 if (list == NULL) { return NULL; } while (curr != NULL) { if (curr->student_ID == id) { if (prev == NULL) { // 删除首节点,更新链表头 list = curr->next; } else { // 删除中间/尾节点,调整前驱指针 prev->next = curr->next; } free(curr); return list; } prev = curr; curr = curr->next; } // 未找到对应ID的节点,返回原链表 return list; }
额外补充
代码中还有两处未定义的函数调用:Lucky(list)和my_round(...),需要补充实现或替换为标准库函数(比如用round(),需包含<math.h>头文件),否则编译会报错。
内容的提问来源于stack exchange,提问作者hsn saed
相关产品推荐
相关产品推荐

