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

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


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





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值