C语言实现数据结构之一元多项式计算

任务 

设计合适的存储结构,完成一元多项式的相关运算。

分析

需要输入的信息有多项式的系数和指数,用来向系统动态申请内存;系数和指数用来构造每个结点,形成表。由于每次输入的多项式项数不确定,所以使用顺序表的链式存储。在此除了题目要求的加减运算,我还增加了乘法运算。

流程图

存储结构设计 
/*存储结构:顺序表*/
#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");
        }
    }
 	
}
运行结果

  • 9
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值