C/C++ 链表实现一元多项式加法和乘法运算

本教程将详细讲解如何使用 C/C++ 语言中的链表数据结构来实现两个一元多项式的加法和乘法运算。

一、实验目的

  1. 掌握链表的应用和算法设计
  2. 掌握利用 C/C++ 编程语言实现数据结构的编程方法

二、实验内容与要求

利用单链表表示两个一元多项式,并完成两多项式的加法和乘法运算。

输入格式:

按指数的升序输入第一个一元多项式'polya'各项的指数和系数,且以输入 0 0 结束,按指数的升序输入第二个一元多项式'polyb'各项的指数和系数。

输出格式:

输出两一元多项式相加和相乘的一元多项式,并进行算法时间复杂度的分析。

示例:

(2 + 3x - 3x^4) + (4x^2 + 6x^6) = (2 + 3x + 4x^2 - 3x^4 + 6x^6)

(2 + 3x - 3x^4) * (4x^2 + 6x^6) = (8x^2 + 12x^3 + 18x^7 - 18x^10)

测试用例:

输入 0 2 1 3 4 -3 0 0 0 2 1 3 2 -3 0 0

2 4 6 6 0 0 1 1 2 4 0 0

加法输出:

0 2 1 3 2 4 4 -3 6 6 0 2 1 4 2 1

乘法输出:

2 8 3 12 7 18 10 -18 1 2 2 11 3 9 4 -1

三、代码实现

根据实验要求,你需要使用单链表来表示两个一元多项式,并实现它们的加法和乘法运算。

1. 定义链表节点

首先,你需要定义一个结构体来表示多项式的每一项,包括指数和系数。然后,你可以使用链表节点来构建一个单链表,每个节点存储一项的数据,并连接到下一个节点。

// 定义链表节点
struct ListNode {
    int exp;  // 指数
    int coe;  // 系数
    ListNode* next;  // 下一个节点指针
};

2. 构建一元多项式的链表

// 构建一元多项式的链表
ListNode* buildPoly() {
    ListNode* head = nullptr;
    ListNode* tail = nullptr;

    int exp, coe;
    cout << "请输入一元多项式的指数和系数,以0 0结束:" << endl;
    while (cin >> exp >> coe && !(exp == 0 && coe == 0)) {
        ListNode* newNode = new ListNode;
        newNode->exp = exp;
        newNode->coe = coe;
        newNode->next = nullptr;

        if (head == nullptr) {
            head = newNode;
            tail = newNode;
        } else {
            tail->next = newNode;
            tail = newNode;
        }
    }

    return head;
}

3. 实现多项式加法运算

// 多项式相加操作
ListNode* addPoly(ListNode* polya, ListNode* polyb) {
    ListNode* res = nullptr;
    ListNode* tail = nullptr;

    while (polya != nullptr && polyb != nullptr) {
        if (polya->exp < polyb->exp) {
            ListNode* newNode = new ListNode;
            newNode->exp = polya->exp;
            newNode->coe = polya->coe;
            newNode->next = nullptr;

            if (res == nullptr) {
                res = newNode;
                tail = newNode;
            } else {
                tail->next = newNode;
                tail = newNode;
            }

            polya = polya->next;
        } else if (polya->exp > polyb->exp) {
            ListNode* newNode = new ListNode;
            newNode->exp = polyb->exp;
            newNode->coe = polyb->coe;
            newNode->next = nullptr;

            if (res == nullptr) {
                res = newNode;
                tail = newNode;
            } else {
                tail->next = newNode;
                tail = newNode;
            }

            polyb = polyb->next;
        } else {
            ListNode* newNode = new ListNode;
            newNode->exp = polya->exp;
            newNode->coe = polya->coe + polyb->coe;
            newNode->next = nullptr;

            if (res == nullptr) {
                res = newNode;
                tail = newNode;
            } else {
                tail->next = newNode;
                tail = newNode;
            }

            polya = polya->next;
            polyb = polyb->next;
        }
    }

    // 将剩余的项加入结果链表
    while (polya != nullptr) {
        ListNode* newNode = new ListNode;
        newNode->exp = polya->exp;
        newNode->coe = polya->coe;
        newNode->next = nullptr;

        if (res == nullptr) {
            res = newNode;
            tail = newNode;
        } else {
            tail->next = newNode;
            tail = newNode;
        }

        polya = polya->next;
    }

    while (polyb != nullptr) {
        ListNode* newNode = new ListNode;
        newNode->exp = polyb->exp;
        newNode->coe = polyb->coe;
        newNode->next = nullptr;

        if (res == nullptr) {
            res = newNode;
            tail = newNode;
        } else {
            tail->next = newNode;
            tail = newNode;
        }

        polyb = polyb->next;
    }

    return res;
}

4. 实现多项式乘法运算

// 多项式相乘操作
ListNode* multiplyPoly(ListNode* polya, ListNode* polyb) {
    ListNode* res = nullptr;

    while (polya != nullptr) {
        ListNode* temp = polyb;
        ListNode* tempRes = nullptr;
        ListNode* tail = nullptr;

        while (temp != nullptr) {
            ListNode* newNode = new ListNode;
            newNode->exp = polya->exp + temp->exp;
            newNode->coe = polya->coe * temp->coe;
            newNode->next = nullptr;

            if (tempRes == nullptr) {
                tempRes = newNode;
                tail = newNode;
            } else {
                tail->next = newNode;
                tail = newNode;
            }

            temp = temp->next;
        }

        res = addPoly(res, tempRes);

        polya = polya->next;
    }

    return res;
}

5. 编写主函数测试代码

int main() {
    ListNode* polya = buildPoly();
    ListNode* polyb = buildPoly();

    ListNode* addRes = addPoly(polya, polyb);
    ListNode* multiplyRes = multiplyPoly(polya, polyb);

    cout << "两个多项式相加的结果为:" << endl;
    while (addRes != nullptr) {
        cout << addRes->exp << " " << addRes->coe << " ";
        addRes = addRes->next;
    }
    cout << endl;

    cout << "两个多项式相乘的结果为:" << endl;
    while (multiplyRes != nullptr) {
        cout << multiplyRes->exp << " " << multiplyRes->coe << " ";
        multiplyRes = multiplyRes->next;
    }
    cout << endl;

    return 0;
}

四、总结

本教程详细讲解了如何使用 C/C++ 语言中的链表数据结构来实现两个一元多项式的加法和乘法运算,并附带示例代码和测试用例。你可以根据需要进行修改和优化。

希望本教程对你有帮助!如果还有其他问题,请随时提问。

C/C++ 链表实现一元多项式加法和乘法运算 - 数据结构实验教程

原文地址: https://www.cveoy.top/t/topic/UkZ 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录