C语言单链表插入后表头出现多余0值节点问题求助
问题根因
你当前实现的是不带头结点的单链表逻辑,但init_list()初始化函数错误地预分配了一个无意义的头结点,这个节点的data字段未初始化,输出时显示为0,就是你看到的多余节点。
错误逻辑复现
- 调用
init_list()后,head指向一个malloc出来的节点,data未赋值(测试环境下值为0),link=NULL - 执行
insert 0 1时,pos=0走头插逻辑:新节点link指向当前head(也就是那个0值节点),然后head更新为新节点,直接形成了1->0->NULL的结构 size()函数遍历所有节点计数,所以返回2,和你的实际输出完全匹配
需要修改的代码点
1. 修复init_list初始化函数
原错误代码:
void init_list() { head = (Node*)malloc(sizeof(Node)); head->link = NULL; }
修改为:
void init_list() { head = NULL; // 不带头结点的链表初始化直接设空,不需要预分配节点 }
2. 修复delete函数的野指针问题
原delete函数的else分支里,removed变量未赋值就调用free(removed),属于典型野指针错误,修改如下:
void delete(int pos) { Node* prev, * removed; if (pos == 0 && is_empty() == 0) { removed = get_entry(pos); head = head->link; free(removed); } else { prev = get_entry(pos-1); if (prev != NULL) { removed = remove_next(prev); // 先获取待删除节点指针 free(removed); } } }
验证效果
修改完成后运行你的测试用例,输出就会符合预期:
输入:
2 insert 0 1 size
输出:
1->NULL 1 1->NULL
内容的提问来源于stack exchange,提问作者JeremyChang
相关产品推荐
相关产品推荐

