一元多项式加法计算器

include

include

typedef struct Polynode {

int coef; // 系数
int exp;  // 指数
struct Polynode* next;

}Polynode,*Polylist;

//输入数据, 边输入边排序进链表
void InputDataAndSortingData(Polylist Polynomial, int n);

//初始化多项式链表
void Init(Polylist &Polynomial);

//将两个多项式相加
void PolynomialAdd(Polylist A, Polylist B);

// 输出计算结果
void DisplayResult(Polylist A);

// 指令输入与判断
int Input_judgefun(int function);

// 显示菜单
void Menu();

// 关于我们
void AboutUs();

int main() {

Menu();
int function;
function = Input_judgefun(function);
while (function != 0) {
    switch (function) {
    case 1:
        int n1; // n1 为多项式 A 的项数
        printf("请输入第一个多项式的项数:");
        scanf("%d", &n1);
        Polylist A;
        Init(A); // 初始化链表 A 
        InputDataAndSortingData(A, n1); // 输入并整理数据 

        
        int n2;// n2 为多项式 B 的项数
        printf("请输入第二个多项式的项数:");
        scanf("%d", &n2);
        Polylist B;
        Init(B);// 初始化链表 B 
        InputDataAndSortingData(B, n2);// 输入并整理数据 
        
        PolynomialAdd(A, B); // 进入函数开始计算 
        DisplayResult(A); // 显示计算结果 
        break;
    case 2:
        AboutUs();
        break;
    }

    printf("请输入下一步指令:\n");
    function = Input_judgefun(function);
}
printf("感谢使用!\n");
return 0;

}

//输入数据, 边输入边排序进链表
void InputDataAndSortingData(Polylist Polynomial, int n) {

if(n == 0){
    // 项数为零,直接返回 
    return;
}
int i;
Polylist q, p;
printf("请依次输入每一项的系数和指数:");
for (i = 1; i <= n; i++) {
    Polylist s = (Polylist)malloc(sizeof(Polynode));
    scanf("%d%d", &s->coef, &s->exp);
    if (!(Polynomial->next)) { // 插入第一个结点
        s->next = Polynomial->next;
        Polynomial->next = s;
    }
    else {
        // p、q 均为工作指针,其中 q 在前,p 在后 
        q = Polynomial;
        p = Polynomial->next;
        while (p) {
            if (s->exp > p->exp) {
                // 如果要插入的结点 s 的 exp 值大于 p 结点的 exp 值就将 s 插入到  p 结点之前 
                s->next = p;
                q->next = s;
                break;
            }else if(s->exp == p->exp){//指数相等系数直接相加 
                p->coef+=s->coef;
                break; 
            }else{// p、q 指针后移 
                q = q->next;
                p = p->next;    
            } 
        }
        if (!p) {// 插入节点的 exp 值是最小的,插在链表末尾
            s->next = q->next;
            q->next = s;
        }
    }
}

}

//将两个多项式相加,线性表合并算法
void PolynomialAdd(Polylist A, Polylist B) {

Polylist p, q, tail, temp;
int sum;
// 令 p 和 q 分别指向 A 和 B 多项式链表的第一个结点 
p = A->next;
q = B->next;
tail = A; // tail 指向多项式的尾结点 
while (p && q) { // 当两个多项式均未扫描结束时 
    if (p->exp > q->exp) {
        // p 指向的多项式指数大于 q 的指数,将 p 结点加入到和多项式中 
        tail->next = p;
        tail = p;
        p = p->next;
    }
    else if (p->exp == q->exp) { 
        // 若指数相等,则相应的系数相加 
        sum = p->coef + q->coef;
        if (sum != 0) {
            // 系数和非零,则系数和置入结点 p,p 加入到和多项式,
            // 释放结点 q,并将指针后移 
            p->coef = sum;
            tail->next = p;
            tail = p;
            p = p->next;
            temp = q; q = q->next; free(temp);
        }
        else {
            // 若系数和为零,则删除结点 p 与 q,并将指针指向下一个结点 
            temp = p; p = p->next; free(temp);
            temp = q; q = q->next; free(temp);
        }
    }
    else {  
        //  p 指向的多项式指数小于 q 的指数,将 q 结点加入到和多项式中 
        tail->next = q;
        tail = q;
        q = q->next;
    }
}
if (p) {
    // 多项式 A 中还有剩余,将剩余的结点加入到和多项式中 
    tail->next = p;
}
else {
    // 多项式 B 中还有剩余,将剩余的结点加入到和多项式中 
    tail->next = q;
}
free(B); //释放 B 链表所占的内存 

}

