关于使用静态链表实现一元多项式的相加&&乘积

一元多项式的相加类似于两条链表的合并

当然前提是链表中的幂指数是按顺序排列的

此题中的链表采用的是升序排列,输出也是按升序输出的

#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#include<string.h>
#define ok 1
#define error 0
typedef int Status;
typedef struct{
    int x;
    int z;
}ElemType; 
typedef struct PNode{
    ElemType data;
    struct PNode *next;
}PNode;
typedef struct{
    PNode *head;
}Pmial;//由结点组成的链表,只需要一个带头结点的指针 
Status InitP(Pmial *P)
{
    P->head=(PNode *)malloc(sizeof(PNode));
    if(P->head==NULL)
    return error;
    P->head->next=NULL;
    return ok;
}
Status input(Pmial *P)
{
    int x,z;
    PNode *newnode,*rear=P->head;
    while(scanf("%d%d",&x,&z)!=EOF)
    {
        if(x==-1&&z==-1)
        break;
        newnode=(PNode *)malloc(sizeof(PNode));
        newnode->data.x=x;
        newnode->data.z=z;
        newnode->next=rear->next;
        rear->next=newnode;
        rear=newnode;
    }
    return ok;
}
/*Status destroy(Pmial *P)
{
    PNode *p=P->head->next;
    while(p)
    {
        P->head->next=p->next;
        free(p);
        p=P->head->next;
    }
    free(P->head);
    P->head=NULL;
}*/
Status add(Pmial P1,Pmial P2,Pmial *P3)
{
    PNode *p1=P1.head->next,*p2=P2.head->next;
    PNode *newnode,*rear=P3->head;
    ElemType e;
    while(p1||p2)//当两者有一个不为空时 //当两者全为空结束 
    {
        if((!p2)||(p1&&p2->data.z<p1->data.z)){//p2为空节点取p1 
        e=p1->data;//或者p1不为空&&p2的指数小于p1的指数 
        p1=p1->next; 
    }
    else if((!p1)||(p2&&p1->data.z<p2->data.z)){//p1为空节点取p2 
        e=p2->data;//或者p2不为空&&p1的指数小于p2的指数 
        p2=p2->next;
    }
    else{//两者指数相等 
        e.x=p1->data.x+p2->data.x;
        e.z=p1->data.z;
        p1=p1->next;
        p2=p2->next; 
        if(e.x==0)
        continue;
    }
    newnode=(PNode *)malloc(sizeof(PNode));
    newnode->data=e;
    newnode->next=rear->next;
    rear->next=newnode;
    rear=newnode;
}
}
Status Mutiply(Pmial P1,Pmial P2,Pmial *P3)
{
    PNode *p1=P1.head->next,*p2=P2.head->next;
    Pmial pmutil,psum;//临时多项式用来记录中间项 
    PNode *rear,*newnode;
    ElemType e;
    while(p1){//依次取出P1的节点依次与P2节点相乘 
        p2=P2.head->next;
        InitP(&pmutil);//pmutil用来存放每次p1依次与p2相乘的乘积项 
        rear=pmutil.head;
        while(p2){
            e.x=p1->data.x*p2->data.x;
            e.z=p1->data.z+p2->data.z;
            newnode=(PNode *)malloc(sizeof(PNode));
            newnode->data=e;
            newnode->next=rear->next;
            rear->next=newnode;
            rear=newnode;
            p2=p2->next;
        }
        InitP(&psum);//pum用来存放每乘一次就得相加的pmutil 
        psum.head->next=P3->head->next;
        P3->head->next=NULL;
        add(pmutil,psum,P3);//实现每一次的pmutil与前一次相加 
        p1=p1->next;
    }
    return ok;
}
Status output(Pmial P)
{
    PNode *p=P.head->next;
    if(p==NULL)
    printf("0");
    while(p)
    {
        if(p->data.x)
          printf("%d %d ",p->data.x,p->data.z);
        p=p->next;
    }
    printf("\n");
}
int main()
{
    Pmial P1,P2,Psum,Pmutil;
    InitP(&P1);
    InitP(&P2);
    InitP(&Psum);
    InitP(&Pmutil);
    input(&P1);
    input(&P2);
    Mutiply(P1,P2,&Pmutil);
    output(Pmutil);
}

 

posted @ 2018-10-29 23:51  swenw  阅读(516)  评论(0编辑  收藏  举报