求耐心的【高手】详细解答高程中的又一升序链表合并问题

kakajenifer 2003-08-25 02:31:43
以下是高程书的例题。看不懂变量的意思。

想请问:
【1】a,b,p,q这四个变量分别做什么用?求详细解答,在每个语句里分别做什么用的?
【2】程序中的思路是如何的?能否详细解释一下?

题目:函数merge(intNode *a,intNode *b)将两个升序链表a和b合并成一个升序链表并返回首指针。


-----
typedef struct element
{
int val;
struct element *next;
}intNode;
intNode *merge(intNode *a,intNode *b)
{ intNode *h=a,*p,*q;
while(b)
{ for(p=h;p&&p->val<b->val;q=p,p=p->next);
if(p==h)___①__; /* h=b */
else ___②__; /* q->next=b */
q=b;b=b->next;
___③___; /* q->next=p */
}
return h;
}
...全文
120 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
acidprince 2003-08-26
  • 打赏
  • 举报
回复
楼上的~!*h是新表的头结点,h根本就没有参与到循环当中去。判断if(p==h) h=b;只是当b表的头结点比a表要小一种特殊情况,当for循环第一次时p==h的情况有可能成立,也有可能不成立(判断新表头结点到底是在a表上,还是在b表上)。当循环到第二次往后时,虽然每次将p从重新定位到h,但是经过for后,p==h不可能成立(for语句的功能实际上是寻找新表中小于b最大结点)。所以h是不移动的,它是新表的头结点,头结点动了,表不就变了吗??
kakajenifer 2003-08-26
  • 打赏
  • 举报
回复
还有要补充的吗?
ppm07 2003-08-26
  • 打赏
  • 举报
回复
原理是这样的:首先把两个指针分别指向单链表的表头,一个指针h做大循环,另一个b做小循环。在小循环内比较当前两个指针所指向的val值,如果不满足,把h所指向的结点挂在p的前面(这步操作需要保存p的前一个结点,q就是这个作用)。又由于两个链表都是不带头结点的,所以在当前结点前插入一个结点时要考虑当前结点是否是头结点,故有了if(p==h)这一句。至于插入操作的具体代码,数据结构上讲的很清楚了,完全理解之后理解这题就不算太困难了。
ppm07 2003-08-26
  • 打赏
  • 举报
回复
不好意思,外循环应该是b指针,是我写错了。
huanmm 2003-08-25
  • 打赏
  • 举报
回复
ppm07(浩浩白水)说得已经很清楚了啊。
不过这种source纯粹就是故弄玄虚
可读性太差
kakajenifer 2003-08-25
  • 打赏
  • 举报
回复
我需要一段文字性的描述简要的说说运作的流程
kakajenifer 2003-08-25
  • 打赏
  • 举报
回复
楼上,那a和b的含义呢?
pengzhenwanli 2003-08-25
  • 打赏
  • 举报
回复
mark.高程的题。我真的不看了。我认为没有什么意义。难得是他的分析
ppm07 2003-08-25
  • 打赏
  • 举报
回复
typedef struct element
{
int val;
struct element *next;
}intNode;

intNode *merge(intNode *a,intNode *b)
{
intNode *h=a,*p,*q; //h:合并后的线性表
//p:指向a中当前结点
//q:指向p的前一个结点
while(b)
{
for(p=h;p && p->val < b->val;q=p,p=p->next);//循环直到找到a中当前结点的val小于b中当前结点的val
if(p==h)
h=b; //处理当p指向a的头结点时的特殊情况
else //处理一般情况
q->next=b;
q=b;b=b->next;
q->next=p;
}
return h;
}
oopig 2003-08-25
  • 打赏
  • 举报
回复
基本思路就是对链表b做个循环,把b中的每个节点插入到链表a中去。其中while(b)就是对b链表的循环,for循环是用来在a链表中定位插入点的。

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