任务
设计合适的存储结构,完成一元多项式的相关运算。
分析
需要输入的信息有多项式的系数和指数,用来向系统动态申请内存;系数和指数用来构造每个结点,形成表。由于每次输入的多项式项数不确定,所以使用顺序表的链式存储。在此除了题目要求的加减运算,我还增加了乘法运算。
流程图
存储结构设计
/*存储结构:顺序表*/
#define MAXSIZE 20
typedef int ElemType;
typedef struct {
ElemType *data; /*数组存储数据元素,最大值为MAXSIZE*/
int highPower; /*最高次项*/
}SqList;
/*构造一个空的线性表L*/
void InitList(SqList *L) {
/*申请能储存定义的最大长度的线性表内存*/
L->data = (ElemType *) malloc(sizeof(ElemType) * MAXSIZE);
if (!L->data) /*判断空间是否申请成功*/
exit(1);
for (int i = 0; i < MAXSIZE; i++)
L->data[i] = 0;
L->highPower = 0; /*空表最高次项为0*/
}
/*销毁线性表L*/
void DestroyList(SqList *L) {
free(L->data); /*释放data指向的空间*/
L->data = NULL;
L->highPower = 0;
}
源代码
/*存储结构:顺序表*/
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 20
typedef int ElemType;
typedef struct {
ElemType *data; /*数组存储数据元素,最大值为MAXSIZE*/
int highPower; /*最高次项*/
}SqList;
/*构造一个空的线性表L*/
void InitList(SqList *L) {
/*申请能储存定义的最大长度的线性表内存*/
L->data = (ElemType *) malloc(sizeof(ElemType) * MAXSIZE);
if (!L->data) /*判断空间是否申请成功*/
exit(1);
for (int i = 0; i < MAXSIZE; i++)
L->data[i] = 0;
L->highPower = 0; /*空表最高次项为0*/
}
/*销毁线性表L*/
void DestroyList(SqList *L) {
free(L->data); /*释放data指向的空间*/
L->data = NULL;
L->highPower = 0;
}
/*创建多项式(用户输入)*/
void CreatePolynomial(SqList *L){
int coefficient, exponent;
/*循环输入常数项的每一项*/
for (int i = 0; i < 10; i++){
printf("请输入第%d项的常数项和指数项(结束请输入-1 -1):", i + 1);
scanf("%d %d", &coefficient, &exponent);
/*指数为-1则结束输入*/
if (exponent != -1){
L->data[exponent] += coefficient; /*数组下标为指数项,常数项存入下标对应的位置,若有相同指数项则常数项相加*/
if (L->highPower < exponent) /*指数项最大项为多项式长度*/
L->highPower = exponent;
}else
break;
}
printf("输入完毕!\n");
}
/*按照指数降序排列输出多项式*/
void PrintPolynomial(SqList L) {
printf("多项式为:");
if (L.data[0] != 0) /*若常数项为0则不输出,若不为0则只输出常数项*/
printf("%d", L.data[0]);
if (L.data[1] > 0) /*若常数项为0则不输出*/
printf("+%dx", L.data[1]); /*不输出指数项为1*/
else if (L.data[1] < 0)
printf("%dx", L.data[1]);
for (int i = 2; i <= L.highPower; i++) /*从第二项开始输出指数项*/
if (L.data[i] > 0) /*若常数项为0则不输出该项*/
printf("+%dx^%d", L.data[i], i);
else if (L.data[i] < 0)
printf("%dx^%d", L.data[i], i);
printf("\n");
}
/*两多项式相加*/
void TwoPolynomialAdd(SqList L1, SqList L2, SqList *L3) {
/*获取两多项式的最大项以确定相加后的多项式的最大项*/
L3->highPower = L1.highPower > L2.highPower ? L1.highPower : L2.highPower;
/*通过循环将两个多项式的同指数项的系数相加并保存到新的多项式中*/
for (int i = 0; i <= L3->highPower; i++)
L3->data[i] = L1.data[i] + L2.data[i];
}
/*两多项式相减*/
void TwoPolynomialSub(SqList L1, SqList L2, SqList *L3) {
L3->highPower = L1.highPower > L2.highPower ? L1.highPower : L2.highPower;
for (int i = 0; i <= L3->highPower; i++)
L3->data[i] = L1.data[i] - L2.data[i];
}
/*两多项式相乘*/
void TwoPolynomialMul(SqList L1, SqList L2, SqList *L3) {
/*两多项式的最高项相加为新多项式的最高项*/
L3->highPower = L1.highPower + L2.highPower;
/*通过双层循环将两个多项式的每一项两两相乘与并保存到新的多项式中*/
for (int i = 0; i <= L1.highPower; i++)
for (int j = 0; j <= L2.highPower; j++)
/*相乘后的指数项为两项指数项相加*/
L3->data[i + j] += L1.data[i] * L2.data[j];
}
int main()
{
SqList L1, L2, L3;
InitList(&L1);
InitList(&L2);
InitList(&L3);
int a;
printf("------------------一元多项式计算器----------------\n");
printf(" | 1.创建两个多项式 | | 2.输出两个多项式 |\n");
printf("--------------------------------------------------\n");
printf(" | 3.将两个多项式相加 | | 4.将两个多项式相减 |\n");
printf("--------------------------------------------------\n");
printf(" | 5.将两个多项式相乘 | | 6.退出系统 |\n");
printf("--------------------------------------------------\n");
while (1) {
printf("请输入指令:");
scanf("%d", &a);
switch (a){
case 1:
printf("-----------------开始输入多项式 1 -----------------\n");
CreatePolynomial(&L1);
printf("-----------------开始输入多项式 2 -----------------\n");
CreatePolynomial(&L2);
break;
case 2:
printf("多项式 1 为:");
PrintPolynomial(L1);
printf("多项式 2 为:");
PrintPolynomial(L2);
break;
case 3:
InitList(&L3);
TwoPolynomialAdd(L1, L2, &L3);
printf("两多项式相加后的结果为:");
PrintPolynomial(L3);
break;
case 4:
TwoPolynomialSub(L1, L2, &L3);
printf("两多项式相减后的结果为:");
PrintPolynomial(L3);
break;
case 5:
DestroyList(&L3);
InitList(&L3);
TwoPolynomialMul(L1, L2, &L3);
printf("两多项式相乘后的结果为:");
PrintPolynomial(L3);
break;
case 0:
printf("谢谢使用!\n");
exit(0);
default:
printf("暂无此功能\n");
}
}
}