数据结构第二周笔记(5)——线性结构(慕课浙大版本--XiaoYu)

108 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第8天,点击查看活动详情

2.4 多项式的加法运算实现

image-20220629052314628

采用不带头结点的单项链表,按照指数递减的顺序排列各项

image-20220629052450477

具体实现代码(数据结构)
struct PolyNode{
    int coef;//系数
    int expon;//指数
    struct PolyNode link;//指向下一个节点的指针
};
typedef struct PolyNode*Polynomial;
Polynomial P1,P2;
​
多项式加法运算(算法思路):
两个指针p1和p2分别指向这两个多项式第一个结点,不断循环:
    1. P1->expon == P2 -> expon(这里比较的其实是指数):系数相加,若结果不为0,则作为结果多项式对应项的系数。同时,P1和P2都分别指向下一项
    2. P1->expon > P2 -> expon:将P1的当前项存入结果多样式,并使P1指向下一项;
    3. P1->expon < P2 -> expon:将P2的当前项存入结果多样式,并使P2指向下一项;
​
当某一多项式处理完时,将另一个多项式的所有结点依次复制到结果多项式中去

image-20220629060519985

演变过程------------------------分割线

image-20220629060715728

接着是=>

image-20220629060827486

函数实现
Polynomial PolyAdd(Polynomial P1.Polynomial P2)
{
    Polynomial front,rear,temp;//多项式的头是第一个,尾巴第二个,
    int sum;
    rear = (Polynomial) malloc(sizeof(struct PolyNode));//临时申请一个空结点作为结果多项式的表头
    front = rear;//由front记录结果多项式链表头结点,申请的空间front都指向它
    while(P1 && P2)//当两个多项式都有非零待处理时(判空)
        switch(Compare(P1->expon,P2->expon)){//比较P1P2这两个项的所指向的当前这个项的指数,第一个值大返回1,第二个值大返回-1,两个值相等返回0
                case1://P1大
                        Attach(P1->coef,P1->expon,&rear);//两个参数分别代表我要拷贝的这一项的系数和指数
                        P1 = P1 -> link;
                        break;//形成的新的项把它接到rear的后面,P1往后挪
                case-1//P2大
                        Attach(P2->coef,P2->expon,&rear);
                        P2 = P2 -> link;
                        break;
                case0://一样大
                        sum = P1->coef + P2->coef;
                        if(sum)Attach(sum.P1->expon,&rear);//判定,如果为0就不用加到结果多项式里面去,不为零就把sum作为系数跟对于的指数凑在一起,把他接到rear的后面去
                        P1 = P1 -> link;
                        P2 = P2 -> link;
                        break;
        }
    //将未处理完的另一个多项式的所有节点依次复制到结果多项式中去
    for(;P1;P1 = P1 -> link) Attach(P1->coef,P1->expon,&rear);//第一个for循环处理P1不空,如果不空就是把P1后面的每一项全部Attach(接到结果多项式的后面的意思),同时把P1往后挪
    for(;P2;P2 = P2 -> link) Attach(P2->coef,P2->expon,&rear);//如果P1不空的话P2肯定就空了,也就把P2后面的每一项一个一个拷贝到rear的后面去
    rear ->link = NULL;//指向结果多项式的最后一项
    temp = front;
    front = front -> link;//令front指向结果多项式第一个非零项
    free(temp);//释放临时空表头结点  怎么释放?=>将front赋给temp,然后front往后挪,front原来是指向这个临时的表头结点,这个表头结点的下一项就是我们真正的多项式的第一项 
    return front;//返回结果多样式中这个单项链表的第一个结点
}
​
问题:如果当前p1指向项的(系数,指数)为(24),同时P2指向项为(26),那么循环中的switch是执行哪个case?
case -1
Attach实现
void Attach(int c,int e,Polynomial*pRear)//传进来的是c跟e的系数跟指数。当前最后一个结点的指针位置传进来的是Polynomial这个类型的指针(Polynomial本身也是指针),所以pRear实际上是指针的指针
    //C语言是函数常数值传递
{
    Polynomial P;
    
    P = (Polynomial)malloc(sizeof(struct PloyNode));//结点类型是struct PolyNode这个类型
    P -> coef = c;//对新结点赋值
    P -> expon = e;
    P -> link = NULL;
    (*pRear)->link = P;//把新申请的结点P插到rear的后面
    *pRear = P;//修改pRear值
}

image-20220629070700010

image-20220629070712967