数据结构实验:一元多项式的加减乘

         这是本人的第一次创作,由于时间原因,无论是代码还是注释都有些许简陋,还请大家谅解,这点以后会慢慢改善的。另外,这只是为了被数据结构实验折磨的同学们能够应付一下,代码有些不够简洁的地方还请各路大神批评指正!

        废话不多说,代码附上:

#include<iostream>
using namespace std;

//定义一元多项式链表结点结构
typedef struct PNode {
    float coef;            //系数
    int expn;            //指数
    struct PNode* next;    //指针域
}*HLink;

void Build(HLink& H);//创建一元多项式链表
void Exp(HLink H);//实现输出一元多项式链表
void Add(HLink& H, HLink A, HLink B);//实现一元多项式的加和
void Mul(HLink& H, HLink A, HLink B);//实现一元多项式的乘积
int Judge();//容错函数
void Del(HLink& H);//删除多项式
void Mod(HLink& H);//修改多项式

int main() {
    int n, num = 0, i = 0;
    HLink a[100];
    for (int j = 0; j < 100; j++) {
        a[j] = new PNode;
    }
    //进行功能选项
    cout << "==================================" << endl;
    cout << "||请输入功能编号,运行相应功能\t||" << endl;
    cout << "||1.创建一元多项式\t\t||" << endl;
    cout << "||2.输出一元多项式\t\t||" << endl;
    cout << "||3.显示所有一元多项式\t\t||" << endl;
    cout << "||4.求两个多项式的和\t\t||" << endl;
    cout << "||5.求两个多项式的积\t\t||" << endl;
    cout << "||6.删除多项式\t\t\t||" << endl;
    cout << "||7.修改多项式\t\t\t||" << endl;
    cout << "||其他.退出\t\t\t||" << endl;
    cout << "==================================" << endl;
    while (1) {
        n = Judge();
        if (n < 1 || n>7) break;
        switch (n) {
        case 1:
            Build(a[i]);
            cout << "一元多项式创建成功!序号为" << i << endl;
            i++;
            break;
        case 2:
            cout << "请输入一元多项式序号:";
            num = Judge();
            while (num >= i) {
                cout << "无此多项式,请重新输入" << endl;
                num = Judge();
            }
            cout << "多项式" << num << ":";
            Exp(a[num]);
            break;
        case 3:
            cout << "当前多项式数量:" << i << endl;
            for (int k = 0; k < i; k++) {
                cout << "多项式" << k << ":";
                Exp(a[k]);
            }
            break;
        case 4:
            int s1, s2;
            if (i < 1) {
                cout << "多项式数量不够,请重新输入" << endl;
                break;
            }
            cout << "请输入第一个多项式的序号:" ;
            s1 = Judge();
            while (s1 >= i) {
                cout << "无此多项式,请重新输入" << endl;
                s1 = Judge();
            }
            cout << "请输入第二个多项式的序号:";
            s2 = Judge();
            while (s2 >= i) {
                cout << "无此多项式,请重新输入" << endl;
                s2 = Judge();
            }
            Add(a[i], a[s1], a[s2]);
            cout << "求和成功!求和后多项式序号为:" << i << endl;
            i++;
            break;
        case 5:
            int s3, s4;
            if (i < 1) {
                cout << "多项式数量不够,请重新输入" << endl;
                break;
            }
            cout << "请输入第一个多项式的序号:";
            s3 = Judge();
            while (s3 >= i) {
                cout << "无此多项式,请重新输入" << endl;
                s3 = Judge();
            }
            cout << "请输入第二个多项式的序号:";
            s4 = Judge();
            while (s4 >= i) {
                cout << "无此多项式,请重新输入" << endl;
                s4 = Judge();
            }
            Mul(a[i], a[s3], a[s4]);
            cout << "求积成功!求积后多项式序号为:" << i << endl;
            i++;
            break;
        case 6:
            cout << "请输入想要删除的多项式序号:";
            num = Judge();
            while (num >= i) {
                cout << "无此多项式,请重新输入" << endl;
                num = Judge();
            }
            Del(a[num]);
            cout << "删除成功!" << endl;
            break;
        case 7:
            cout << "请输入想要修改的多项式序号:";
            num = Judge();
            if (num >= i) {
                cout << "无此多项式,请重新输入" << endl;
                num = Judge();
            }
            Mod(a[num]);
            break;
        }
        cout << "==================================" << endl;
        cout << "||请输入功能编号,运行相应功能\t||" << endl;
        cout << "||1.创建一元多项式\t\t||" << endl;
        cout << "||2.输出一元多项式\t\t||" << endl;
        cout << "||3.显示所有一元多项式\t\t||" << endl;
        cout << "||4.求两个多项式的和\t\t||" << endl;
        cout << "||5.求两个多项式的积\t\t||" << endl;
        cout << "||6.删除多项式\t\t\t||" << endl;
        cout << "||7.修改多项式\t\t\t||" << endl;
        cout << "||其他.退出\t\t\t||" << endl;
        cout << "==================================" << endl;
    }
    return 0;
}

