数据结构---多项式的乘积与和(PTA)

来源:互联网 发布:数据脱敏的主要方法 编辑:程序博客网 时间:2024/05/18 13:26

https://pintia.cn/problem-sets/910354764736491520/problems/910354975319912449(一元多项式的乘法和加法)点击打开题目链接

注意:很巧妙地求解办法,技巧很多,需要好好理解,自己想的还不够,先记下,再找时间慢慢消化。

代码:

#include<stdio.h>#include<malloc.h>#include<stdlib.h>//函数状态码定义#define TRUE        1#define FALSE       0#define OK          1#define ERROR       0#define INFEASIBLE -1#define OVERFLOW   -2typedef int  Status;typedef struct{    int coef;//系数    int expn;//指数} Term;typedef Term  ElemType; //假设线性表中的元素均为typedef struct LNode{    ElemType data;//一个元素,包括系数和指数    struct LNode *next;} LNode,*LinkList;////typedef LinkList Polynomial;LinkList Insert(LinkList &P,LinkList q){    LNode *pre,*p;    pre=P;    p=P->next;    while(p&&p->data.expn>q->data.expn)//如果没到最后一个,并且指数较大,一直后移,                                       //直到找到一个比它小的    {        p=p->next;//当前结点        pre=pre->next;//当前结点的后一个结点    }    if(!p)//如果当前结点已经到了最后一个    {        pre->next=q;        q->next=NULL;//直接赋值    }    else    {        if(p->data.expn==q->data.expn)//否则,插入其中        {            int sum=(p->data.coef+q->data.coef);            if(!sum)            {                pre->next=p->next;                free(p);            }            else            {                p->data.coef=sum;            }        }        else        {            pre->next=q;            q->next=p;        }    }    return P;}LinkList CreatPolyn(LinkList &P,int n){    LinkList q;    P=(LNode *)malloc(sizeof(LNode ));    if(!P)        exit(OVERFLOW);    P->next=NULL;    for(int i=1; i<=n; i++)    {        q=(LNode *)malloc(sizeof(LNode));        if(!q)            exit(OVERFLOW);        scanf("%d %d",&q->data.coef,&q->data.expn);//两个结构体变量,直接写入        P=Insert(P,q);//创建链表    }    return P;}LinkList AddPoly(LinkList Pa,LinkList Pb){    LinkList pa,pb,temp;    LinkList Pc;    Pc=(LNode *)malloc(sizeof(LNode ));    if(!Pc)        exit(OVERFLOW);    Pc->next=NULL;    pa=Pa->next;    pb=Pb->next;    while(pb!=NULL)    {        temp=pb->next;        Pc=Insert(Pc,pb);        pb=temp;    }    while(pa!=NULL)    {        temp=pa->next;        Pc=Insert(Pc,pa);        pa=temp;    }    return Pc;}LinkList MulPoly(LinkList Pa,LinkList Pb){    LinkList pa,pb,pc;    LinkList Pc;    Pc=(LNode *)malloc(sizeof(LNode ));    if(!Pc)        exit(OVERFLOW);    Pc->next=NULL;    pa=Pa->next;    pb=Pb->next;    while(pa!=NULL)    {//        LinkList s;//            s=(LNode *)malloc(sizeof(LNode));//            s->next=NULL;        while(pb!=NULL)        {            LinkList q;            q=(LNode *)malloc(sizeof(LNode));            q->data.coef=(pa->data.coef)*(pb->data.coef);            q->data.expn=(pa->data.expn)+(pb->data.expn);            Pc=Insert(Pc,q);            pb=pb->next;        }        if(pb==NULL)            pb=Pb->next;        pa=pa->next;    }    return Pc;}void Output(LinkList &P){    LinkList p;    int flag=0;    p=P->next;    if(p==NULL)        printf("0 0");    else    {        while(p!=NULL)        {            if(p->data.coef!=0)            {                if(!flag)                    printf("%d %d",p->data.coef,p->data.expn);                else                    printf(" %d %d",p->data.coef,p->data.expn);                flag++;            }            p=p->next;        }    }    printf("\n");}int main(){    int n,m;    LinkList Pa,Pb,Pc,Pd;    Pc=(LNode *)malloc(sizeof(LNode ));    if(!Pc)        exit(OVERFLOW);    Pc->next=NULL;    Pd=(LNode *)malloc(sizeof(LNode ));    if(!Pd)        exit(OVERFLOW);    Pd->next=NULL;    scanf("%d",&n);    Pa=CreatPolyn(Pa,n);//创建乘积链表    scanf("%d",&m);    Pb=CreatPolyn(Pb,m);    Pd=MulPoly(Pa,Pb);    Pc=AddPoly(Pa,Pb);    Output(Pd);    Output(Pc);}
原创粉丝点击