#include<stdio.h>
#include<stdlib.h>
struct PolyNode{
int coef;
int expon;
struct PolyNode* link;
};
typedef struct PolyNode*Polynomial;
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;//通过结构体内指针域link连接起来
(*pRear)=P;//更新Rear指向最后一个结点
}
Polynomial Read_Polynomial()
{
int N,coef,expon;
Polynomial P,Rear,first;//P为头结点 Rear始终为最后的那个结点指针
P=(Polynomial)malloc(sizeof(struct PolyNode));
scanf("%d",&N);
P->link=NULL;
Rear=P;
for(int i=0;i<N;i++)
{
scanf("%d %d",&coef,&expon);//输入系数和指数
Attach(coef,expon,&Rear);//将其链在Rear后
}
first=P;
P=P->link;//第一个结点
free(first);//free掉头节点
return P;
}
Polynomial Add_Polynomial(Polynomial P1,Polynomial P2)
{
Polynomial P,t1,t2,Rear;
t1=P1,t2=P2;//为了不改变p1p2 保持它们为原链表第一个结点
P=(Polynomial)malloc(sizeof(struct PolyNode));//为新的链表申请头节点
P->link=NULL;
Rear=P;
while(t1&&t2)
{
if(t1->expon>t2->expon)
{
Attach(t1->coef,t1->expon,&Rear);
t1=t1->link;
}
else if(t1->expon<t2->expon)
{
Attach(t2->coef,t2->expon,&Rear);
t2=t2->link;
}
else{
if((t1->coef+t2->coef)!=0)
{
Attach(t1->coef+t2->coef,t1->expon,&Rear);
t1=t1->link;
t2=t2->link;
}
else{
t1=t1->link;
t2=t2->link;
}
}
}
while(t1)
{
Attach(t1->coef,t1->expon,&Rear);
t1=t1->link;
}
while(t2)
{
Attach(t2->coef,t2->expon,&Rear);
t2=t2->link;
}
Rear=P;
P=P->link;//第一个结点
free(Rear);
return P;
}
Polynomial Muti_Polynomial(Polynomial P1,Polynomial P2)
{
Polynomial P,t1,t2,t,Rear;
int c,e;
if(!P1||!P2) return NULL;//两个多项式为零多项式
t1=P1,t2=P2;
P=(Polynomial)malloc(sizeof(struct PolyNode));//创建新的链表的头结点
P->link=NULL;
Rear=P;
while(t2)//先得到初始多项式(P1的第一次项*p2的每一项),得到初始的多项式后,后面依次进行乘法与初始的每一项进行比较
{
Attach(t1->coef*t2->coef,t1->expon+t2->expon,&Rear);
t2=t2->link;
}
t1=t1->link;//t1更新为下一项
while(t1)
{
t2=P2;//又更新为第一项,因为从头开始乘
Rear=P;//Rear重新指回P的头结点,因为需要将下一次乘后得到的多项式与初始的每一项多项式比较后插入P,得到非递减序列
while(t2)
{
c=t1->coef*t2->coef;
e=t1->expon+t2->expon;
while(Rear->link&&Rear->link->expon>e)
{
Rear=Rear->link;//循环直到找到指数小于等于e的项
}
if(Rear->link&&Rear->link->expon==e)
{
if(Rear->link->coef+c) //系数相加不为零
{
Rear->link->coef+=c;
}else
{ //系数相加为0,是零多项式
Rear->link->coef=0;
Rear->link->expon=0;
}
}
else
{//全是大于e的指数 将这个项链在后面
t=(Polynomial)malloc(sizeof(struct PolyNode));
t->coef=c;
t->expon=e;
t->link=Rear->link;
Rear->link=t;
Rear=Rear->link;
}
t2=t2->link;//以上while处理了一个t2*t1,所以更新t2为下一个结点
}
t1=t1->link;//处理完一轮t2,更新t1为下一个结点
}
Rear=P;
P=P->link;
free(Rear);
return P;
}
void PrintPoly(Polynomial P)
{
if(!P)//P空
{
printf("0 0");
}
while(P)
{
printf("%d %d",P->coef,P->expon);
P=P->link;
if(!P==NULL)//P为末尾项时 不输出空格
{
printf(" ");
}
}
printf("\n");
}
int main()
{
Polynomial P1,P2,PA,PM;
P1=Read_Polynomial();
P2=Read_Polynomial();
PM=Muti_Polynomial(P1,P2);
PrintPoly(PM);
PA=Add_Polynomial(P1,P2);
PrintPoly(PA);
return 0;
}
02-线性结构2 一元多项式的乘法与加法运算
于 2023-05-11 16:45:24 首次发布