//容错处理函数
int Judge() {
    int j;
    while (1) {
        if (!scanf_s("%d", &j)) {
            cout << "非法字符!请重新输入:";
            while (getchar() != '\n');
        }
        else if (getchar() != '\n') {
            cout << "非法字符!请重新输入:";
            while (getchar() != '\n');
        }
        else if (j < 0) cout << "非法字符!请重新输入:";
        else break;
    }
    return j;
}

//创建一元多项式链表
void Build(HLink& H) {//建立表示多项式的有序链表H
    HLink s, pre, q;
    H = new PNode;
    H->next = NULL;
    int n;
    cout << "请输入多项式项数:";
    n = Judge();//多项式项数
    for (int i = 1; i <= n; i++) {
        s = new PNode;
        cout << "请输入第" << i << "项系数:";
        s->coef = Judge();
        cout << "请输入第" << i << "项指数:";
        s->expn = Judge();
        //从头节点开始找,pre作为前驱
        pre = H;
        q = H->next;
        //结点后移,直到输入的指数大于当前结点,或者结点移至末尾
        while (q && q->expn < s->expn) {
            //if (q->coef == q->next->coef) {

            //}
            pre = q;
            q = q->next;
        }
        //将输入的结点插入
        s->next = q;
        pre->next = s;
    }
}

//实现输出一元多项式链表
void Exp(HLink H) {
    int flag = 0;//记录首位
    HLink p = H->next;
    if (p == NULL) {
        cout << "0";
    }
    while (p) {//遍历链表
        //指数为0时
        if (p->expn == 0) {
            if (flag == 0) {//首位不输出‘+’
                cout << p->coef;
                flag++;
            }
            else {//非首位输出‘+’或‘-’
                if (p->coef < 0) {
                    cout << p->coef;
                }
                else {
                    cout << '+' << p->coef;
                }
            }
        }
        //指数大于0
        else if (p->expn > 0) {
            if (flag == 0) {//首位不输出‘+’
                cout << p->coef << "x^" << p->expn;
                flag++;
            }
            else {//非首位输出‘+’或‘-’
                if (p->coef < 0) {
                    cout << p->coef << "x^" << p->expn;
                }
                else {
                    cout << '+' << p->coef << "x^" << p->expn;
                }
            }
        }
        //指数小于0
        else if (p->expn < 0) {
            if (flag == 0) {//首位不输出‘+’
                cout << p->coef << "x^(" << p->expn << ')';
                flag++;
            }
            else {//非首位输出‘+’或‘-’
                if (p->coef < 0) {
                    cout << p->coef << "x^(" << p->expn << ')';
                }
                else {
                    cout << '+' << p->coef << "x^(" << p->expn << ')';
                }
            }
        }
        p = p->next;
    }
    cout << endl;
}

