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
相关产品推荐
相关产品推荐

