使用单链表实现一元多项式的存储。
加法:
对于两个一元多项式中所有指数相同的项,对应系数相加,若其和不等于0,则构成多项式中的一项;对于两个一元多项式中所有指数不相同的项,则将此节点添加到多项式链表中去。
减法:
先将B多项式链表的数据域取反 ,然后再进行加法运算。
乘法:
将A多项式中的某一项去乘B多项式中的每一项,A多项式中的每一项重复如此,系数加至合适指数的系数上。
只写了多项式的建立和加法,减法和乘除也只是在上面的步骤上对指数和系数进行操作!
输出是先系数后指数!
#include"stdio.h"
#include"stdlib.h"
typedef struct PolyNode *Polynomial;/*定义结点*/
struct PolyNode/*建立节点,coef为系数,expon为指数*/
{
int coef;
int expon;
Polynomial link;
};
Polynomial ReadPoly();/读取链表,实际上是建立链表/
void PrintPoly(Polynomial P);/*打印链表*/
Polynomial Mult(Polynomial P1,Polynomial P2);/*相加*/
void Attach(int c,int e,Polynomial *prear);/*将节点链到PP链上作为输出(实际上就是建立链)*/
int main()/*主程序*/
{
Polynomial P1,P2,PP,PS;
P1 = ReadPoly();
P2 = ReadPoly();
PP = Mult(P1,P2);
PrintPoly(PP);
}
Polynomial ReadPoly()
{
int N,c,e;
Polynomial P,t,rear;
scanf("%d",&N);
P = (Polynomial)malloc(sizeof(struct PolyNode));
P->link=NULL;
rear=P;
while(N--)
{
scanf("%d %d",&c,&e);
Attach(c,e,&rear);/*链到链表上*/
}
t=P;P=P->link;free(t);
return P;
}
void Attach(int c,int e,Polynomial *prear)
{
Polynomial P;
P = (Polynomial)malloc(sizeof(struct PolyNode));
P->coef = c;
P->expon = e;
P->link =NULL;
(*prear)->link =P;
*prear=P;
}
Polynomial Mult(Polynomial P1,Polynomial P2)/*求和*/
{
Polynomial t1,t2,rear,P,q;
t1=P1;t2=P2;
P =(Polynomial)malloc(sizeof(struct PolyNode));
P->link = NULL;
rear = P;
while(t1&&t2)/*进行比较将节点链到链表上*/
{
if(t1->expon == t2->expon)/*比较指数,求出对应的节点系数*/
{
if(t1->coef+t2->coef!=0)
Attach(t1->coef+t2->coef,(t1->expon+t2->expon)/2,&rear);
t2=t2->link;t1=t1->link;
}
else if(t1->expon>t2->expon)
{
Attach(t2->coef,t2->expon,&rear);
t2=t2->link;
}
else
{
Attach(t1->coef,t1->expon,&rear);
t1=t1->link;
}
}
while(t1)/*如果有剩下将剩下的链补上*/
{
Attach(t1->coef,t1->expon,&rear);
t1=t1->link;
}
while(t2)
{
Attach(t2->coef,t2->expon,&rear);
t2=t2->link;
}
rear->link=NULL;
q=P;
P=P->link;
free(q);/*将我们之前申请的头节点释放掉*/
return P;
}
void PrintPoly(Polynomial P)/*打印相应的链,得到结果*/
{
int flag = 0;
if(!P)
{
printf("0 0\n");return;
}
while(P)
{
if(!flag)
flag = 1;
else
printf(" ");
printf("%d %d",P->coef,P->expon);
P=P->link;
}
printf("\n");
}