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

C语言合并两个有序链表遇问题:无输出求排查原因

排查有序链表合并无输出的问题

嘿,我来帮你揪出代码里的问题!你怀疑地址分配有问题是对的,咱们一步步拆解来看:

核心错误在哪里?

你的代码里有一行逻辑完全搞反了链表的链接关系,导致最终链表根本没法串联起来:

(*tail)=(*tail)->next;

咱们走一遍执行流程就懂了:

  1. 当你把*tail指向a或b的节点后,立刻把该节点的next设为NULL((*tail)->next=NULL;)
  2. 紧接着执行(*tail)=(*tail)->next;,这相当于把tail指向的位置(也就是当前节点的地址)直接改成了NULL
  3. 下一次循环时,*tail就是NULL,后续的赋值操作都没法链到原来的链表上,最后返回的head要么只有孤零零一个节点,要么直接是NULL,自然看不到输出。

修正后的完整代码

核心思路是让tail始终指向链表末尾待链接的位置(也就是当前最后一个节点的next指针的地址),而不是直接跳到next节点。修改后的代码如下:

struct Node* SortedMerge(struct Node* a, struct Node* b) {
    struct Node *head = NULL; // 初始化head为NULL,避免野指针风险
    struct Node **tail = &head;
    
    while (1) {
        if (a == NULL) {
            *tail = b;
            break;
        }
        if (b == NULL) {
            *tail = a;
            break;
        }
        
        if (a->data <= b->data) {
            *tail = a;
            a = a->next;
        } else {
            *tail = b;
            b = b->next;
        }
        // 让tail指向当前节点的next指针地址,准备链接下一个节点
        tail = &((*tail)->next);
    }
    return head;
}

关键修正点说明

  • 给head初始化NULL,避免未初始化的野指针导致的未知错误
  • 删掉了(*tail)->next=NULL;这行:原链表本身是有序的,我们不需要手动切断链接,后续会通过tail的更新自然衔接
  • 把错误的(*tail)=(*tail)->next;改成tail = &((*tail)->next);:这样tail始终盯着当前链表最后一个节点的next位置,下一次循环就能把新节点精准接到链表末尾。

这样修改后,合并后的链表就能正确串联所有节点,你应该能看到预期的输出了!

内容的提问来源于stack exchange,提问作者Damanjot Singh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:09:28