C语言合并两个有序链表遇问题:无输出求排查原因
排查有序链表合并无输出的问题
嘿,我来帮你揪出代码里的问题!你怀疑地址分配有问题是对的,咱们一步步拆解来看:
核心错误在哪里?
你的代码里有一行逻辑完全搞反了链表的链接关系,导致最终链表根本没法串联起来:
(*tail)=(*tail)->next;
咱们走一遍执行流程就懂了:
- 当你把
*tail指向a或b的节点后,立刻把该节点的next设为NULL((*tail)->next=NULL;) - 紧接着执行
(*tail)=(*tail)->next;,这相当于把tail指向的位置(也就是当前节点的地址)直接改成了NULL - 下一次循环时,
*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
相关产品推荐
相关产品推荐

