《浙大数据结构mooc》02-线性结构2 一元多项式的乘法与加法运算

#include <stdio.h>
#include <stdlib.h>

typedef struct PolyNode * PolyNomial;
struct PolyNode{
    int coef;
    int expon;
    PolyNomial next;
};
PolyNomial ReadPoly();//创建一个链表,读取输入的多项式,返回头指针
void Attach(int coef,int expon,PolyNomial * prear);//系数,指数,要添加的链表的尾指针的地址
PolyNomial Add(PolyNomial p1,PolyNomial p2);
PolyNomial Mult(PolyNomial p1,PolyNomial p2);
void printp(PolyNomial p);//传递头指针,输出多项式
int main()
{
    PolyNomial p1,p2,addp,multp;
    p1=ReadPoly();
    p2=ReadPoly();

    addp=Add(p1,p2);
    multp=Mult(p1,p2);
    printp(multp);
    putchar('\n');
    printp(addp);
    return 0;
}
PolyNomial ReadPoly()
{
    PolyNomial p,rear,temp;
    p=(PolyNomial)malloc(sizeof(struct PolyNode));p->next=NULL;
    rear=p;
    int N,coef,expon;
    scanf("%d",&N);
    while(N--){
        scanf("%d %d",&coef,&expon);
        Attach(coef,expon,&rear);
    }
    temp=p;
    p=p->next;
    free(temp);
    return p;
}
void Attach(int coef,int expon,PolyNomial * prear)
{
    //系数为0时,不添加,结果多项式不变
    if(coef){
    (*prear)->next=(PolyNomial)malloc(sizeof(struct PolyNode));
    *prear=(*prear)->next;(*prear)->next=NULL;
    (*prear)->coef=coef;
    (*prear)->expon=expon;
    }
}
PolyNomial Add(PolyNomial p1,PolyNomial p2)//p1为NULL时代表p1为零多项式,此时结果为p2
{
    PolyNomial p,temp,rear;
    p=(PolyNomial)malloc(sizeof(struct PolyNode));p->next=NULL;
    rear=p;

    while(p1&&p2){
        if(p1->expon>p2->expon){
            Attach(p1->coef,p1->expon,&rear);
            p1=p1->next;
        }else if(p1->expon<p2->expon){
            Attach(p2->coef,p2->expon,&rear);
            p2=p2->next;
        }else{
            Attach(p1->coef+p2->coef,p1->expon,&rear);
            p1=p1->next;
            p2=p2->next;
        }
    }
    while(p1){
        Attach(p1->coef,p1->expon,&rear);
        p1=p1->next;
    }
    while(p2){
        Attach(p2->coef,p2->expon,&rear);
        p2=p2->next;
    }

    temp=p;
    p=p->next;
    free(temp);
    return p;
}
PolyNomial Mult(PolyNomial p1,PolyNomial p2)
{
    PolyNomial p,temp,rear,t1,t2;
    int coef,expon;
    if(!p1||!p2)    return NULL;//p1==NULL代表p1多项式为零多项式
    t1=p1,t2=p2;
    p=(PolyNomial)malloc(sizeof(struct PolyNode));p->next=NULL;
    rear=p;

    while(t2){
        Attach(t1->coef*t2->coef,t1->expon+t2->expon,&rear);
        t2=t2->next;
    }
    t1=t1->next;
    while(t1){
        t2=p2;
        while(t2){
            rear=p;
            coef=t1->coef*t2->coef;
            expon=t1->expon+t2->expon;
            while(rear->next&&rear->next->expon>expon){/*定位该项应插入到哪里。当rear->next指向的节点指数<=expon时,将该项插入rear->next指向的节点或做加法*/
                rear=rear->next;
            }
            //若rear->next==NULL,只可能在最后插入,而不可能做同类项合并了
            if(rear->next && rear->next->expon==expon){
                //同类项合并后系数为0,则free这一项
                if(rear->next->coef+coef==0){
                    temp=rear->next;
                    rear->next=temp->next;
                    free(temp);
                }else {
                    rear->next->coef+=coef;
                }
            }else {
                temp=(PolyNomial)malloc(sizeof(struct PolyNode));
                temp->coef=coef;temp->expon=expon;
                temp->next=rear->next;
                rear->next=temp;
//                rear=rear->next;//why?这一步不需要
            }
            t2=t2->next;
        }
        t1=t1->next;
    }

    temp=p;
    p=p->next;
    free(temp);
//    printf("\ntest:");
//    printp(p);putchar('\n');
    return p;
}
void printp(PolyNomial p)
{
    if(p==NULL) printf("0 0");//若传进来的为0多项式
    while(p){
        printf("%d ",p->coef);
        if(p->next) printf("%d ",p->expon);
        else    printf("%d",p->expon);//结尾无空格
        p=p->next;
    }
}

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值