上后谈爱情

导航

 

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

输入样例:

4 3 4 -5 2  6 1  -2 0   //其中第一项4表示为输入的项数
3 5 20  -7 4  3 1

输出样例:

乘输出:15 24 -25 22 30 21 -10 20 -21 8 35 6 -33 5 14 4 -15 3 18 2 -6 1
加输出:5 20 -4 4 -5 2 9 1 -2 0

//此程序有一个BUG,在于输入数据P1项少于P2项输出结果才会正确(项数少的排成P1);但是我用排序组合使得P1为项数少的。
//说明程序有点小BUG,希望有道友能帮我指点出来

//此程序有一个BUG,在于输入数据P1项少于P2项输出结果才会正确(项数少的排成P1)
#include<cstdio>
#include<iostream>
#include<malloc.h>
#include <stdlib.h>
#include<vector>
using namespace std;
vector<int>a;
//创建链表头
typedef struct Polynomial//PolyNode是结构名,Polynomial是结构体别名
  {
    int cofe;
    int expon;
struct    Polynomial *link;
Polynomial():cofe(NULL),expon(NULL),link(NULL){}//构造函数初始化
}Polynomial;
 void add(int c,int e,Polynomial *PRear)
 {            
            
     
     {     Polynomial *p;
            p=(Polynomial*) malloc(sizeof(Polynomial));
            p->link=NULL;p->cofe=NULL;p->expon=NULL;
            PRear->cofe=c;
             PRear->expon=e;
            PRear->link=p;
            
     }
    

 }
Polynomial *Polyread()//指针函数
{
    Polynomial *Rear,*P;
    int c,e,N;
    scanf("%d",&N);//N表示最高阶阶数,如果要加上常数
    a.push_back(N);
    P=(Polynomial*) malloc(sizeof(Polynomial));//之前有个程序通过函数newNode 开辟空间
    P->link=NULL;
    Rear=P;//这一行程序非常重要,用Rear指向其Head头文件,通过P不断增加链表文件,最后Rear地址为最开始地址
        
    while(N--)//N表示输入项数
    {
        //    scanf("%d%d",&c,&e);if(c!=0 &&c!=NULL)//
            if(scanf("%d%d",&c,&e)==2&&c)//--可以让输入DD字符停止不录入到链表中
            {   add(c,e,P);
                 P=P->link;
            }
    }
    //多循环一次是加上常数项
    P->cofe=NULL;
    P->expon=NULL;
    
    return Rear;

}

Polynomial *MultiAdd(Polynomial *p1,Polynomial *p2)
{
    Polynomial *t1=p1,*t2=p2;//如果将p1,p2设置成指针的话可能好调试
    
    Polynomial *P,*Rear,*t;
    P=(Polynomial*) malloc(sizeof(struct Polynomial ));
    P->link=NULL;
    Rear=P;  //记住首地址
    while(t1->link && t2->link)
    {
        if((t1->expon) < (t2->expon))
        {
              add(t2->cofe,t2->expon,P);
              P=P->link;    
              t2=t2->link;
                
        }
        else if((t1->expon) > (t2->expon))
        {
             add(t1->cofe,t1->expon,P);
              P=P->link;    
              t1=t1->link;
        }
        else 
        {
            if(t1->cofe==-(t2->cofe))
            {    t1=t1->link; t2=t2->link;
            
            }
            else
            {
                add((t1->cofe+t2->cofe),t1->expon,P);
                P=P->link;
                t1=t1->link; t2=t2->link;
            }
        
        }
    }
    while(t1->link)
    {
        add(t1->cofe,t1->expon,P);
        P=P->link;
        t1=t1->link;
    }
    while(t2->link)
    {
        add(t2->cofe,t2->expon,P);
        P=P->link;
        t2=t2->link;
    }
    //在开头时候必须要加上其最高的阶数
    t=(Polynomial*) malloc(sizeof(struct Polynomial ));
    t->cofe=NULL;
    t->expon=Rear->expon;
    t->link=Rear;
    Rear=t;
    return Rear;
}

Polynomial *Mult(Polynomial *p1,Polynomial *p2)
{    Polynomial *t1,*t2;//在这里我是强制将项少的赋予t1
if(a[0]>=a[1])
    {    
        t1=p2;t2=p1;
        
    }
    else
    {
        t1=p1;t2=p2;
    }
    Polynomial *P,*Rear,*o,*p,*t;
    P=(Polynomial*) malloc(sizeof(struct Polynomial ));
    P->link=NULL;Rear=P;//保存地址
    
    //采用插入乘法
    {
            
        while(t2->link&&t2->cofe!=NULL)
            {    
                add((t1->cofe*t2->cofe),(t1->expon+t2->expon),P);//将P1第一项与P2各项相乘
                t2=t2->link;
                P=P->link;
           }
        t1=t1->link;
        while(t1->link&&t1->cofe!=NULL)
        {
            t2=p2;//开始插入
            p=P;
            while(t2->link&&t1->cofe!=NULL)
            {
                int e=t1->expon+t2->expon;
                int c=t1->cofe*t2->cofe;
            
                while (p->cofe!=NULL&&p->link &&p->link->expon>e)//开始插入
                            p=p->link;//指针不断移动到e大的前一位节点
                if(p->cofe!=NULL&& p->link&&p->link->expon==e )
                {
                    if((p->link->cofe+c)!=0)
                        p->link->cofe=c+p->link->cofe;
                    else//表示同指数系数相反,则要把此节点释放
                        {p->link=p->link->link;
                             
                        //    t=p->link;
                        //    p->link=t->link;
                            //free(t);
                       }
                }
                else
                {        o=(Polynomial*) malloc(sizeof(struct Polynomial ));//申请空间,直接插入
                        if(p->cofe!=NULL)
                        {    
                            o->cofe=c;o->expon=e;o->link=NULL;
                            o->link=p->link;
                            p->link=o;
                            p=p->link;
                    }
                else
                {
                    p->cofe=c;
                    p->expon=e;
                    p->link=o;
                    o->cofe=NULL;o->expon=NULL;o->link=NULL;
                }
                }
                t2=t2->link;
            }
            t1=t1->link;
        }
    }
    return Rear;
}


int main()
{    
    Polynomial *p1,*p2,*pp,*ps;
    
    p1=Polyread();
    p2=Polyread();

    pp=MultiAdd(p1,p2);
    ps=Mult(p1,p2);
    return 0;
}

 

 
posted on 2016-04-19 21:40  上后谈爱情  阅读(164)  评论(0编辑  收藏  举报