線性結構 2 一元多項式的乘法與加法運算 (20 分)
阿新 • • 發佈:2019-02-04
設計函式分別求兩個一元多項式的乘積與和。
輸入格式:
輸入分 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;
};
//這用指標傳值,實現值得更改
//新增新的多項式節點
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;
(*pRear)=P;
}
Polynomial ReadPoly(){
int N;
int c,e;
scanf("%d",&N);
Polynomial Rear;
Polynomial p;
p=(Polynomial)malloc(sizeof(struct PolyNode));
Rear=p;
if (N==0) {
Attach(0, 0, & Rear);
}else {
while (N--) {
scanf("%d%d",&c,&e);
Attach(c, e, &Rear);
}
}
return p;
}
//輸出多項式
void PrintPoly(Polynomial PPoly){
PPoly=PPoly->link;
int flag=0;//用來調整輸出格式的程式碼
while (PPoly) {
if (!flag) {
flag=1;
}else {
printf(" ");
}
printf("%d %d",PPoly->coef,PPoly->expon);
PPoly=PPoly->link;
}
printf("\n");
}
//兩個多項式相乘不按指數的大小順序也不考慮係數相加為零的情況
/*Polynomial Mult(Polynomial P1,Polynomial P2){
Polynomial P,tmp,p;//p用於記錄P2->link的位置
int c,e;
P1=P1->link;
P2=P2->link;
p=P2;
P=(Polynomial)malloc(sizeof(struct PolyNode));
tmp=P;
while(P1!=NULL){
while (P2!=NULL) {
c=P1->coef*P2->coef;
e=P1->expon+P2->expon;
Attach(c, e, &tmp);
P2=P2->link;
}
P1=P1->link;
P2=p;
}
return P;
}*/
//考慮分別以指數遞降方式輸出乘積多項式以及和多項式非零項的係數和指數
Polynomial Mult(Polynomial P1,Polynomial P2){
Polynomial tmp1,tmp2,Rear,P,t;
if (!P1||!P2) {
return NULL;
}
P=(Polynomial)malloc(sizeof(struct PolyNode));
P->link=NULL;
Rear=P;
int c,e;
tmp1=P1->link;
tmp2=P2->link;
//先判斷是否某個多項試為0
if (tmp1->coef==0||tmp2->coef==0) {
Attach(0, 0, &Rear);
return P;
}
//先得出一個初始多項式
while (tmp2) {
Attach(tmp1->coef*tmp2->coef, tmp1->expon+tmp2->expon, &Rear);
tmp2=tmp2->link;
}
tmp1=tmp1->link;
while (tmp1) {
tmp2=P2->link;
Rear=P;
while (tmp2) {
c=tmp1->coef*tmp2->coef;
e=tmp1->expon+tmp2->expon;
while (Rear->link&&Rear->link->expon>e) {
Rear=Rear->link;
}
if (Rear->link&&Rear->link->expon==e) {
//係數相加還要考慮是否為零
//1.不為零的情況
if (Rear->link->coef+c) {
Rear->link->coef+=c;
}else {
//2.為零的情況,考慮刪去節點
t=Rear->link;
Rear->link=t->link;
free(t);
}
}
else {
//小於當前節點的情況,需要重新構造一個節點
Polynomial p=(Polynomial)malloc(sizeof(struct PolyNode));
p->coef=c;
p->expon=e;
p->link=Rear->link;
Rear->link=p;
Rear=Rear->link;
}
tmp2=tmp2->link;
}
tmp1=tmp1->link;
}
return P;
}
Polynomial Add(Polynomial P1,Polynomial P2){
Polynomial tmp1,tmp2,P,t;
int c,e;
tmp1=P1->link;
tmp2=P2->link;
P=(Polynomial)malloc(sizeof(struct PolyNode));
P->link=NULL;
t=P;
while (tmp1&&tmp2) {
if (tmp1->expon==tmp2->expon) {//如果二者的指數相等,將二者的係數相加
if((tmp1->coef+tmp2->coef)!=0){
c=tmp1->coef+tmp2->coef;
e=tmp1->expon;
Attach(c, e, &t);
}
tmp1=tmp1->link;
tmp2=tmp2->link;
}else if (tmp1->expon>tmp2->expon) {
c=tmp1->coef;
e=tmp1->expon;
Attach(c, e, &t);
tmp1=tmp1->link;
}else {
c=tmp2->coef;
e=tmp2->expon;
Attach(c, e, &t);
tmp2=tmp2->link;
}
}
while(tmp1){
c=tmp1->coef;
e=tmp1->expon;
Attach(c, e, &t);
tmp1=tmp1->link;
}
while(tmp2){
c=tmp2->coef;
e=tmp2->expon;
Attach(c, e, &t);
tmp2=tmp2->link;
}
if(!P->link){
Attach(0,0,&t);
}
return P;
}
int main(int argc, char *argv[]) {
Polynomial P1,P2,PP,PS;
P1=ReadPoly();
P2=ReadPoly();
PP=Mult(P1,P2);
PrintPoly(PP);
PS=Add(P1,P2);
PrintPoly(PS);
}