我正在尝试从两个链接列表中添加数字并将其放在第三个链接列表中。它添加得很好但我的代码阻止编译器在运行此代码时停止响应可能是因为无限循环或一些异常。
以下代码在链接列表中添加以相反顺序存储的两个数字。
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 :(得分:2)
谁能告诉我我做错了什么?
x
可能不是一个好习惯。main
功能视为测试,那么您期望得到什么结果? 在函数popNode
int num = NULL; // should be 0, it's an integer
...
num = NULL; // same reason
在函数add_nums
LinkedList l3; // it's a local variable (see return below)
...
while(num1 != NULL || num2 != NULL) // again num1 and num2 are integers
....
return &l3; // address of a local variable :-(
我认为最好将变量l3
声明为指向LinkedList
的指针:
LinkedList *l3 = new LinkedList;
... // adapt the code to use l3 appropriately
return l3;
答案 1 :(得分:2)
正如评论中的其他人所说,您的错误就是这个错误:return &l3;
l3
是一个本地对象,在函数结束之前被删除,就像任何非dinamically分配的对象一样。这是因为您的LinkedList对象的范围。
你应该写:
LinkedList* l3 = new LinkedList();
//...
//...
return l3;
此函数现在返回指向对象的指针。
注意:包含指针的变量l3
在函数之前被删除,但它并不重要,因为对象的生命周期不再与函数绑定。