由之前对单链表的熟悉,本文章结合一个经典例子总结一下,即合并有序的单链表,如图所示:
将La,Lb合并生成新的单链表Lc。基本思路如下:
将La赋值给Lc然后对比La的第一个元素和Lb的第一个元素,对比之后,开始钩链的过程。最终对比完成之后,生成Lc链表,删除Lb链表。同时记得在出现相同值得情况下,删掉一个元素,释放内存。先看一下链接了两个链表第一个元素的情况:
这个时候La的第一个元素Pa和Lb的第一个元素Pb已经对比完成,并进行链接。Pa和Pb分别后移,Pc指向链接完成的最后一个元素。
具体流程看代码:
//链表合并
LNode *Merge_Link(LNode *La, LNode *Lb)
{
LNode *Pa, *Pb, *Lc, *Pc, *tmp;
Pa = La->next;
Pb = Lb->next;
Lc = La;
Pc = La;
while(Pa != NULL && Pb !=NULL)
{
if(Pa->data < Pb->data){
Pc->next = Pa;//Pc的头结点与Pa相连
Pc = Pa; //Pc移到Pa的位置
Pa = Pa->next;//Pa后移一位
} else if(Pa->data > Pb->data) {
Pc->next = Pb;//Pc的头结点与Pb相连
Pc =Pb; //Pc移到Pb的位置
Pb = Pb->next; //Pb后移一位
} else if(Pa->data == Pb->data) {
Pc->next = Pa;//Pc的头结点与Pa相连
Pc = Pa;//pc移动到Pa的位置
Pa = Pa->next;//Pa后移一位
tmp = Pb;//删掉Pb
Pb = Pb->next;
free(tmp);
}
}
//链接剩余的节点
if(Pa != NULL)
Pc->next = Pa;
else
Pc->next = Pb;
free(Lb);
return Lc;
}
来看下一个经典例子,多项式合并:
由题目可以知道,两个多项式合并无非就是质数相同的项系数相加,合并为一项。
因此链表结构定义如下:
//多项式的合并
typedef struct Ploy {
float copf;//系数
int expn;//指数
struct Ploy *next;
}
基本思路就是上面的两个链表合并的算法,具体参考程序如下:
//La多项式,Lb多项式合并为Lc多项式
Ploy *add_ploy(Play *La, Ploy *Lb)
{
Ploy *Lc, *Pa, *Pb, *Pc, *ptr;
float x;
Lc = Pc =La;
Pa = La->next;
Pb = Lb->next;
while(Pa!=NULL && Pb!=NULL) {
if(Pa->expn > Pb->expn) {//pa的指数比pb大,那么就把pb后移
Pc->next = Pb;
Pc = Pb;
Pb = Pb->next;
} else if(Pa->expn < Pb->expn) {//pa的指数比pb小,那么就把pa后移
Pc->next = Pa;
Pc =Pa;
Pa = Pa->next;
} else {//两个指数相等,那么就把系数相加
x = Pa->conf+Pb->conf;
if(abs(x)<10e-6){//系数相加为0,就删掉
pa = ptr;
pa->next = pa;
free(ptr);
ptr = pb;
pb->next=Pb;
free(ptr);
} else {//系数相加不是0,就合并
pc->next = pa;
pa->conf = x;
pc = pa;
pa = pa->next;
ptr = pb;
pb = pb->next;
free(ptr);
}
}
}
if(pa == NULL)
pc->next = pb;
else
pc->next = pa;
return Lc;
}