You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 16:06:04