//初始化多项式链表
void Init(Polylist &X) {

X = (Polylist)malloc(sizeof(Polynode));
X->next = NULL; // 将链表的头节点的 next 域置为空 
X->exp = 32767; // 初始时头节点的 exp 域为无穷大 
X->coef = 32767; // 初始时头节点的 coef 域为无穷大 

}

// 输出计算结果
void DisplayResult(Polylist A) {

Polylist p,temp;
p = A->next;
printf("计算结果:");
if(p == NULL){ // 处理为相加为 0 的情况 
    printf("0");
}
else
while (p) {
    // 如果不是最后一个结点,则分别打印系数、未知元、指数、空格、加号、空格
    // 如果是最后一个结点 ,则分别打印系数、未知元、指数
    // 同平常书写一样,如果系数或指数为 1 则省略不打印,如果是常数项,则只打印常数 
    if (p->next != NULL && p->exp != 1 && p->coef != 1) {
        printf("%dx^%d + ", p->coef, p->exp);
    }
    else if (p->next != NULL && p->exp == 1 && p->coef != 1) {
        printf("%dx + ", p->coef);
    }
    else if (p->next != NULL && p->exp != 1 && p->coef == 1) {
        printf("x^%d + ", p->exp);
    }
    else if (p->next != NULL && p->exp == 1 && p->coef == 1) {
        printf("x + ");
    }
    else if (p->next != NULL && p->exp == 0) {
        printf("%d + ", p->coef);
    }
    else if(p->next == NULL && p->exp == 0){
        printf("%d", p->coef);
    }
    else if (p->next == NULL && p->exp != 1 && p->coef != 1) {
        printf("%dx^%d", p->coef, p->exp);
    }
    else if (p->next == NULL && p->exp == 1 && p->coef != 1) {
        printf("%dx", p->coef);
    }
    else if (p->next == NULL && p->exp != 1 && p->coef == 1) {
        printf("x^%d", p->exp);
    }
    else if (p->next == NULL && p->exp == 1 && p->coef == 1) {
        printf("x");
    }
    temp = p; 
    p = p->next;
    free(temp); // 依次释放每个节点的内存 
}
free(A); // 释放 A 节点 
printf("\n");

}

// 指令输入与判断
int Input_judgefun(int function){

scanf("%d", &function);
while (function < 0 || function > 2) {
    // 有效指令为 0、1、2,如菜单中所示 
    printf("输入指令有误!请重新输入:");
    scanf("%d", &function);
}
return function;

}

// 显示菜单
void Menu() {

printf("\t\t\t\t\t欢迎使用一元稀疏多项式加法计算器!\n");
printf("\t\t\t\t\t\t******菜单******\n");
printf("\t\t\t\t\t\t*              *\n");
printf("\t\t\t\t\t\t* 1.开始计算   *\n");
printf("\t\t\t\t\t\t*              *\n");
printf("\t\t\t\t\t\t* 2.关于我们   *\n");
printf("\t\t\t\t\t\t*              *\n");
printf("\t\t\t\t\t\t* 0.退出       *\n");
printf("\t\t\t\t\t\t*              *\n");
printf("\t\t\t\t\t\t****************\n");
printf("请输入对应功能前的数字:");

}

// 关于我们
void AboutUs(){

printf("更新时间:2020/7/3\n");

}

你可能感兴趣的:(数据结构)