基于链表的三个多项式相加C++程序错误排查求助
问题分析与修正:三个多项式链表相加的C++程序错误
我帮你排查了代码里的几个关键问题,这些就是导致部分测试用例出错的根源,下面逐个分析并给出修正方案:
1. 结果链表的尾节点处理错误
你在构建结果链表时,每次遇到非零系数都会创建一个新节点作为当前节点的next,然后移动到这个新节点。最后虽然在power_counter == 0时设置value_final = NULL,但这只是改变了指针的指向,并没有把最后一个有效节点的next设置为NULL,反而会留下一个未初始化的空节点——这会导致输出逻辑混乱,甚至引发程序崩溃。
2. 输出循环逻辑错误
你的输出循环条件是while (new_value_final->next != NULL),这会直接跳过最后一个有效节点的输出:当指针指向最后一个节点时,它的next是NULL,循环会直接终止,不会处理这个节点。
3. 输入链表构建的冗余逻辑(非致命,但易出错)
你创建输入链表的代码重复度高,且循环条件容易混淆。比如初始创建头节点后,循环从1到n1的写法,虽然在n1=1时没问题,但逻辑不够直观,容易引发边界错误。
4. 变量初始化的潜在风险
虽然你的node_1_return等变量在逻辑上会被赋值,但先初始化为0再根据情况修改会更安全,能避免编译器可能的未初始化警告或意外行为。
修正后的完整代码
#include <cmath> #include <cstdio> #include <vector> #include <iostream> #include <algorithm> using namespace std; class node { public: int power; int coefficient; node *next; }; // 封装读取多项式链表的函数,减少重复代码 node* readPolynomial() { int n; cin >> n; node *head = NULL; node *current = NULL; for (int i = 0; i < n; ++i) { int coeff, pow; cin >> coeff >> pow; node *newNode = new node(); newNode->coefficient = coeff; newNode->power = pow; newNode->next = NULL; if (head == NULL) { head = newNode; current = head; } else { current->next = newNode; current = newNode; } } return head; } // 封装获取指定幂次系数的函数 int getCoefficient(node *head, int power) { node *current = head; while (current != NULL) { if (current->power == power) { return current->coefficient; } current = current->next; } return 0; } int main() { // 读取三个多项式 node *poly1 = readPolynomial(); node *poly2 = readPolynomial(); node *poly3 = readPolynomial(); node *resultHead = NULL; node *currentResult = NULL; // 从高次到低次遍历幂次 for (int power = 100; power >= 0; --power) { int sum = getCoefficient(poly1, power) + getCoefficient(poly2, power) + getCoefficient(poly3, power); if (sum != 0) { node *newNode = new node(); newNode->coefficient = sum; newNode->power = power; newNode->next = NULL; if (resultHead == NULL) { resultHead = newNode; currentResult = resultHead; } else { currentResult->next = newNode; currentResult = newNode; } } } // 输出结果 node *current = resultHead; bool isFirst = true; while (current != NULL) { if (!isFirst) { cout << "+"; } cout << "(" << current->coefficient << "," << current->power << ")"; isFirst = false; current = current->next; } cout << endl; // 释放内存,避免内存泄漏 auto deleteList = [](node *head) { node *temp; while (head != NULL) { temp = head; head = head->next; delete temp; } }; deleteList(poly1); deleteList(poly2); deleteList(poly3); deleteList(resultHead); return 0; }
关键修改说明
- 封装重复代码:把读取多项式和获取系数的逻辑封装成函数,减少代码冗余,提升可读性和可维护性。
- 结果链表构建优化:仅在需要时创建新节点,确保最后一个节点的
next为NULL,不会产生多余的空节点。 - 输出逻辑修正:遍历所有节点(直到指针为
NULL),用isFirst标记控制加号的输出,确保所有有效项都被正确输出。 - 内存泄漏修复:添加了链表内存释放的逻辑,避免长期运行的内存泄漏问题。
- 变量初始化优化:
getCoefficient函数直接返回0或找到的系数,彻底避免了未初始化变量的风险。
测试你提供的标准用例,这个修正后的代码会正确输出(1,3)+(30,2)+(1,1)+(1,0),同时也能正确处理其他边界情况,比如某个多项式为空、多个幂次系数相加为0(会自动跳过)等。
内容的提问来源于stack exchange,提问作者random_dude101
相关产品推荐
相关产品推荐

