一元多项式计算器 数据结构

直接上代码,代码几乎没加注释,不懂可直接问我(实现了判断是否是稀疏结构进行存储)

#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;//临时变量,分别指向X1,X2
    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;
        }
    }
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值