#include <stdio.h>
#include <stdlib.h>
typedef struct PolyNode * PolyNomial;
struct PolyNode{
int coef;
int expon;
PolyNomial next;
};
PolyNomial ReadPoly();//创建一个链表,读取输入的多项式,返回头指针
void Attach(int coef,int expon,PolyNomial * prear);//系数,指数,要添加的链表的尾指针的地址
PolyNomial Add(PolyNomial p1,PolyNomial p2);
PolyNomial Mult(PolyNomial p1,PolyNomial p2);
void printp(PolyNomial p);//传递头指针,输出多项式
int main()
{
PolyNomial p1,p2,addp,multp;
p1=ReadPoly();
p2=ReadPoly();
addp=Add(p1,p2);
multp=Mult(p1,p2);
printp(multp);
putchar('\n');
printp(addp);
return 0;
}
PolyNomial ReadPoly()
{
PolyNomial p,rear,temp;
p=(PolyNomial)malloc(sizeof(struct PolyNode));p->next=NULL;
rear=p;
int N,coef,expon;
scanf("%d",&N);
while(N--){
scanf("%d %d",&coef,&expon);
Attach(coef,expon,&rear);
}
temp=p;
p=p->next;
free(temp);
return p;
}
void Attach(int coef,int expon,PolyNomial * prear)
{
//系数为0时,不添加,结果多项式不变
if(coef){
(*prear)->next=(PolyNomial)malloc(sizeof(struct PolyNode));
*prear=(*prear)->next;(*prear)->next=NULL;
(*prear)->coef=coef;
(*prear)->expon=expon;
}
}
PolyNomial Add(PolyNomial p1,PolyNomial p2)//p1为NULL时代表p1为零多项式,此时结果为p2
{
PolyNomial p,temp,rear;
p=(PolyNomial)malloc(sizeof(struct PolyNode));p->next=NULL;
rear=p;
while(p1&&p2){
if(p1->expon>p2->expon){
Attach(p1->coef,p1->expon,&rear);
p1=p1->next;
}else if(p1->expon<p2->expon){
Attach(p2->coef,p2->expon,&rear);
p2=p2->next;
}else{
Attach(p1->coef+p2->coef,p1->expon,&rear);
p1=p1->next;
p2=p2->next;
}
}
while(p1){
Attach(p1->coef,p1->expon,&rear);
p1=p1->next;
}
while(p2){
Attach(p2->coef,p2->expon,&rear);
p2=p2->next;
}
temp=p;
p=p->next;
free(temp);
return p;
}
PolyNomial Mult(PolyNomial p1,PolyNomial p2)
{
PolyNomial p,temp,rear,t1,t2;
int coef,expon;
if(!p1||!p2) return NULL;//p1==NULL代表p1多项式为零多项式
t1=p1,t2=p2;
p=(PolyNomial)malloc(sizeof(struct PolyNode));p->next=NULL;
rear=p;
while(t2){
Attach(t1->coef*t2->coef,t1->expon+t2->expon,&rear);
t2=t2->next;
}
t1=t1->next;
while(t1){
t2=p2;
while(t2){
rear=p;
coef=t1->coef*t2->coef;
expon=t1->expon+t2->expon;
while(rear->next&&rear->next->expon>expon){/*定位该项应插入到哪里。当rear->next指向的节点指数<=expon时,将该项插入rear->next指向的节点或做加法*/
rear=rear->next;
}
//若rear->next==NULL,只可能在最后插入,而不可能做同类项合并了
if(rear->next && rear->next->expon==expon){
//同类项合并后系数为0,则free这一项
if(rear->next->coef+coef==0){
temp=rear->next;
rear->next=temp->next;
free(temp);
}else {
rear->next->coef+=coef;
}
}else {
temp=(PolyNomial)malloc(sizeof(struct PolyNode));
temp->coef=coef;temp->expon=expon;
temp->next=rear->next;
rear->next=temp;
// rear=rear->next;//why?这一步不需要
}
t2=t2->next;
}
t1=t1->next;
}
temp=p;
p=p->next;
free(temp);
// printf("\ntest:");
// printp(p);putchar('\n');
return p;
}
void printp(PolyNomial p)
{
if(p==NULL) printf("0 0");//若传进来的为0多项式
while(p){
printf("%d ",p->coef);
if(p->next) printf("%d ",p->expon);
else printf("%d",p->expon);//结尾无空格
p=p->next;
}
}
《浙大数据结构mooc》02-线性结构2 一元多项式的乘法与加法运算
最新推荐文章于 2023-08-11 18:16:39 发布