---恢复内容开始---指针
#include<stdio.h>it
#include<stdlib.h>io
typedef struct PolyNode *Polynomial;链表
struct PolyNode{数据
int coef;//系数di
int expon;//指数 时间
Polynomial link;//链表指针域指向下一地址 while
};co
Polynomial ReadPoly();//读入多项式cas
void Attach(int c,int e,Polynomial *pRear);//将每次读入的多项式链接
Polynomial Add(Polynomial P1,Polynomial P2);//多项式相加
Polynomial Mult(Polynomial P1,Polynomial P2);//多项式相乘
int Compare(int a,int b);//比较
void PrintPoly(Polynomial P);//输出多项式
int main(void)
{
Polynomial P1,P2,PS,PP;
P1=ReadPoly();//读入数据
P2=ReadPoly();
PP=Mult(P1,P2);//多项式相乘
PrintPoly(PP);
printf("\n");
PS=Add(P1,P2);//多项式相加
PrintPoly(PS);
return 0;
}
Polynomial ReadPoly()//读入数据
{
Polynomial P,Rear,t;
int c,e,N;
scanf("%d",&N);
P=(Polynomial)malloc(sizeof(struct PolyNode));//为方便表头插入,先产生一个临时空节点作为链表头
P->link =NULL;
Rear=P;//Rear始终指向链表的尾部
while(N--)
{
scanf("%d %d",&c,&e);
if(c!=0)//对系数为零的项进行判断
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;//将P指向的新节点插入到当前结果表达式尾项的后面
*pRear=P;//最后一项指向P
}
int Compare(int a,int b)//比较 ,a>b return 1,a<b return -1, a==b return 0
{
if(a>b)
return 1;
else if(a==b)
return 0;
else
return -1;
}
Polynomial Add(Polynomial P1,Polynomial P2)//多项式相加
{
Polynomial front,rear,temp;//front为头,Rear为尾
int sum;
rear=(Polynomial)malloc(sizeof(struct PolyNode));//为方便表头插入,先产生一个临时空节点作为链表头
front=rear;
while(P1&&P2)
switch(Compare(P1->expon ,P2->expon))
{
case 1://若是P1->expon>P2->expon
Attach(P1->coef,P1->expon,&rear);
P1=P1->link ;
break;
case -1://若是P1->expon<P2->expon
Attach(P2->coef,P2->expon,&rear);
P2=P2->link ;
break;
case 0://若是P1->expon=P2->expon
sum=P1->coef +P2->coef;
if(sum)//若是指数相等,先判断系数和是否为0
Attach(sum,P1->expon,&rear);
P1=P1->link;
P2=P2->link ;
break;
}
//将未处理完的多项式中全部节点复制到结果多项式中
while(P1)
{
Attach(P1->coef,P1->expon,&rear);
P1=P1->link;
}
while(P2)
{
Attach(P2->coef,P2->expon,&rear);
P2=P2->link;
}
rear->link=NULL;//释放头为空的节点
temp=front;
front=front->link ;
free(temp);
return front;
}
void PrintPoly(Polynomial P)//打印
{
int flag=0;
if(!P)
{
printf("0 0");
return ;
}
while(P)
{
if(!flag)
flag=1;
else
printf(" ");
printf("%d %d",P->coef ,P->expon );
P=P->link ;
}
}
Polynomial Mult(Polynomial P1, Polynomial P2)//多项式相乘
{
Polynomial P, Rear;
Polynomial t1, t2, t;
if (!P1 ||!P2)//判断两个链表是否为空
{
return NULL;
}
t1 = P1;
t2 = P2;
P = (Polynomial)malloc(sizeof(struct PolyNode));
Rear = P;
while (t2)//先让t1的第一项和t2的每一项相乘,构建出一个新链表,用于后来数据的插入
{
Attach(t1->coef*t2->coef, t1->expon + t2->expon, &Rear);
t2 = t2->link;
}
t1 = t1->link;
while (t1)
{
t2 = P2;
Rear = P;//Rear每次都从所构建的链表头开始,以便于寻找插入位置
while (t2)
{
int c = t1->coef*t2->coef;
int e = t1->expon + t2->expon;
while (Rear->link&&Rear->link->expon > e)//Rear每次都从所构建的链表头开始,以便于寻找插入位置
{
Rear = Rear->link;
}
if (Rear->link&&Rear->link->expon == e)//相等就不须要申请一个新的节点,只要把系数相加。
{
if (Rear->link->coef + c)//系数和不为0,
{
Rear->link->coef += c;
}
else//系数和为0,删除节点
{
t = Rear->link;
Rear->link = t->link;
free(t);
}
}
else//若是指数不相等,申请空间将将此项插入
{
t = (Polynomial)malloc(sizeof(struct PolyNode));
t->link = NULL;
t->coef = c;
t->expon = e;
t->link = Rear->link;
Rear->link = t;
Rear = Rear->link;
}
t2 = t2->link;
}
t1 = t1->link;
}
t2 = P;//释放空节点
P = P->link;
free(t2);
return P;
}别人的代码。不过好像有问题。有时间再改🙄