#include<stdio.h>
#include<stdlib.h>
struct stu
{
int num;
struct stu *next;
};
struct stu *creat()
{
//建立一个链表
int n;
struct stu *p1,*p2,*head;
scanf("%d",&n);
p1=head=(struct stu *)malloc(sizeof (struct stu));
p1->next=NULL;
for(int i=0;i<n;i++)
{
p2=(struct stu *)malloc(sizeof(struct stu));
p2->next=NULL;
scanf("%d",&p2->num);
getchar();
p1->next=p2;
p1=p2;
}
p1->next=NULL;
return head;
}
int main()
{
struct stu *p1=NULL,*pt_a=NULL,*pt_b=NULL,*ptemp=NULL,*a=NULL,*b=NULL,*ptem=NULL,*h=NULL;
struct stu *head=NULL;
//新链表的表头
a=creat(); pt_a=a;
b=creat(); pt_b=b;
h=a; //head=pt_a;
// p1=head;
p1=h;
while (pt_a->next&&pt_b->next)
{
//判断一个链表是否遍历到结尾
if (pt_a->next->num>pt_b->next->num)
{
printf("\npt_a->next->num=%d,pt_b->next->num=%d\n",pt_a->next->num,pt_b->next->num);
ptem=pt_a->next;
//先把pt_a->next这个地址保留下来
ptemp=pt_b->next;
pt_b=pt_b->next;
p1->next=ptemp;
p1=ptemp;
pt_a->next=ptem;
continue;
}
if (pt_a->next->num<=pt_b->next->num)
{
printf("\npt_a->next->num=%d,pt_b->next->num=%d\n",pt_a->next->num,pt_b->next->num);
ptem=pt_b->next;
ptemp=pt_a->next;
pt_a=pt_a->next;
p1->next=ptemp;
p1=ptemp;
pt_b->next=ptem;
continue;
}
}
while (pt_a->next||pt_b->next)
{
if (pt_a->next)
{
ptem=pt_b->next;
ptemp=pt_a->next;
pt_a=pt_a->next;
p1->next=ptemp;
p1=ptemp;
pt_b->next=ptem;
continue;
}
if (pt_b->next)
{
ptem=pt_a->next;
ptemp=pt_b->next;
pt_b=pt_b->next;
p1->next=ptemp;
p1=ptemp;
pt_a->next=ptem;
continue;
}
}
p1->next=NULL;
printf("\n");
p1=h->next;
while (p1!=NULL)
{
printf("%5d",p1->num);
p1=p1->next;
}
return 0;
}
为什么我这两个有序链表不能合并为一个?
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
3条回答 默认 最新
- leewers 2016-09-28 14:24关注
从你的代码可以看出,你已经意识到操作p1 -> next实质上会导致两个旧链表无法访问,所以用了ptem来存储,并在执行操作后将pt_a或者pt_b的next指向ptem,但是有一个问题,在pt_a->next=ptem;这句代码之前,有两句关键代码p1->next=ptemp;和p1=ptemp; 想一下如果一开始p1和pt_a指向同一节点,然后p1->next指向了ptemp, 也就是将pt_a -> next指向了ptemp,然后将p1指向ptemp,但别忘了pt_a仍指向开始的节点,随后的pt_a -> next = ptem实质上干的事情就是将一开始p1指向的节点的next指针指向ptem(也就是a链表上该节点的下一个节点),这也就意味着p1->next = ptemp;这一操作被覆盖了,也就无效了。而这一情况不断出现,就产生了图中的结果,只有其中一条链表的元素加入了新链表。
另外,其实执行完第一个循环,直接将p1->next指向剩余的一条链表就行了,如果两条链表均为空了,则指向NULL。pt_a = pt_a -> next; pt_b = pt_b -> next; while(pt_a && pt_b){ if(pt_a->num > pt_b->num){ ptemp = pt_b; pt_b = pt_b -> next; p1 -> next = ptemp; p1 = ptemp; } else{ ptemp = pt_a; pt_a = pt_a -> next; p1 -> next = ptemp; p1 = ptemp; } } if(pt_a) p1 -> next = pt_a; else if(pt_b) p1 -> next = pt_b; else p1 -> next = NULL;
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报
悬赏问题
- ¥100 Jenkins自动化部署—悬赏100元
- ¥15 关于#python#的问题:求帮写python代码
- ¥20 MATLAB画图图形出现上下震荡的线条
- ¥15 关于#windows#的问题:怎么用WIN 11系统的电脑 克隆WIN NT3.51-4.0系统的硬盘
- ¥15 perl MISA分析p3_in脚本出错
- ¥15 k8s部署jupyterlab,jupyterlab保存不了文件
- ¥15 ubuntu虚拟机打包apk错误
- ¥199 rust编程架构设计的方案 有偿
- ¥15 回答4f系统的像差计算
- ¥15 java如何提取出pdf里的文字?