题目描述:
实现两个一元多项式相加运算。
#include<stdio.h>
#include<stdlib.h>
typedef struct polynomial {
float coe;
int exp;
struct polynomial *next;
}Poly;
Poly *Create_Tail() {
int m;
scanf("%d", &m);
Poly *LA, *pNew, *r;
float coe1;
int exp1;
LA = (Poly *)malloc(sizeof(Poly));
LA->next = NULL;
r = LA;
getchar();
//printf("请输入系数和指数(输入0 0作为结束): \n");
scanf("(%f,%d)", &coe1, &exp1);
while (1) {
m--;
pNew = (Poly *)malloc(sizeof(Poly));
pNew->coe = coe1;
pNew->exp = exp1;
r->next = pNew;
r = pNew;
if (m == 0) {
break;
}
//printf("请输入系数和指数(输入0 0作为结束): \n");
scanf("(%f,%d)", &coe1, &exp1);
}
r->next = NULL;
return LA;
}
void Output(Poly *Head) {
int flag = 0;
Poly *LA = Head->next;
while (LA) {
if (LA->next == NULL) {
if (LA->exp == 0) {
printf("%.f", LA->coe);
break;
} else if (LA->exp == 1) {
printf("%.f", LA->coe);
printf("X");
break;
} else {
if (LA->coe >= 0) {
printf("+%.f", LA->coe);
printf("X^%d", LA->exp);
break;
} else {
printf("%.f", LA->coe);
printf("X^%d", LA->exp);
break;
}
}
} else {
if (flag == 0) {
if (LA->exp == 0) {
printf("%.f", LA->coe);
LA = LA->next;
} else if (LA->exp == 1) {
printf("%.f", LA->coe);
printf("X");
LA = LA->next;
} else {
if (LA->coe >= 0) {
printf("%.f", LA->coe);
printf("X^%d", LA->exp);
LA = LA->next;
} else {
printf("%.f", LA->coe);
printf("X^%d", LA->exp);
LA = LA->next;
}
}
flag = 1;
} else {
if (LA->exp == 0) {
printf("+%.f", LA->coe);
LA = LA->next;
} else if (LA->exp == 1) {
printf("+%.f", LA->coe);
printf("X");
LA = LA->next;
} else {
if (LA->coe >= 0) {
printf("+%.f", LA->coe);
printf("X^%d", LA->exp);
LA = LA->next;
} else {
printf("%.f", LA->coe);
printf("X^%d", LA->exp);
LA = LA->next;
}
}
}
}
}
}
Poly *add(Poly *Head1, Poly *Head2) {
Poly *LA, *LB, *LC, *r, *pNew;
LA = Head1->next;
LB = Head2->next;
LC = (Poly *)malloc(sizeof(Poly));
LC->next = NULL;
r = LC;
while (LA && LB) {
if (LA->exp < LB->exp) {
r->next = LA;
r = LA;
LA = LA->next;
} else if (LA->exp > LB->exp) {
r->next = LB;
r = LB;
LB = LB->next;
} else {
pNew = (Poly *)malloc(sizeof(Poly));
pNew->coe = LA->coe + LB->coe;
pNew->exp = LA->exp;
if (pNew->coe != 0) {
r->next = pNew;
r = pNew;
}
LA = LA->next;
LB = LB->next;
}
}
if (LA) {
r->next = LA;
} else {
r->next = LB;
}
return LC;
}
int main() {
Poly *Head1, *Head2;
Poly *LC;
//printf("开始建立第一个多项式:\n");
Head1 = Create_Tail();
//printf("输出第一个多项式: \n");
Output(Head1);
printf("\n");
//printf("\n开始建立第二个多项式:\n");
Head2 = Create_Tail();
//printf("输出第二个多项式: \n");
Output(Head2);
printf("\n");
LC = add(Head1, Head2);
Output(LC);
return 0;
}
只测了几组数据
可能有考虑不很全面的地方。
运行结果:
多项式相乘
#include<stdio.h>
#include<stdlib.h>
typedef struct polynomial {
float coe;
int exp;
struct polynomial *next;
}Poly;
Poly *Create_Tail() {
int m;
scanf("%d", &m);
Poly *LA, *pNew, *r;
float coe1;
int exp1;
LA = (Poly *)malloc(sizeof(Poly));
LA->next = NULL;
r = LA;
getchar();
//printf("请输入系数和指数(输入0 0作为结束): \n");
scanf("(%f,%d)", &coe1, &exp1);
while (1) {
m--;
pNew = (Poly *)malloc(sizeof(Poly));
pNew->coe = coe1;
pNew->exp = exp1;
r->next = pNew;
r = pNew;
if (m == 0) {
break;
}
//printf("请输入系数和指数(输入0 0作为结束): \n");
scanf("(%f,%d)", &coe1, &exp1);
}
r->next = NULL;
return LA;
}
void Output(Poly *Head) {
int flag = 0;
Poly *LA = Head->next;
while (LA) {
if (LA->next == NULL) {
if (LA->exp == 0) {
printf("%.f", LA->coe);
break;
} else if (LA->exp == 1) {
printf("%.f", LA->coe);
printf("X");
break;
} else {
if (LA->coe >= 0) {
printf("+%.f", LA->coe);
printf("X^%d", LA->exp);
break;
} else {
printf("%.f", LA->coe);
printf("X^%d", LA->exp);
break;
}
}
} else {
if (flag == 0) {
if (LA->exp == 0) {
printf("%.f", LA->coe);
LA = LA->next;
} else if (LA->exp == 1) {
printf("%.f", LA->coe);
printf("X");
LA = LA->next;
} else {
if (LA->coe >= 0) {
printf("%.f", LA->coe);
printf("X^%d", LA->exp);
LA = LA->next;
} else {
printf("%.f", LA->coe);
printf("X^%d", LA->exp);
LA = LA->next;
}
}
flag = 1;
} else {
if (LA->exp == 0) {
printf("+%.f", LA->coe);
LA = LA->next;
} else if (LA->exp == 1) {
printf("+%.f", LA->coe);
printf("X");
LA = LA->next;
} else {
if (LA->coe >= 0) {
printf("+%.f", LA->coe);
printf("X^%d", LA->exp);
LA = LA->next;
} else {
printf("%.f", LA->coe);
printf("X^%d", LA->exp);
LA = LA->next;
}
}
}
}
}
}
Poly *add(Poly *Head1, Poly *Head2) {
Poly *LA, *LB, *LC, *r, *pNew;
LA = Head1->next;
LB = Head2->next;
LC = (Poly *)malloc(sizeof(Poly));
LC->next = NULL;
r = LC;
while (LA && LB) {
if (LA->exp < LB->exp) {
r->next = LA;
r = LA;
LA = LA->next;
} else if (LA->exp > LB->exp) {
r->next = LB;
r = LB;
LB = LB->next;
} else {
pNew = (Poly *)malloc(sizeof(Poly));
pNew->coe = LA->coe + LB->coe;
pNew->exp = LA->exp;
if (pNew->coe != 0) {
r->next = pNew;
r = pNew;
}
LA = LA->next;
LB = LB->next;
}
}
if (LA) {
r->next = LA;
} else {
r->next = LB;
}
return LC;
}
Poly *Multip(Poly *Head1, Poly *Head2) {
Poly *LA, *LB, *LC, *LD, *r1 = NULL, *pNew, *r2 = NULL;
int flag = 0, sum = 0;
LC = (Poly *)malloc(sizeof(Poly));
LC->next = NULL;
r1 = LC;
LA = Head1->next;
while (LA) {
LD = (Poly *)malloc(sizeof(Poly));
LD->next = NULL;
r2 = LD;
LB = Head2->next;
while (LB) {
pNew = (Poly *)malloc(sizeof(Poly));
pNew->coe = LA->coe * LB->coe;
pNew->exp = LA->exp + LB->exp;
if (flag == 0) {
r1->next = pNew;
r1 = pNew;
} else {
r2->next = pNew;
r2 = pNew;
sum = 1;
}
LB = LB->next;
}
if (flag == 0) {
r1->next = NULL;
flag = 1;
} else {
r2->next = NULL;
}
if (sum == 1) {
LC = add(LC, LD);
flag = 1;
r1 = NULL;
r2 = NULL;
}
LA = LA->next;
}
return LC;
}
int main() {
Poly *Head1, *Head2;
Poly *LC;
//printf("开始建立第一个多项式:\n");
Head1 = Create_Tail();
//printf("输出第一个多项式: \n");
Output(Head1);
printf("\n");
//printf("\n开始建立第二个多项式:\n");
Head2 = Create_Tail();
//printf("输出第二个多项式: \n");
Output(Head2);
printf("\n");
LC = Multip(Head1, Head2);
Output(LC);
return 0;
}
运行结果: