我试图从两个链接列表中添加数字,并将其放入第三个。它增加了很好,但我的代码块编译器停止响应,而运行此代码可能是因为无限循环或一些例外。在链接列表中添加两个数字
以下代码在链接列表中添加两个以相反顺序存储的数字。
struct Node{
int x;
Node* next;
};
class LinkedList{
public:
Node* head;
LinkedList(){
head = NULL;
}
void addNode(int num){
Node* n = new Node();
n->x = num;
n->next = NULL;
if(head == NULL){
head = n;
}else{
Node* n1 = head;
while(n1 != NULL){
if(n1->next == NULL){
n1->next = n;
break;
}
n1 = n1->next;
}
}
}
int popNode(){
int num = NULL;
if (head != NULL){
num = head->x;
head = head->next;
}else{
cout << "Yay" << "\n";
num = NULL;
}
return num;
}
void printList(){
Node* n1 = head;
while(n1 != NULL){
if(n1->next == NULL){
cout << n1->x << "\n";
}else{
cout << n1->x << "->";
}
n1 = n1->next;
}
}
};
LinkedList* add_nums(LinkedList* l1, LinkedList* l2) {
LinkedList l3;
int num1= (*l1).popNode();
int num2= (*l2).popNode();
int carry = 0;
while(num1 != NULL || num2 != NULL){
int num3 = num1+num2+carry;
if (num3 > 9){
int temp = num3 % 10;
carry = (num3 - temp)/10;
num3 = temp;
}
l3.addNode(num3);
l3.printList();
num1 = (*l1).popNode();
num2 = (*l2).popNode();
}
return &l3;
}
int main(int argc, char const *argv[]) {
LinkedList list1;
LinkedList list2;
list1.addNode(2);
list1.addNode(4);
list1.addNode(3);
list2.addNode(5);
list2.addNode(6);
list2.addNode(4);
(*(add_nums(&list1, &list2))).printList();
return 0;
}
谁能告诉我我做错了什么?
更改密码输入后,我应该做的,从下面的答案:
- 我应该从空改变整数初始化为0。
- 应该使用LinkedList的对象来终止我的循环。
- 发生变更,我如何从一个指针
谢谢大家访问功能。
这听起来像你可能需要学习如何使用调试器来遍历代码。使用一个好的调试器,您可以逐行执行您的程序,并查看它与您期望的偏离的位置。如果你打算做任何编程,这是一个重要的工具。进一步阅读:[如何调试小程序](http://ericlippert.com/2014/03/05/how-to-debug-small-programs/) – NathanOliver
同意。通过这种方式,您将能够回答为什么它在运行此代码时停止响应,可能是因为无限循环或某种异常***而不是猜测。 – drescherjm
'return &l3;':您返回对局部变量的引用:UB。 – Jarod42