C++ 为什么是C++;链表程序终止?

C++ 为什么是C++;链表程序终止?,c++,linked-list,C++,Linked List,总结报告 感谢所有有用的反馈cin.clear()非常有用;关于将next设置为NULL的评论也是如此。但是最后一个问题(正如在评论中诊断的那样)是我使用了Ctrl+D来逃避,而cin>>k没有正确处理这个问题。当我将k>0添加到while条件中(请参见更新的代码)并用负数转义时,它就开始工作了 我讨厌发布大量的代码,但我认为我不能再进一步删减它了。关键是我的程序在第一次循环中有效,但在第二次循环中无效。(跳到main了解我的意思。) 您看到它在打印列表2之前是如何终止的吗?(前四行来自std

总结报告

感谢所有有用的反馈
cin.clear()
非常有用;关于将
next
设置为NULL的评论也是如此。但是最后一个问题(正如在评论中诊断的那样)是我使用了
Ctrl+D
来逃避,而
cin>>k
没有正确处理这个问题。当我将
k>0
添加到while条件中(请参见更新的代码)并用负数转义时,它就开始工作了


我讨厌发布大量的代码,但我认为我不能再进一步删减它了。关键是我的程序在第一次循环中有效,但在第二次循环中无效。(跳到
main
了解我的意思。)

您看到它在打印
列表2
之前是如何终止的吗?(前四行来自stdin。请参阅
main
)这里出了什么问题?我不明白为什么同样的逻辑第一次有效,第二次却不行


可能是因为我没有为第一个链表释放内存?

此代码存在多个问题

  • 您忘记在最后一个元素上将
    next
    设置为
    NULL
    。这将导致任何非空列表崩溃

  • 在再次读取之前,需要
    std::cin.clear()
    。EOF标志为“粘性”

  • print\u list()
    函数不处理空列表。这将导致任何空列表崩溃

  • 这些问题中的任何一个都会导致您的程序终止或崩溃,因此您必须修复所有这些问题。请注意,一个错误如何使空列表的程序崩溃,而另一个错误如何导致非空列表的程序崩溃——在这两个错误之间,所有列表的程序都会崩溃。好吧,如果你幸运的话,至少。如果你运气不好,它可能不会崩溃

    下面是一个可以自动捕获错误的工具列表#1和#3:

    • GDB(运行
      GDB./a.out
      而不是
      /a.out
      ,记住使用
      -g
      编译)
    • 挡泥板(使用
      -fmudflap-lmudflap
      编译)
    • Valgrind(运行
      Valgrind./a.out
      而不是
      /a.out
    • 铿锵静态分析仪

    因此,您应该至少使用这四种工具中的一种。我喜欢在同一个项目中使用这四种代码。

    此代码存在多个问题

    head = NULL;
    while (cin >> k) {
       if (head == NULL) {
          head = tail = new ListNode;
       } else {
    
  • 您忘记在最后一个元素上将
    next
    设置为
    NULL
    。这将导致任何非空列表崩溃

  • 在再次读取之前,需要
    std::cin.clear()
    。EOF标志为“粘性”

  • print\u list()
    函数不处理空列表。这将导致任何空列表崩溃

  • 这些问题中的任何一个都会导致您的程序终止或崩溃,因此您必须修复所有这些问题。请注意,一个错误如何使空列表的程序崩溃,而另一个错误如何导致非空列表的程序崩溃——在这两个错误之间,所有列表的程序都会崩溃。好吧,如果你幸运的话,至少。如果你运气不好,它可能不会崩溃

    下面是一个可以自动捕获错误的工具列表#1和#3:

    • GDB(运行
      GDB./a.out
      而不是
      /a.out
      ,记住使用
      -g
      编译)
    • 挡泥板(使用
      -fmudflap-lmudflap
      编译)
    • Valgrind(运行
      Valgrind./a.out
      而不是
      /a.out
    • 铿锵静态分析仪
    因此,您应该至少使用这四种工具中的一种。我喜欢在同一个项目中使用所有四个

    head = NULL;
    while (cin >> k) {
       if (head == NULL) {
          head = tail = new ListNode;
       } else {
    
    我希望你能看到问题所在。首先将head设置为null,然后检查它是否为null

    试着这样做:

    ListNode* readList(ListNode* head)
    {
        int data;
        cin >> data;
    
        ListNode* nNode = new ListNode;
        nNode->data = data;
        nNode->next = 0;
    
        if (head == null)
        {
            head = nNode;
        }
        else
        {
            ListNode* tail = head;
            while (tail->next != 0)
            {
                tail = tail->next;
            }
            tail->next = nNode;
        }
    
        return head;
    }
    
    或者类似的事情。自从我上次创建linkedlist已经有一段时间了

    我希望你能看到问题所在。首先将head设置为null,然后检查它是否为null

    试着这样做:

    ListNode* readList(ListNode* head)
    {
        int data;
        cin >> data;
    
        ListNode* nNode = new ListNode;
        nNode->data = data;
        nNode->next = 0;
    
        if (head == null)
        {
            head = nNode;
        }
        else
        {
            ListNode* tail = head;
            while (tail->next != 0)
            {
                tail = tail->next;
            }
            tail->next = nNode;
        }
    
        return head;
    }
    

    或者类似的事情。距离我上次创建linkedlist已经有一段时间了。

    您应该在第一次读取列表()之后调用cin.clear()

    以下代码运行良好:

    #include <iostream>                                                                                                                    
    using namespace std;
    
    struct ListNode {
      int data;
      ListNode* next;
    };
    
    void print_list(ListNode* node) {
      cout << node->data << endl;
      while ((node = node->next) != NULL) {
        cout << node->data << endl;
      }
    }
    
    ListNode* read_list() {
      ListNode *head, *tail;
      int k;
    
      head = NULL;
      while (cin >> k) {
           if (head == NULL) {
              head = tail = new ListNode;
           } else {
              tail->next = new ListNode;
              tail = tail->next;
           }
           tail->data = k;
           tail->next = NULL;
      }
      return head;
    }
    
    int main() {
      ListNode *list1, *list2;
    
      list1 = read_list();
      print_list(list1);
      cin.clear(); // ADD this line 
    
      list2 = read_list();
      print_list(list2);
    
      return 0;
    }
    

    您应该在第一次读取列表()之后调用cin.clear()

    以下代码运行良好:

    #include <iostream>                                                                                                                    
    using namespace std;
    
    struct ListNode {
      int data;
      ListNode* next;
    };
    
    void print_list(ListNode* node) {
      cout << node->data << endl;
      while ((node = node->next) != NULL) {
        cout << node->data << endl;
      }
    }
    
    ListNode* read_list() {
      ListNode *head, *tail;
      int k;
    
      head = NULL;
      while (cin >> k) {
           if (head == NULL) {
              head = tail = new ListNode;
           } else {
              tail->next = new ListNode;
              tail = tail->next;
           }
           tail->data = k;
           tail->next = NULL;
      }
      return head;
    }
    
    int main() {
      ListNode *list1, *list2;
    
      list1 = read_list();
      print_list(list1);
      cin.clear(); // ADD this line 
    
      list2 = read_list();
      print_list(list2);
    
      return 0;
    }
    

    修改打印列表的方式:

    void print_list(ListNode* node)
    {
        while (node)
        {
            cout << node->data << endl;
            node = node->next;
        }
    }
    

    程序崩溃将得到解决。

    修改打印列表的方式:

    void print_list(ListNode* node)
    {
        while (node)
        {
            cout << node->data << endl;
            node = node->next;
        }
    }
    

    程序崩溃将得到解决。

    我猜这是因为您没有处理来自cin的非整数数据,所以第二个列表永远不会填充。我按Ctrl+D中断对stdin的读取。这就是问题所在吗?我想是的,但我现在脑子里是Java,所以cin的细节不在我脑子里。Dietrich也是对的“下一步”没有设置,这会给你带来问题。因为你从来没有给List2提供任何输入,所以这个列表是空的。调用printList时,node为null,因此node->data将导致分段错误。结果表明,这个适度的注释就是答案。我猜这是因为您不处理来自cin的非int数据,所以第二个列表永远不会填充。我按Ctrl+D中断对stdin的读取。这就是问题所在吗?我想是的,但我现在脑子里是Java,所以cin的细节不在我脑子里。Dietrich也是对的“下一步”没有设置,这会给你带来问题。因为你从来没有给List2提供任何输入,所以这个列表是空的。当你调用printList时,node是空的,所以node->data会导致一个分段错误。事实证明,这个适度的注释就是答案。我想知道这一点。我试过了,但没有解决问题。但似乎我无论如何都应该这么做。@ktm5124:在事情成功之前不要乱动,这是修复坏程序的一种鲁莽的方式。
    next
    字段未初始化,在您修复该字段之前,您的程序将被破坏。不,我理解。但我只是设置为空,我仍然得到