数据结构入门学习系列-6(链表合并与多项式合并算法)

来源:互联网 发布:c语言的开发环境 编辑:程序博客网 时间:2024/05/16 07:07

由之前对单链表的熟悉,本文章结合一个经典例子总结一下,即合并有序的单链表,如图所示:


将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;}





阅读全文
0 0
原创粉丝点击