多项式的链表表示及运算
时间: 2023-07-11 08:12:06 浏览: 48
多项式可以用链表来表示,每个节点表示多项式的一项,包含三个属性:系数、指数、指向下一个节点的指针。链表的头节点表示多项式的开头。
多项式的加法可以通过遍历两个多项式的链表,将指数相同的项的系数相加,新建一个节点保存结果,最后将剩余项直接拼接到结果链表的尾部。
多项式的乘法也可以通过遍历两个多项式的链表,将每一项相乘,得到新的一项,将所有新的一项相加即为结果。具体来说,我们可以对第一个多项式的每一项,在第二个多项式上遍历,将指数相加得到新的指数,将系数相乘得到新的系数,将新的一项插入到结果链表中。
需要注意的是,对于乘法,要在插入新项之前检查结果链表中是否已经有相同指数的项,如果有,则将系数相加,否则直接插入新项。
以下是一个简单的多项式链表的定义和加法、乘法操作的实现代码(C++):
```c++
struct PolyNode {
int coef; // 系数
int exp; // 指数
PolyNode* next; // 下一项节点指针
};
PolyNode* addPoly(PolyNode* p1, PolyNode* p2) {
PolyNode* head = new PolyNode(); // 结果链表头节点
PolyNode* tail = head; // 结果链表尾指针
while (p1 && p2) {
if (p1->exp == p2->exp) { // 指数相同,系数相加
int coef = p1->coef + p2->coef;
if (coef != 0) { // 系数不为0才添加新项
PolyNode* node = new PolyNode();
node->coef = coef;
node->exp = p1->exp;
tail->next = node;
tail = node;
}
p1 = p1->next;
p2 = p2->next;
} else if (p1->exp > p2->exp) { // p1的指数大,将p1的项添加到结果中
PolyNode* node = new PolyNode();
node->coef = p1->coef;
node->exp = p1->exp;
tail->next = node;
tail = node;
p1 = p1->next;
} else { // p2的指数大,将p2的项添加到结果中
PolyNode* node = new PolyNode();
node->coef = p2->coef;
node->exp = p2->exp;
tail->next = node;
tail = node;
p2 = p2->next;
}
}
// 将剩余的项添加到结果中
while (p1) {
PolyNode* node = new PolyNode();
node->coef = p1->coef;
node->exp = p1->exp;
tail->next = node;
tail = node;
p1 = p1->next;
}
while (p2) {
PolyNode* node = new PolyNode();
node->coef = p2->coef;
node->exp = p2->exp;
tail->next = node;
tail = node;
p2 = p2->next;
}
// 删除头节点
PolyNode* temp = head;
head = head->next;
delete temp;
return head;
}
PolyNode* multiplyPoly(PolyNode* p1, PolyNode* p2) {
PolyNode* head = new PolyNode(); // 结果链表头节点
PolyNode* tail = head; // 结果链表尾指针
while (p1) {
PolyNode* p = p2;
while (p) {
int coef = p1->coef * p->coef;
int exp = p1->exp + p->exp;
// 在结果链表中查找是否有指数相同的项
PolyNode* node = head;
while (node && node->exp != exp) {
node = node->next;
}
if (node) { // 已有相同指数的项,将系数相加
node->coef += coef;
if (node->coef == 0) { // 系数为0,删除该项
PolyNode* temp = node;
node = node->next;
delete temp;
}
} else { // 没有相同指数的项,直接添加新项到结果链表
node = new PolyNode();
node->coef = coef;
node->exp = exp;
tail->next = node;
tail = node;
}
p = p->next;
}
p1 = p1->next;
}
// 删除头节点
PolyNode* temp = head;
head = head->next;
delete temp;
return head;
}
```