02-線性結構2 一元多項式的乘法與加法運算 (20point(s))
設計函式分別求兩個一元多項式的乘積與和。
輸入格式:
輸入分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 <stdlib.h>
typedef struct PolyNode*Polynomial;
struct PolyNode{
int coef;
int expon;
Polynomial link;
};
Polynomial readpoly();
void Attach(int c,int e,Polynomial* prear); //在末尾新增加一項
Polynomial Add(Polynomial p1,Polynomial p2);//加法
Polynomial Mult(Polynomial p1,Polynomial p2);//乘法
void Printpoly(Polynomial p);//輸出函式
int main()
{
Polynomial P1,P2,PP,PS;
P1=readpoly();
//Printpoly(P1);
P2=readpoly();
//Printpoly(P2);
PP=Mult(P1,P2);
Printpoly(PP);
printf("\n");
PS=Add(P1,P2);
Printpoly(PS);
return 0;
}
Polynomial readpoly(){ //讀取輸入的多項式
int c=0,e=0,N;
Polynomial p=(Polynomial)malloc(sizeof(struct PolyNode));
p->link=NULL;
Polynomial rear=p;
scanf("%d",&N);
while(N--){
scanf("%d%d",&c,&e);
if(c==0) //判斷是否輸入的系數是否為0,若為0 則跳過
continue;
Attach(c,e,&rear);
}
Polynomial t=p;
p=p->link;
free(t);
return p;
}
void Attach(int c,int e,Polynomial*prear){
Polynomial p=(Polynomial)malloc(sizeof(struct PolyNode));
p->coef=c;
p->expon=e;
p->link=NULL;
(*prear)->link=p;
*prear=p;
}
Polynomial Add(Polynomial p1,Polynomial p2){
Polynomial t,p,t1=p1,t2=p2,rear;
p=(Polynomial)malloc(sizeof(struct PolyNode));
rear=p;
t=p;
while(t1&&t2){
if(t1->expon==t2->expon){
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;
}
}
else if(t1->expon>t2->expon){
Attach(t1->coef,t1->expon,&rear);
t1=t1->link;
}
else{
Attach(t2->coef,t2->expon,&rear);
t2=t2->link;
}
}
if(t1){
rear->link=t1;
}
if(t2){
rear->link=t2;
}
p=p->link;
free(t);
return p;
}
Polynomial Mult(Polynomial p1,Polynomial p2){
Polynomial t,p,t1=p1,t2=p2,rear;
int c,e;
p=(Polynomial)malloc(sizeof(struct PolyNode));
rear=p;
t=p;
while(t1==NULL||t2==NULL)
return NULL;
while(t2){
Attach(t1->coef*t2->coef, t1->expon+t2->expon,&rear);
t2=t2->link;
}
t1=t1->link;
while(t1){
rear=p;
t2=p2;
while(t2){
c=t1->coef*t2->coef;
e=t1->expon+t2->expon;
while(rear->link&&rear->link->expon>e){
rear=rear->link;
}
if(rear->link&&rear->link->expon==e){
if(rear->link->coef+c){ //判斷數是否為0 ,為0則 洗掉這一項
rear->link->coef+=c;
}
else{
t=rear->link;
rear->link=t->link;
free(t);
}
}
else{
t=(Polynomial)malloc(sizeof(struct PolyNode));
t->coef=c;
t->expon=e;
t->link=rear->link;
rear->link=t;
}
t2=t2->link;
}
t1=t1->link;
}
t=p;p=p->link;free(t);
return p;
}
void Printpoly(Polynomial p){
int flag=0;
if(p==NULL){
printf("%d %d",0,0);
return;
}
while(p){
if(flag==0){
flag=1;
}
else{
printf(" ");
}
printf("%d %d",p->coef,p->expon);
p=p->link;
}
return;
}
uj5u.com熱心網友回復:
老哥們幫忙看下吧轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/67765.html
標籤:C語言
上一篇:c語言結構體
下一篇:Stateflow流程圖
