带头结点的单链表归并操作
- 2017-09-18 15:20:45
- 3,045 次阅读
- 0
单链表是链表中比较重要的形式之一,它不仅支持动态分配,而且插入与删除元素不需要移动元素的位置,只需改变指针的指示的位置就能完成结点的插入与删除操作。而单链表的归并操作相对比较难一点点,首先是指针比较多,比较搞脑汁,其次是没有图例或者是动画演示,真的很难搞清楚程序是怎么执行的。下面是C程序写的单链表归并操作与图例演示:
(1)单链表归并图片展示:
①三个单链表的初始状态如下图:
②一个循环的单链表执行状态如下图:
③最终执行状态如下图:
(2)C语言的单链表归并程序如下所示:
void mergeList(LNode *La,LNode *Lb,LNode *&Lc)
{
LNode *pa=La->next;//pa用来跟踪La的最小值结点
LNode *pb=Lb->next;//pb用来跟踪Lb的最小值结点
LNode *rc; //rc始终指向Lc的终端结点
Lc=La; //用La的头结点作为Lc的头结点
Lc->next=NULL; //从La链表中取下头结点作为新链表的头
free(Lb); //Lb的头结点已无用,则释放掉
rc=Lc; //rc指向Lc,此时头结点也是终端结点
while(pa!=NULL&&pb!NULL)//当pa与pb都不空时,选取pa与pb所指结点中的较小者插入Lc的尾部
{
if(pa->data<=pb->data)
{
rc->next=pa;pa=pa->next;
rc=rc->next;
}
else
{
rc->next=pb;pb=pb->next;
rc=rc->next;
}
}
rc->next=NULL;
/*以下两个if语句将还有剩余结点的链表链接到Lc的尾部*/
if(pa!=NULL) rc->next=pa;
if(pb!=NULL) rc->next=pb;
}
文章评论 (0)