题目
已知两个非降序链表序列S1与S2,设计函数构造出S1与S2合并后的新的非降序链表S3。
输入格式:
输入分两行,分别在每行给出由若干个正整数构成的非降序序列,用−1表示序列的结尾(−1不属于这个序列)。数字用空格间隔。
输出格式:
在一行中输出合并后新的非降序链表,数字间用空格分开,结尾不能有多余空格;若新链表为空,输出NULL
。
输入样例:
1 3 5 -1
2 4 6 8 10 -1
输出样例:
1 2 3 4 5 6 8 10
这道题目网上的参考代码有很多,但是提交之后还是会显示部分正确。经过调试之后,发现是输出格式的错误。
未经过更改的输出函数代码:
void Print(List L){
List p = L->next;
int cnt = 0;
if(p){
List r;
r = L;
while(r->next){
if(cnt==0){
printf("%d", r->data); /*先输出,再赋值,输出结果显示错误*/
r = r->next;
cnt++;
}else{
printf(" %d", r->data);
r = r->next;
}
}
}else{
printf("NULL");
}
printf("\n");
}
调试时发现输出为
此时观察头节点L,可以发现其中的data并未初始化,其值为
正好等于第一次输出的值。
将输出语句和赋值语句对调后,输出结果如下
原因:L为头节点,头节点和其它节点结构相同但是只存储地址,因此再将数据打印输出时需要跳过头节点。