主题:[讨论]两个链表合成一个链表
沙诺sun
[专家分:0] 发布于 2006-10-29 12:20:00
怎样将两个链表合成一个?
我就是在函数声明和创建链表的时候卡住了
怎么改都是错的
谁写过这个程序吗
能不能把函数声明和创建的部分回复给我啊
回复列表 (共1个回复)
沙发
77706127 [专家分:30] 发布于 2006-10-30 13:00:00
我说不好,我想这个题目会说明点什么,我会把详细过程给你,希望你能从中得到点什么!!
设有两个按升序排列的单链表X和Y,其头指针分别是p,q,节点结构说明如下:
typedef struct nodel
{int data;
struct nodel *next;
}
node;
试设计一个算法void concat(node *p,*q)将它们合并成一个以p为头指针的单链表Z,使其仍然有序
[分析] 这个题目除了p,q两个指针外,还需要设置另外两个指针s,r.s指向正在合并生成的链表Z的头节点,让p,q分别指向链表X,Y当前待比较插入的链节点,而r指向Z中当前最后那个链节点。然后不断地比较p和q所指的链节点的数据域直,若p->data<=q->data,则将p指的链接点链接到r所指的链接点之后,否则将q指的链接点链接到r所指的链接点之后。当其中一个链表为空时,只需将另一个链表中剩余的链接点都链接到r所指的链接点之后即可。初始时,让s指向p和q所指向的链接点中直小的那个链接点。最后将s赋予p,则p指向合并后的链表Z。
[具体解答]
void concat(*p,*q)
{node *r,*s;
if(p->data<=q->data)
{s=p;r=p;p=p->next;}
else{s=q;r=q;q=q->next;}/*s指向p和q所指向接点中最小者*/
while(p!=NULL&&q!=NULL)
{if(p->data<=q->data)/*若当前p所指向节点的直不大于q所指向节点的直*/
{r->next=p;/*将p所指向的节点链接到r所指向的节点之后*/
r=p;p=p->next;}
else{r->next=q;/*将q所指向的节点链接到r所指向节点之后*/
r=q;q=q->next;}
}
r->next=p?p:q;/*插入剩余链节点*/
p=s;/*p指向合并后的链表Z的头节点*/
}
希望对你有帮助!!!!!!!!!!!
我来回复