一元多项式的相加类似于两条链表的合并
当然前提是链表中的幂指数是按顺序排列的
此题中的链表采用的是升序排列,输出也是按升序输出的
#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); }