PTA 一元多项式的乘法与加法运算

一元多项式的乘法与加法运算

数据结构中的链表的最基础的问题。一元二次多项式的简单的加法和乘法。模块化的思想。记住即可。其中个人感觉需要注意的点有以下。

  1. 对于同一个指针的malloc函数请勿多次重复使用
  2. 调试的时候尽量细化,分块调试,很重要
  3. 多联系,第一次敲所以手很生
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#define maxn 100001

typedef struct PolyNode *Polynomial;
struct PolyNode{
        int coef;
        int expon;
        Polynomial next;
};

void Attach(int c,int e,Polynomial *pRear)
{
                //printf("-------------2---------------\n");
        Polynomial p;

        p=(Polynomial)malloc(sizeof(PolyNode));
        p->coef=c;
        p->expon=e;
        p->next=NULL;

        (*pRear)->next=p;
        *pRear=p;
               // printf("-------------22---------------\n");

}

Polynomial ReadPoly()
{
        Polynomial p,temp,rear;
        p=(Polynomial)malloc(sizeof(PolyNode));
        p->next=NULL;
        rear=p;

        int c,e,n;
        scanf("%d",&n);
        while(n--)
        {
                scanf("%d %d",&c,&e);
                        //printf("-------------5---------------\n");
                Attach(c,e,&rear);
                       // printf("-------------4---------------\n");
        }

        temp=p;
        p=p->next;
        free(temp);
               // printf("-------------end---------------\n");
        return p;

}

Polynomial AddPolynomial(Polynomial p1,Polynomial p2)
{
        Polynomial p3,rear,temp1,temp2,temp;
        if(!p1)
                return p2;
        if(!p2)
                return p1;

        p3=(Polynomial)malloc(sizeof(PolyNode));
        p3->next=NULL;
        rear=p3;
        temp1=p1;
        temp2=p2;

        while(temp1&&temp2)
        {
                if(temp1->expon>temp2->expon)
                {
                        if(temp1->coef!=0)
                                Attach(temp1->coef,temp1->expon,&rear);
                        temp1=temp1->next;
                }
                else if(temp2->expon>temp1->expon)
                {
                        if(temp2->coef!=0)
                                Attach(temp2->coef,temp2->expon,&rear);
                        temp2=temp2->next;
                }
                else
                {
                        if(temp1->coef+temp2->coef!=0)
                                Attach(temp1->coef+temp2->coef,temp1->expon,&rear);
                        temp1=temp1->next;
                        temp2=temp2->next;
                }

        }

        if(temp1)
        {
                while(temp1)
                {
                        Attach(temp1->coef,temp1->expon,&rear);
                        temp1=temp1->next;
                }

        }
        else if(temp2)
        {
                while(temp2)
                {
                    Attach(temp2->coef,temp2->expon,&rear);
                        temp2=temp2->next;
                }

        }

        temp=p3;
        p3=p3->next;
        free(temp);
        //printf("-------------1---------------\n");
        return p3;

}



Polynomial MultiOneterm(Polynomial p1,Polynomial p2)//p2是单个节点好了
{
        if((!p1)||(!p2)||(p1->coef==0)||(p2->coef==0))
                return NULL;
        Polynomial p,temp,rear,temp1,temp2;
        int c,e;
        p=(Polynomial)malloc(sizeof(PolyNode));
        p->next=NULL;
        rear=p;

        temp1=p1;
        temp2=p2;

        while(temp1)
        {
                c=temp1->coef*temp2->coef;
                e=temp1->expon+temp2->expon;
                Attach(c,e,&rear);

                temp1=temp1->next;
        }
        temp=p;
        p=p->next;
        free(temp);

        return p;

}

 void PrintPoly(Polynomial P);

Polynomial MultiPolynomial(Polynomial p1,Polynomial p2)
{
        if((!p1)||(!p2))
                return NULL;

        Polynomial temp2,p3,p4;
//        p3=(Polynomial)malloc(sizeof(PolyNode));
//        p3->next=NULL;
        p3=NULL;
        //rear=p3;

        //temp1=p1;
        temp2=p2;

        while(temp2)
        {
                p4=MultiOneterm(p1,temp2);
                p3=AddPolynomial(p3,p4);
                temp2=temp2->next;
        }

        return p3;
}


void PrintPoly(Polynomial p)
{
        if(!p)
                printf("0 0\n");


        else
        {
                int flag=0;
                while(p)
                {
                        if(flag==0)
                        {
                                flag=1;
                                printf("%d %d",p->coef,p->expon);
                                p=p->next;
                        }

                        else
                        {
                                printf(" ");
                                printf("%d %d",p->coef,p->expon);
                                p=p->next;
                        }

                }
                printf("\n");
        }
       // printf("-------------printend---------------\n");
}

int main()
{
        Polynomial p1,p2,p3,p4;
        p1=ReadPoly();
        p2=ReadPoly();
        //printf("-------------3---------------\n");
        p4=MultiPolynomial(p1,p2);
        PrintPoly(p4);
        p3=AddPolynomial(p1,p2);
        PrintPoly(p3);



        return 0;
}

/*
4 3 4 -5 2 6 1 -2 0
3 5 20 -7 4 3 1
*/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值