【问题标题】:Infinite looping when inserting an item into a linked list将项目插入链表时无限循环
【发布时间】:2020-05-08 13:38:38
【问题描述】:

试图向链表中插入一个值,但在第二次通过时进入了无限循环。为这个问题挠了一个小时。是由于变量放置问题还是只是一般的算法?

编辑 1:将 NULL 更改为 nullptr,创建一个计数器,告诉每个循环的 karak 值

#include <iostream>
#include <stack>
#include <string>
using namespace std;
struct List {
    char karak;
    List* next = nullptr;
};

int main()
{
    List* start = nullptr, * end = nullptr, * list = new List(), * trav = new List();
    int no = 0;
    cout << "Enter Numbers : ";
    cin >> no;
    for (int i = 0; i < no; i++) {
        trav = start;
        cout << "Enter No. " << (i + 1) << " : ";
        cin >> list->karak;
        if (i == 0) {
            start = list;
            end = list;
        }
        else {
            for (; trav->next != nullptr; trav = trav->next) { // infinite loop
                cout << "\ntest\n";
            }
            trav->next = list;
            end = list;
        }
        cout << "\n\nList Address No. " << (i + 1) << " : " << start->next << "\n\n";
        cout << "\n\nStart : " << start->karak << "\nEnd : " << end->karak << "\n\n";
    }

}

【问题讨论】:

  • 在调试器中运行程序,并在进入else 分支时记下每个变量的值。绘制带有框和箭头的绘图,这也有助于可视化您的列表结构。
  • trav-&gt;next 永远不会被初始化。您不能假设它以 nullptr 开头。
  • 但是trav被初始化为start,它不跟随start -> next吗?
  • @Yrgus List 没有将next 设置为等于nullptr 的构造函数,也没有next 的任何类内初始化。您到底希望初始化 next 什么?
  • struct List { char karak; List* next = nullptr; }; 可以解决一个问题。还;停止在现代 C++ 中使用 NULL。使用nullptr

标签: c++ linked-list infinite-loop


【解决方案1】:

需要在循环内创建对象,防止列表变成循环链表。所以我添加了 list = new List();在循环内,以便程序可以在循环内创建对象。

#include <iostream>
#include <stack>
#include <string>
using namespace std;
struct List {
    char karak;
    List* next = nullptr;
};

int main()
{
    List* start = nullptr, * end = nullptr, * list = new List(), * trav = new List();
    int no = 0;
    cout << "Enter Numbers : ";
    cin >> no;
    for (int i = 0; i < no; i++) {
        trav = start;
        list = new List();                      \\I added here
        cout << "Enter No. " << (i + 1) << " : ";
        cin >> list->karak;
        if (i == 0) {
            start = list;
            end = list;
        }
        else {
            for (; trav->next != nullptr; trav = trav->next) { 
                cout << "\ntest\n";
            }
            trav->next = list;
            end = list;
        }
        cout << "\n\nList Address No. " << (i + 1) << " : " << start->next << "\n\n";
        cout << "\n\nStart : " << start->karak << "\nEnd : " << end->karak << "\n\n";
    }

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多