c++ 用链表写一个多项式相加的源代码带注释
时间: 2023-08-04 14:16:32 浏览: 110
好的,下面是用 C++ 链表实现多项式相加的源代码,带有详细的注释:
```c++
#include <iostream>
using namespace std;
// 定义一个链表节点
struct Node {
int coef; // 系数
int exp; // 指数
Node *next; // 指向下一个节点的指针
Node(int c, int e) : coef(c), exp(e), next(NULL) {} // 构造函数
};
// 定义多项式类
class Polynomial {
private:
Node *head; // 多项式链表的头节点
public:
Polynomial() : head(NULL) {} // 构造函数,初始化头节点为 NULL
~Polynomial() { // 析构函数,释放链表内存
Node *p = head;
while (p) {
Node *q = p;
p = p->next;
delete q;
}
}
void addTerm(int c, int e) { // 向多项式中添加一项
if (c == 0) return; // 如果系数为 0,不添加
Node *p = head, *q = NULL;
while (p && p->exp > e) { // 找到合适的插入位置
q = p;
p = p->next;
}
if (p && p->exp == e) { // 如果已经有相同指数的项,系数相加
p->coef += c;
if (p->coef == 0) { // 如果系数为 0,删除该节点
if (q) q->next = p->next;
else head = p->next;
delete p;
}
} else { // 否则插入新节点
Node *newNode = new Node(c, e);
if (q) q->next = newNode;
else head = newNode;
newNode->next = p;
}
}
Polynomial operator+(const Polynomial &other) const { // 重载加法运算符
Polynomial res;
Node *p1 = head, *p2 = other.head;
while (p1 != NULL && p2 != NULL) { // 遍历两个多项式链表
if (p1->exp > p2->exp) { // 如果第一个链表的指数大,将第一个链表的节点加入结果链表
res.addTerm(p1->coef, p1->exp);
p1 = p1->next;
} else if (p1->exp < p2->exp) { // 如果第二个链表的指数大,将第二个链表的节点加入结果链表
res.addTerm(p2->coef, p2->exp);
p2 = p2->next;
} else { // 如果两个链表的指数相同,将它们的系数相加
int sum = p1->coef + p2->coef;
res.addTerm(sum, p1->exp);
p1 = p1->next;
p2 = p2->next;
}
}
// 将剩余的节点加入结果链表
while (p1 != NULL) {
res.addTerm(p1->coef, p1->exp);
p1 = p1->next;
}
while (p2 != NULL) {
res.addTerm(p2->coef, p2->exp);
p2 = p2->next;
}
return res;
}
void print() const { // 输出多项式
Node *p = head;
if (p == NULL) { // 如果链表为空,输出 0
cout << "0" << endl;
return;
}
while (p) {
if (p->coef > 0 && p != head) cout << "+"; // 系数为正,输出 "+"
cout << p->coef;
if (p->exp > 0) cout << "x^" << p->exp; // 指数大于 0,输出 "x^exp"
p = p->next;
}
cout << endl;
}
};
int main() {
Polynomial p1, p2, p3;
p1.addTerm(2, 3);
p1.addTerm(1, 2);
p1.addTerm(3, 1);
p1.addTerm(4, 0);
p2.addTerm(1, 4);
p2.addTerm(2, 3);
p2.addTerm(-3, 2);
p2.addTerm(2, 1);
p2.addTerm(1, 0);
p3 = p1 + p2;
p1.print();
p2.print();
p3.print();
return 0;
}
```
以上代码实现了多项式相加的功能,其中 Node 结构体表示链表节点,Polynomial 类表示多项式,addTerm 方法用于向多项式中添加一项,operator+ 方法重载了加法运算符,print 方法用于输出多项式。在 main 函数中,我们定义了两个多项式 p1 和 p2,并将它们相加得到 p3,最后输出三个多项式的结果。
阅读全文