C语言将10元素链表均分到两个新链表返回空问题排查
核心问题排查
1. 最可能导致返回空链表的原因:insert函数参数传递错误
你当前调用insert(receive, aux->value)时,如果insert函数的定义是类似void insert(no *head, int val)的形式,那么形参head是实参receive的指针副本,函数内部对head的修改(比如给头指针赋值)不会影响外部的receive变量,所有插入操作实际没有生效,最终返回的receive还是初始的空指针。
解决方法二选一:
- 把
insert的第一个参数改为二级指针:void insert(no **head, int val),调用时传入&receive - 改造
insert为返回新头指针的形式:no* insert(no *head, int val),调用时写receive = insert(receive, aux->value)
2. 两个拷贝函数的逻辑错误
copylist函数错误点
- 遍历前半段的while循环中没有对
count做自增,count始终为0,循环判断条件count < size/2永远成立,会遍历完整个主链表,而不是只取前半段 - 循环外
count = size/2的赋值没有任何作用,属于冗余代码
copylist1函数错误点
- 前半段遍历结束后,
aux已经指向后半段的第一个节点,额外执行aux=aux->next会跳过后半段第一个元素,导致少存一个值 - 遍历后半段的while循环中没有对
count做自增,count始终等于size/2,循环判断条件count < size永远成立,没有边界控制
修正后的代码示例
// 先假设已经改造insert为返回新头指针的形式,你可以根据自己的insert实现调整 no* copylist(no *list, no *listReceive,int size) { no *aux = list; no *receive = listReceive; int count = 0; while(aux != NULL && count < size/2) { receive = insert(receive, aux->value); aux = aux->next; count++; // 补全计数自增 } return receive; } no* copylist1(no *list, no *listReceive,int size) { no *aux = list; no *receive = listReceive; int count = 0; // 先走到后半段起始位置 while(aux != NULL && count < size/2) { aux = aux->next; count++; } // 移除多余的aux=aux->next while(aux != NULL && count < size) { receive = insert(receive, aux->value); aux = aux->next; count++; // 补全计数自增 } return receive; }
内容的提问来源于stack exchange,提问作者Zecaaa
相关产品推荐
相关产品推荐

