直接上代码,代码几乎没加注释,不懂可直接问我(实现了判断是否是稀疏结构进行存储)
#include <iostream>
#include <stdio.h>
#define MAXSIZE 10000
#define OK 1
#define OVERFLOW -2
typedef int Status;
typedef int ElemType;
typedef struct xnode {
ElemType x;
ElemType z;
struct xnode *next;
} XNode, *Xilist;
typedef struct cnode {
ElemType data[MAXSIZE];
int length;
} CNode, *Coulist;
char ch;
Status Initc(Coulist &C1, Coulist &C2);
Status Initx(Xilist &X1, Xilist &X2);
Status CalculationOperationCou(Coulist &C1, Coulist &C2);
Status CalculationOperationXi(Xilist &X1, Xilist &X2);
int main() {
printf("=====请选择多项式是稀疏还是稠密?=====\n");
printf("*****1、稀疏多项式运算,请按1*****\n");
printf("*****2、稠密多项式运算,请按2*****\n");
printf("请输入即将输入的多项式的类别序号1或者2:");
int f;
Xilist X1, X2;
Coulist C1, C2;
while (1) {
scanf("%d", &f);
if (f == 1) {
if (Initx(X1, X2)) {
printf("稀疏多项式存储结构初始化成功!\n");
break;
} else {
printf("稀疏多项式存储结构初始化失败!\n");
break;
}
} else if (f == 2) {
if (Initc(C1, C2)) {
printf("稠密多项式存储结构初始化成功!\n");
break;
} else {
printf("稠密多项式存储结构初始化失败!\n");
break;
}
} else
printf("输入选择序号错误,请重新输入:");
}
printf("本程序只适合相减、相加、相乘运算,请输入将要进行的运算符号:");
getchar();
scanf("%c", &ch);
if (f == 2) {
CalculationOperationCou(C1, C2);
} else if (f == 1) {
CalculationOperationXi(X1, X2);
}
return 0;
}
Status Initc(Coulist &C1, Coulist &C2) {
C1 = new CNode;
C2 = new CNode;
if ((!C1) && (!C2)) {
exit(OVERFLOW);
} else {
C1->length = 0;
C2->length = 0;
return OK;
}
}
Status Initx(Xilist &X1, Xilist &X2) {
X1 = new XNode;
X1->next = NULL;
X2 = new XNode;
X2->next = NULL;
if ((!X1) && (!X2)) {
exit(OVERFLOW);
} else {
return OK;
}
}
Status CalculationOperationCou(Coulist &C1, Coulist &C2) {
int x, z, flag = 1;
bool Bool = false;
Coulist C3;
C3 = new CNode;
for (int k = 0; k < MAXSIZE; ++k) {
C1->data[k] = 0;
C2->data[k] = 0;
C3->data[k] = 0;
}
printf("请输入多项式1的系数和指数,以0 0结束!\n");
while (scanf("%d%d", &x, &z) && (x || z)) {
C1->data[z] += x;
C1->length++;
}
printf("请输入多项式2的系数和指数,以0 0结束!\n");
while (scanf("%d%d", &x, &z) && (x || z)) {
C2->data[z] += x;
C2->length++;
}
if (ch == '+') {
for (int i = 0; i < MAXSIZE; ++i) {
if (C1->data[i] != 0) {
C1->length--;
}
C2->data[i] = C2->data[i] + C1->data[i];
if (!C1->length) {
break;
}
}
} else if (ch == '-') {
for (int i = 0; i < MAXSIZE; ++i) {
C2->data[i] = C2->data[i] - C1->data[i];
}
} else {
for (int i = 0; i < MAXSIZE; ++i) {
if (C1->data[i] == 0) {
continue;
}
C1->length--;
for (int j = 0; j < MAXSIZE; ++j) {
if (C2->data[j] == 0) {
continue;
}
C2->length--;
C3->data[i + j] += C2->data[j] * C1->data[i];
if (!C2->length) {
break;
}
}
if (!C1->length) {
break;
}
}
C2 = C3;
}
printf("=====请选择输出结果的幂序=====\n");
printf("*****若想按照升序输入,请选择1*****\n");
printf("*****若想按照降序输入,请选择2*****\n");
while (1) {
scanf("%d", &x);
if (x != 1 && x != 2) {
printf("你输入的序号有误,请重新输入:\n");
} else {
break;
}
}
if (x == 1) {
if (C2->data[0] != 0) {
printf("%d", C2->data[0]);
flag--;
Bool = true;
}
for (int i = 1; i < MAXSIZE; ++i) {
if (flag) {
if (C2->data[i] > 0 && C2->data[i] != 1 && i != 1) {
printf("%dx^%d", C2->data[i], i);
flag--;
Bool = true;
} else if (C2->data[i] < 0 && i != 1 && C2->data[i] == -1) {
printf("-x^%d", i);
flag--;
Bool = true;
} else if (C2->data[i] < 0 && i == 1 && C2->data[i] == -1) {
printf("-x");
flag--;
Bool = true;
} else if (C2->data[i] < 0 && i != 1 && C2->data[i] != -1) {
printf("%dx^%d", C2->data[i], i);
flag--;
Bool = true;
} else if (C2->data[i] > 0 && C2->data[i] != 1 && i == 1) {
printf("%dx", C2->data[i]);
flag--;
Bool = true;
} else if (C2->data[i] > 0 && C2->data[i] == 1 && i == 1) {
printf("x", i);
flag--;
Bool = true;
} else if (C2->data[i] > 0 && C2->data[i] == 1 && i != 1) {
printf("x^%d", i);
flag--;
Bool = true;
}
} else {
if (C2->data[i] > 0 && C2->data[i] != 1 && i != 1) {
printf(" + %dx^%d", C2->data[i], i);
} else if (C2->data[i] < 0 && i != 1 && C2->data[i] == -1) {
printf("-x^%d", i);
} else if (C2->data[i] < 0 && i == 1 && C2->data[i] == -1) {
printf("-x");
} else if (C2->data[i] < 0 && i != 1 && C2->data[i] != -1) {
printf(" %dx^%d", C2->data[i], i);
} else if (C2->data[i] > 0 && C2->data[i] != 1 && i == 1) {
printf(" + %dx", C2->data[i]);
} else if (C2->data[i] > 0 && C2->data[i] == 1 && i == 1) {
printf(" + x");
} else if (C2->data[i] > 0 && C2->data[i] == 1 && i != 1) {
printf(" + x^%d", i);
}
}
}
if (!Bool) {
printf("0");
}
} else {
int f = 0;
for (int i = MAXSIZE - 1; i > 0; --i) {
if (C2->data[i] < 0) {
printf("%dx^%d", C2->data[i], i);
f++;
Bool = true;
} else if (C2->data[i] > 0) {
if (f != 0) {
printf(" + %dx^%d", C2->data[i], i);
f++;
Bool = true;
} else {
printf("%dx^%d", C2->data[i], i);
f++;
Bool = true;
}
}
}
if (C2->data[0] > 0) {
printf(" + %d", C2->data[0]);
} else if (C2->data[0] < 0) {
printf(" %d", C2->data[0]);
}
if (!Bool) {
printf("0");
}
}
return 0;
}
Status CalculationOperationXi(Xilist &X1, Xilist &X2) {
XNode *x1, *x2;
printf("请输入多项式1的系数和指数,以0 0结束!\n");
x1 = X1;
x2 = new XNode;
while (scanf("%d%d", &x2->x, &x2->z) && (x2->x || x2->z)) {
x1->next = x2;
x2->next = NULL;
x1 = x2;
x2 = new XNode;
}
x1 = X2;
printf("请输入多项式2的系数和指数,以0 0结束!\n");
while (scanf("%d%d", &x2->x, &x2->z) && (x2->x || x2->z)) {
x1->next = x2;
x2->next = NULL;
x1 = x2;
x2 = new XNode;
}
XNode *x4, *x5, *p, *q;
x4 = X1->next;
x5 = X2->next;
while (x4) {
p = x4->next;
while (p) {
if (x4->z == p->z) {
x4->x += p->x;
p->z = 0;
p->x = 0;
} else {
p = p->next;
}
}
x4 = x4->next;
}
while (x5) {
q = x5->next;
while (q) {
if (x5->z == q->z) {
x5->x += q->x;
q->z = 0;
q->x = 0;
} else {
q = q->next;
}
}
x5 = x5->next;
}
Xilist X3;
X3 = new XNode;
X3->next = NULL;
p = X3;
x5 = X1->next;
x4 = X2->next;
if (ch == '+') {
while (x4) {
int flag = 0;
if (x4->z || x4->x) {
while (x5) {
if ((x4->z == x5->z) && (x5->z || x5->x)) {
q = new XNode;
q->next = NULL;
q->x = x4->x + x5->x;
q->z = x4->z;
x5->x = 0;
x5->z = 0;
flag = 1;
p->next = q;
p = p->next;
flag++;
}
x5 = x5->next;
}
if (flag == 0) {
q = new XNode;
q->next = NULL;
q->x = x4->x;
q->z = x4->z;
x4->x = 0;
x4->z = 0;
x4->x = 0;
p->next = q;
p = p->next;
}
}
x4->x = 0;
x4->z = 0;
x4 = x4->next;
x5 = X1->next;
}
x5 = X1->next;
for (x5; x5 != NULL; x5 = x5->next) {
if (x5->x != 0) {
q = new XNode;
q->next = NULL;
q->x = x5->x;
q->z = x5->z;
x5->x = 0;
p->next = q;
p = p->next;
}
}
x4 = X2->next;
for (x4; x4 != NULL; x4 = x4->next) {
if (x4->x != 0) {
q = new XNode;
q->next = NULL;
q->x = x4->x;
q->z = x4->z;
x4->x = 0;
p->next = q;
p = p->next;
}
}
} else if (ch == '-') {
while (x4) {
int flag = 0;
if (x4->z || x4->x) {
while (x5) {
if ((x4->z == x5->z) && (x5->z || x5->x)) {
q = new XNode;
q->next = NULL;
q->x = x4->x - x5->x;
q->z = x4->z;
x5->x = 0;
x5->z = 0;
flag = 1;
p->next = q;
p = p->next;
flag++;
}
x5 = x5->next;
}
if (flag == 0) {
q = new XNode;
q->next = NULL;
q->x = x4->x;
q->z = x4->z;
x4->x = 0;
x4->z = 0;
x4->x = 0;
p->next = q;
p = p->next;
}
}
x4->x = 0;
x4->z = 0;
x4 = x4->next;
x5 = X1->next;
}
x5 = X1->next;
for (x5; x5 != NULL; x5 = x5->next) {
if (x5->x != 0) {
q = new XNode;
q->next = NULL;
q->x = 0 - x5->x;
q->z = x5->z;
x5->x = 0;
p->next = q;
p = p->next;
}
}
x4 = X2->next;
for (x4; x4 != NULL; x4 = x4->next) {
if (x4->x != 0) {
q = new XNode;
q->next = NULL;
q->x = x4->x;
q->z = x4->z;
x4->x = 0;
p->next = q;
p = p->next;
}
}
} else {
while (x4) {
if (x4->x) {
while (x5) {
if (x5->x) {
q = new XNode;
q->next = NULL;
q->x = x4->x * x5->x;
q->z = x4->z + x5->z;
p->next = q;
p = p->next;
}
x5 = x5->next;
}
}
x4 = x4->next;
x5 = X1->next;
}
}
x5 = X3->next;
while (x5) {
q = x5->next;
while (q) {
if (x5->z == q->z) {
x5->x += q->x;
q->z = 0;
q->x = 0;
} else {
q = q->next;
}
}
x5 = x5->next;
}
int x, flag = 0;
printf("=====请选择输出结果的幂序=====\n");
printf("*****若想按照升序输入,请选择1*****\n");
printf("*****若想按照降序输入,请选择2*****\n");
while (1) {
scanf("%d", &x);
if (x != 1 && x != 2) {
printf("你输入的序号有误,请重新输入:\n");
} else {
break;
}
}
if (x == 1) {
x5 = X3->next;
for (x5; x5 != NULL; x5 = x5->next) {
int t;
for (x4 = x5->next; x4 != NULL; x4 = x4->next) {
if (x5->z > x4->z) {
t = x5->z;
x5->z = x4->z;
x4->z = t;
t = x5->x;
x5->x = x4->x;
x4->x = t;
}
}
}
X3 = X3->next;
while (X3) {
if (flag) {
if (X3->z == 0) {
if (X3->x > 0) {
printf(" + %d", X3->x);
} else if (X3->x < 0) {
printf(" %d", X3->x);
}
} else {
if (X3->x > 0 && X3->x != 1 && X3->z != 1) {
printf(" + %dx^%d", X3->x, X3->z);
} else if (X3->x > 0 && X3->x != 1 && X3->z == 1) {
printf(" + %dx", X3->x);
} else if (X3->x > 0 && X3->x == 1 && X3->z == 1) {
printf(" + x");
} else if (X3->x > 0 && X3->x == 1 && X3->z != 1) {
printf(" + x^%d", X3->z);
} else if (X3->x < 0 && X3->x != -1 && X3->z != 1) {
printf(" %dx^%d", X3->x, X3->z);
} else if (X3->x < 0 && X3->x != -1 && X3->z == 1) {
printf(" %dx", X3->x);
} else if (X3->x < 0 && X3->x == -1 && X3->z == 1) {
printf(" -x");
} else if (X3->x < 0 && X3->x == -1 && X3->z != 1) {
printf(" -x^%d", X3->z);
}
}
} else {
if (X3->z == 0) {
printf("%d", X3->x);
} else if (X3->z == 1 && X3->x == 1) {
printf("x");
} else if (X3->x == -1 && X3->z == 1) {
printf("-x");
} else if (X3->x == -1 && X3->z != 1) {
printf("-x^%d", X3->z);
} else if (X3->z == 1 && X3->x != 1) {
printf("%dx", X3->x);
} else if (X3->z != 1 && X3->x == 1) {
printf("x^%d", X3->x);
} else {
printf("%dx^%d", X3->x, X3->z);
}
flag++;
}
X3 = X3->next;
}
} else if (x == 2) {
x5 = X3->next;
for (x5; x5 != NULL; x5 = x5->next) {
int t;
for (x4 = x5->next; x4 != NULL; x4 = x4->next) {
if (x5->z < x4->z) {
t = x5->z;
x5->z = x4->z;
x4->z = t;
t = x5->x;
x5->x = x4->x;
x4->x = t;
}
}
}
X3 = X3->next;
while (X3) {
if (flag) {
if (X3->z == 0) {
if (X3->x > 0) {
printf(" + %d", X3->x);
} else if (X3->x < 0) {
printf(" %d", X3->x);
}
} else {
if (X3->x > 0 && X3->x != 1 && X3->z != 1) {
printf(" + %dx^%d", X3->x, X3->z);
} else if (X3->x > 0 && X3->x != 1 && X3->z == 1) {
printf(" + %dx", X3->x);
} else if (X3->x > 0 && X3->x == 1 && X3->z == 1) {
printf(" + x");
} else if (X3->x > 0 && X3->x == 1 && X3->z != 1) {
printf(" + x^%d", X3->z);
} else if (X3->x < 0 && X3->x != -1 && X3->z != 1) {
printf(" %dx^%d", X3->x, X3->z);
} else if (X3->x < 0 && X3->x != -1 && X3->z == 1) {
printf(" %dx", X3->x);
} else if (X3->x < 0 && X3->x == -1 && X3->z == 1) {
printf(" -x");
} else if (X3->x < 0 && X3->x == -1 && X3->z != 1) {
printf(" -x^%d", X3->z);
}
}
} else {
if (X3->z == 0) {
printf("%d", X3->x);
} else if (X3->z == 1 && X3->x == 1) {
printf("x");
} else if (X3->x == -1 && X3->z == 1) {
printf("-x");
} else if (X3->x == -1 && X3->z != 1) {
printf("-x^%d", X3->z);
} else if (X3->z == 1 && X3->x != 1) {
printf("%dx", X3->x);
} else if (X3->z != 1 && X3->x == 1) {
printf("x^%d", X3->x);
} else {
printf("%dx^%d", X3->x, X3->z);
}
flag++;
}
X3 = X3->next;
}
}
}