**7-2 一元多項式的乘法與加法運算 (20 分)**
設計函數分別求兩個一元多項式的乘積與和。
輸入格式:
輸入分2行,每行分別先給出多項式非零項的個數,再以指數遞降方式輸入一個多項式非零項係數和指數(絕對值均爲不超過1000的整數)。數字間以空格分隔。
輸出格式:
輸出分2行,分別以指數遞降方式輸出乘積多項式以及和多項式非零項的係數和指數。數字間以空格分隔,但結尾不能有多餘空格。零多項式應輸出0 0。
輸入樣例:
4 3 4 -5 2 6 1 -2 0
3 5 20 -7 4 3 1
輸出樣例:
15 24 -25 22 30 21 -10 20 -21 8 35 6 -33 5 14 4 -15 3 18 2 -6 1
5 20 -4 4 -5 2 9 1 -2 0
開始考慮到多項式加法用鏈表方便,使用了鏈表,發現乘法時候麻煩的要死。
沒有辦法,硬着頭皮做吧!
也就出了我的很愚蠢的做法。
#include<stdio.h>
#include<malloc.h>
typedef struct mi *list;
struct mi{
int c;
int e;
list next;
};
list creat(list *l) //創建鏈表
{
list p,r;
int c,e,n;
r=(list)malloc(sizeof(struct mi));
*l=r;
scanf("%d",&n);
while(n)
{
scanf("%d %d",&c,&e);
p=(list)malloc(sizeof(struct mi));
p->c=c;
p->e=e;
r->next=p;
r=r->next;
n--;
}
r->next=NULL;
return *l;
}
void print(list l) //各種情況輸出
{
list p;
p=l;
int k=0;
p=p->next;
if(p==NULL)
printf("0 0");
else if(p->c==0)
{
while(p){
if(p->c==0)
{
p=p->next;
continue;
}
else
{printf("%d %d",p->c,p->e);
k=1;
p=p->next;
break;
}
p=p->next;
}
if(p==NULL&&k==0)
printf("0 0");
}
else
{ printf("%d %d",p->c,p->e);
p=p->next;
}
while(p)
{
if(p->c==0)
{
p=p->next;
continue;
}
printf(" %d %d",p->c,p->e);
p=p->next;
}
}
list sot(list cc) //鏈表冒泡排序
{
list lc,ld,rear,p;
lc=cc->next;
if(lc==NULL)
return cc;
int x,y;
while(lc)
{
ld=lc->next;
while(ld)
{
if(ld->e>lc->e)
{
x=ld->e;
ld->e=lc->e;
lc->e=x;
y=ld->c;
ld->c=lc->c;
lc->c=y;
}
ld=ld->next;
}
lc=lc->next;
}
lc=cc->next;
ld=lc->next;
while(ld)
{
if(ld->e==lc->e)
{
lc->c=lc->c+ld->c;
p=ld;
ld=ld->next;
lc->next=ld;
free(p);
if(ld==NULL)
break;
}
ld=ld->next;
lc=lc->next;
}
return cc;
}
list complexcheng(list ca,list cb)
{
list la,lb,lc,rear,p;
la=ca->next;
lb=cb->next;
lc=(list)malloc(sizeof(struct mi));
rear=lc;
while(la)
{
while(lb)
{
p=(list)malloc(sizeof(struct mi));
p->c=la->c*lb->c;
p->e=la->e+lb->e;
if(p->e==rear->e)
{
rear->c=rear->c+p->c;
lb=lb->next;
continue;
}
rear->next=p;
rear=rear->next;
lb=lb->next;
}
la=la->next;
lb=cb->next;
}
rear->next=NULL;
lc=sot(lc);
return lc;
}
list complexjia(list ca,list cb) //多項式乘法
{
list lc,temp,rear,r,la,lb;
int sum;
la=ca;
lb=cb;
lc=(list)malloc(sizeof(struct mi));
rear=lc;
la=la->next;
lb=lb->next;
while(la&&lb)
{
r=(list)malloc(sizeof(struct mi));
if(complex(la->e,lb->e)==1)
{
r->c=la->c;
r->e=la->e;
rear->next=r;
rear=rear->next;
la=la->next;
}
else if(complex(la->e,lb->e)==3)
{
r->c=lb->c;
r->e=lb->e;
rear->next=r;
rear=rear->next;
lb=lb->next;
}
else
{
sum=la->c+lb->c;
r->c=sum;
r->e=la->e;
rear->next=r;
rear=rear->next;
lb=lb->next;
la=la->next;
}
}
for(;la;la=la->next)
{
r=(list)malloc(sizeof(struct mi));
r->c=la->c;
r->e=la->e;
rear->next=r;
rear=rear->next;
}
for(;lb;lb=lb->next)
{
r=(list)malloc(sizeof(struct mi));
r->c=lb->c;
r->e=lb->e;
rear->next=r;
rear=rear->next;
}
rear->next=NULL;
return lc;
}
int complex(int a,int b) //比較大小
{
if(a>b)
return 1;
else if(a==b)
return 2;
else
return 3;
}
int main()
{
list la,lb,lc,ld;
la=creat(&la);
lb=creat(&lb);
lc=complexjia(la,lb);
ld=complexcheng(la,lb);
print(ld);
printf("\n");
print(lc);
}