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

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   -2

typedef 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);

}

你可能感兴趣的:(数据结构)