链表求和结果首元素始终为0的问题排查求助
问题描述
通过用户输入创建两个链表,将两链表对应元素相加后存入第三个链表。但打印第三个链表时,首元素总是0,后续才是正确的求和值。调试AddTwoLists()函数未找到0的来源,暂未处理两链表长度不同的情况,优先解决该问题。
原代码
#include <iostream> struct Node { int n; // 非零元素数量 int index; int value; Node* link; }; struct Data { int n; int index; int value; }; Node* A; Node* B; void AddEndNode(Node*& head, int index, int value){ Node* current = head; Node* temp = new Node; temp->index = index; temp->value = value; temp->link = NULL; if(current == NULL) head = temp; else{ while(current->link != NULL) current = current->link; current->link = temp; } } void PrintList(Node* head){ Node* current = head; while(current != NULL){ std::cout<< current->value<< " "; current = current->link; } std::cout<< "\n"; } void AddTwoLists(Node* A, Node* B){ Node* currentA = A; Node* currentB = B; Node* C = new Node; C->n = A->n; C->link = NULL; int sum = 0; int index = 1; while(currentA != NULL){ sum = 0; C->index = index; sum += currentA->value; std::cout<< "\n1st sum is "<< sum; sum += currentB->value; std::cout<< "\n2nd sum is "<< sum; AddEndNode(C, index, sum); std::cout<< "\nlist C is "; PrintList(C); currentA = currentA->link; currentB = currentB->link; index++; } PrintList(C); } int main() { Data dataA, dataB; dataA.index = 1; dataB.index = 1; A = NULL; B = NULL; std::cout<< "请输入要添加到链表A的非零整数数量:\n"; std::cin>> dataA.n; for(int i =0; i < dataA.n; i++){ std::cout<< "请输入一个非零整数:"; std::cin>> dataA.value; AddEndNode(A, dataA.index, dataA.value); dataA.index++; } PrintList(A); std::cout<< "\n请输入要添加到链表B的非零整数数量:\n"; std::cin>> dataB.n; for(int i =0; i < dataB.n; i++){ std::cout<< "请输入一个非零整数:"; std::cin>> dataB.value; AddEndNode(B, dataB.index, dataB.value); dataB.index++; } PrintList(B); std::cout<< "\n链表A和链表B的求和结果:\n"; AddTwoLists(A, B); return 0; }
问题原因
AddTwoLists函数开头直接用new Node初始化链表C的头节点,这个新节点的value未被赋值,默认是0。后续调用AddEndNode都是往这个节点后面追加元素,导致链表C的首元素就是这个未初始化的0。
解决方法
将链表C初始化为NULL,利用AddEndNode函数的逻辑自动创建第一个节点,避免额外的空节点。同时调整C->n的赋值时机,确保链表有元素时再赋值。
修改后的AddTwoLists函数:
void AddTwoLists(Node* A, Node* B){ Node* currentA = A; Node* currentB = B; Node* C = NULL; // 初始化为NULL,而非直接new Node int sum = 0; int index = 1; while(currentA != NULL){ sum = 0; sum += currentA->value; sum += currentB->value; AddEndNode(C, index, sum); currentA = currentA->link; currentB = currentB->link; index++; } // 确保链表C和A不为空时,再赋值n if(C != NULL && A != NULL){ C->n = A->n; } PrintList(C); }
说明
修改后,链表C的第一个节点会由AddEndNode在第一次循环时创建,直接存入正确的求和值,不会再出现首元素为0的情况。
内容的提问来源于stack exchange,提问作者user21279196
相关产品推荐
相关产品推荐