void CopyLink(HLink& pc, HLink pa) {
    HLink p, q, r;
    pc = new PNode;
    pc->next = NULL;
    r = pc;
    p = pa;
    while (p->next != NULL) {
        q = new PNode;
        q->coef = p->next->coef;
        q->expn = p->next->expn;
        r->next = q;
        q->next = NULL;
        r = q;
        p = p->next;
    }
}

//实现一元多项式的加和
void Add(HLink& H, HLink A, HLink B) {
    HLink p1, p2, p3, p, C, D;
    CopyLink(C, A);
    CopyLink(D, B);
    p1 = A->next;
    p2 = B->next;
    H = new PNode;
    p3 = H;
    while (p1 && p2) {
        if (p1->expn < p2->expn) {
            p = p1;
            p1 = p1->next;
        }
        else if (p2->expn < p1->expn) {
            p = p2;
            p2 = p2->next;
        }
        else {
            p1->coef += p2->coef;
            if (p1->coef == 0) {
                p = p1;
                p1 = p1->next;
                p = p2;
                p2 = p2->next;
                continue;
            }
            p = p2;
            p2 = p2->next;
            p = p1;
            p1 = p1->next;
        }
        p3->next = p;
        p3 = p;
    }
    if (p1) p3->next = p1;
    else if (p2) p3->next = p2;
    else p3->next = NULL;
    A->next = C->next;
    B->next = D->next;
}

//实现一元多项式的乘积
void Mul(HLink& H, HLink A, HLink B) {
    HLink ht, q, p, pt;
    H = new PNode;
    H->next = NULL;
    ht = new PNode;
    ht->next = NULL;
    q = B->next;
    while (q) {
        pt = ht;
        p = A->next;
        while (p) {
            pt->next = new PNode;
            pt = pt->next;
            pt->coef = p->coef * q->coef;
            pt->expn = p->expn + q->expn;
            p = p->next;
        }
        pt->next = NULL;
        q = q->next;
        Add(p, H, ht);
        H = p;
    }
}

//删除多项式
void Del(HLink& H) {
    HLink p, temp;
    p = H->next;
    while (p) {
        temp = p;
        p = p->next;
        delete temp;
    }
    H->next = NULL;
}

//修改多项式
void Mod(HLink& H) {
    HLink temp = H->next;
    int cnt, judge, n = 1, sum = 0;
    while (temp) {//计算多项式项数
        sum++;
        temp = temp->next;
    }
    if (sum == 0) {
        cout << "该多项式已不存在。" << endl;
        return;
    }
    while ( n == 1 ) {//对多项式进行修改
        temp = H->next;
        cout << "请输入想要修改第几项:";
        cnt = Judge();
        while (cnt > sum) {
            cout << "无此项,该多项式项数为" << sum << "请重新输入:";
            cnt = Judge();
        }
        for (int k = 2; k <= cnt; k++) {
            temp = temp->next;
        }
        cout << "请选择指令:1.修改指数,2.修改系数" << endl;
        judge = Judge();
        while (judge != 1 && judge != 2) {
            cout << "无此指令,请重新输入:1.修改指数,2.修改系数" << endl;
            judge = Judge();
        }
        if (judge == 1) {
            cout << "将指数改为:";
            temp->coef = Judge();
        }
        if (judge == 2) {
            cout << "将系数改为:";
            temp->expn = Judge();
        }
        cout << "第" << cnt << "项修改完成!" << endl;
        cout << "请选择指令:1.继续修改,2.退出修改" << endl;
        n = Judge();
        while (n != 1 && n != 2) {
            cout << "无此指令,请重新输入:1.继续修改,2.退出修改" << endl;
            n = Judge();
        }
    }
    cout << "修改成功!" << endl;
}

  • 6
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

故梦余生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值