在链表中添加两个数字

时间:2017-07-06 18:18:08

标签: c++ linked-list

我正在尝试从两个链接列表中添加数字并将其放在第三个链接列表中。它添加得很好但我的代码阻止编译器在运行此代码时停止响应可能是因为无限循环或一些异常。

以下代码在链接列表中添加以相反顺序存储的两个数字。

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;
} 

谁能告诉我我做错了什么?

我应该在以下答案输入后对代码进行更改:

  1. 我应该将整数初始化从NULL更改为0.
  2. 应该使用LinkedList对象来终止我的循环。
  3. 应该改变我从指针访问函数的方式
  4. 谢谢大家。

2 个答案:

答案 0 :(得分:2)

  

谁能告诉我我做错了什么?

  1. 恕我直言,你可能做出了错误的选择。 STL为(双重链接)listforward list(单独链接)提供数据结构。也许你想要使用它们。您可以期望它们足够高效,无错误且非常重要,以了解您是否想成为一名熟练的C ++程序员。
  2. 让某人进行代码审查是有意义的(有代码审查StackExchange网站);例如在链表中命名整数变量x可能不是一个好习惯。
  3. 您没有告诉我们您的计划有什么问题。这在SO中是预期的。您的问题符合“偏离主题(为什么此代码不起作用?)”。你提供的程序很好。但是您没有提供预期的输入和输出。你的计划有望做什么?如果我将您的main功能视为测试,那么您期望得到什么结果?
  4. 见下面的一些错误/警告
  5. 在函数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在函数之前被删除,但它并不重要,因为对象的生命周期不再与函数绑定。