链表的连接问题,这个程序我不懂呀,高手来指点一下.

来源:百度知道 编辑:UC知道 时间:2024/06/02 09:15:12
已有a,b两个链表,每个链表中的结点包括学号,成绩,要求把两个链表合并,并按学号升序排列.
下面是连接的程序,我横看竖看也看不懂,特别是那两个循环条件,我一点思路也没有.而且,我感觉下面的这个链表也没有考虑到a,b当中的链表是空表的情况呀.哪位大虾指点一下.感激不尽.
struct student *insert(struct student *ah,struct student *bh)
{struct student *pa1,*pa2,*pb1,*pb2;
pa2=pa1=ah;
pb2=pb1=bh;
do
{while((pb1->num>pa1->num)&&(pa1->next!=NULL) )
{pa2=pa1;
pa1=pa1->next;
}
if(pb1->num<=pa1->num)
{if(ah==pa1)
ah=pb1;
else pa2->next=pb1;
pb1=pb1->next;
pb2->next=pa1;
pa2=pb2;
pb2=pb1;
}
} while((pa1->next!=NULL)||(pa1==NULL&&pb1!=NULL));/*不懂*/
if((pb1->num>pa1->num)||(pa1->next==NULL&&pb1!=NULL)) /*不懂*/
pa1->next=pb1;
return(ah);
}

你没说清楚,从这个程序来看应该是把两个已经按升序排列的链表合并,使其依然升序排列。
而且这个程序也不很好啊,试图包括空链的情况了,但是逻辑上有点问题,我修改了一下,你看看是不是清晰了许多。
struct student * insert(struct student * ah,struct student * bh)
{
struct student *pa1,*pa2,*pb1,*pb2;
if(ah==NULL)//链表a为空
ah=bh;
else
{
pa2=pa1=ah;
pb2=pb1=bh;
while(pb1!=NULL)//链表b未结束
{
while((pb1->num>pa1->num)&&(pa1->next!=NULL) ) //为pb1指向的节点在链表a中找到合适位置,pa2指向pa1的前一节点
{
pa2=pa1;
pa1=pa1->next;
}
if(pb1->num<=pa1->num) //找到大于pb1的节点pa1,将pb1插到pa1前pa2后
{
pa2->next=pb1;
pb1=pb1->next; //下一次将链表b的下一结点插入链表a
pb2->next=pa1;
pa2=pb2; //pb2的作用是在交换值的时候临时保存变量
pb2=pb1;
}
else //说明pa1->next==NULL,即链表a最后都没有找到大于pb1的,直接把链表b的后面接上即可
{
pa1->next=pb1;
break;
}
}
}

return ah;
}

链表啊````迷茫啊```