#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
typedef int ElemType;
typedef struct Node *PloyNode;
typedef struct Node *PloyList;
/*结构体*/
struct Node
{
int coef;
int expn;
PloyNode next;
};
/*带表头的单向链表*/
void CreatePloy(PloyList &L ,int n)
{
int i;
PloyNode p,q;
L=(PloyList)malloc(sizeof(struct Node)); //生成头结点
L->coef=0;
L->expn=0;
L->next=NULL; //初始化头结点
printf("输入多项式每项系数和幂\n");
q=L;
for(i=0;i<n;i++)
{
p=(PloyList)malloc(sizeof(struct Node));
scanf("%d%d",&p->coef,&p->expn);
q->next=p;
q=q->next;
}
q->next=NULL;
}
/* 输出多项式*/
void PolyShow(PloyList L, void(*vi)(ElemType ,ElemType ))
{
PloyList p=L->next;
while(p)
{
vi(p->coef ,p->expn);
if(p->next)
{
printf("+");
}
p=p->next;
}
printf("\n");
}
void visit(ElemType coef, ElemType expn)
{
if(coef!=0)
{
printf("%dX^%d",coef,expn);
}
}
PloyList AddPloy(PloyList La,PloyList Lb)
{
PloyList Lc;
PloyNode Pa,Pb,Pc;
Pa=La->next;
Pb=Lb->next;
Lc=(PloyList)malloc(sizeof(struct Node)); //生成头结点
Lc->coef=0;
Lc->expn=0;
Lc->next=NULL;
Pc=Lc;
while(Pa!=NULL&&Pb!=NULL)
{
if(Pa->expn > Pb->expn) //取系数小的那一项
{
Pc->next=Pb;
Pb=Pb->next;
}
else if(Pa->expn < Pb->expn) //取系数小的那一项
{
Pc->next=Pa;
Pa=Pa->next;
}
else
{
Pa->coef=Pa->coef+Pb->coef;
Pc->next=Pa;
Pb=Pb->next;
Pa=Pa->next;
}
Pc=Pc->next;
} //while end
while(Pa!=NULL)
{
Pc->next=Pa;
Pc=Pc->next;
Pa=Pa->next;
}
while(Pb!=NULL)
{
Pc->next=Pb;
Pc=Pc->next;
Pb=Pb->next;
}
return Lc;
}
int main()
{
PloyList a, b, c; //因为a,b,c只是声明,没有一个地址指向,所以前面需要用到引用
printf("输入多项式a, ");
CreatePloy(a,5);
printf("输入多项式b, ");
CreatePloy(b,5);
printf("多项式a :");
PolyShow(a, visit);
printf("\n");
printf("多项式b :");
PolyShow(b, visit);
printf("\n");
c = AddPloy(a,b);
PolyShow(c, visit);
return 0;
}