C++ 使用 For 循环的链表遍历和打印



嘿伙计们,我在让 for 循环工作时遇到了一些麻烦。 myList 是一个链表,填充了文件中的数字,我正在尝试遍历它并以某种(当前,下一个(-->(当前,下一个(方式打印当前值和每个下一个值。计算一个变量,该变量计算我的链表中存在多少个节点。

linkedList test = myList;
for (int i = 1; i <= count; i++)
{
    cout << "(" << test.listHead->value << "," << test.listHead->next->value << ")-->";
    test.listHead = test.listHead->next;
}           

由于某种原因,for 循环无法执行任何操作,或者更确切地说,代码在 for 循环开始时中断。如果我摆脱了 for 循环,只需复制和粘贴

    cout << "(" << test.listHead->value << "," << test.listHead->next->value << ")-->";
    test.listHead = test.listHead->next;

很多时候它会按照我的意愿工作,但我宁愿不这样做。for 循环语法看起来是正确的,如果说 count 是 17,那么应该有 17 次迭代,直到它到达列表的末尾。

编辑:

包括类的源代码

class listNode{
public:
int value;
listNode* next;
friend class linkedList;

listNode():value(0),next(0) {
}
public:
~listNode(){
}; 
};

class linkedList{
public:
listNode* listHead;
listNode* spot;
int count;
linkedList()
{
    listHead->value = -9999;
}

bool isEmpty()
{
    return (listHead == NULL);  
}
void listInsert (int data)
{
    spot = findSpot(data);
    listNode* newNode = new listNode;
    newNode-> value = data;
    newNode-> next = spot->next;
    spot->next = newNode;
    cout << "inserted " << newNode->value << endl;  
}
listNode* findSpot (int data)
{
    spot = listHead;
    if (isEmpty())
    {
        return NULL;
    }
    while (spot->next != NULL && spot->next->value < data)
    {
   spot = spot->next;
     }
      if (spot->next->value == data)
        {
            cout << "The number: " << data << " already exists in the linked  list." << endl;
    spot = spot->next;
        }
    return spot;
}

由于我要输出到文件(使用流输出文件(。如果我这样做

 outfile << "(" << test.listHead->value << "," << test.listHead->next->value << ")-->";
    test.listHead = test.listHead->next;

正好 17 次(这是链表和计数变量的大小(,它为我生成了整个列表。但是每当我尝试初始化一个

 listNode* test = myList.ListHead;

然后它将拒绝运行。它编译正常,但运行刚刚结束。

我主要使用什么来填充链接列表

  ifstream infile;
  infile.open((argv[1]));
  while (infile >> data)
  {
    myList.listInsert(data);
  }

您实际上在循环中修改列表头指针。您需要为当前节点使用一个单独的变量,初始化为列表头。在取消引用下一个指针之前,还需要检查它是否有效。

喜欢

auto currentNode = myList.listHead;
for (int i = 1; i <= count && currentNode != nullptr; ++i, currentNode = currentNode->next)
{
    if (currentNode->next != nullptr)
    {
        cout << "(" << currentNode->value << "," << currentNode->next->value << ")-->";
    }
    else
    {
        cout << "(" << currentNode->value << ")-->";
    }
}

实际问题是linkedList类,它有一个主要问题,导致几种未定义的行为:不初始化类的成员变量。由于它们没有初始化,因此它们的值将是不确定的,并且除了初始化它们之外以任何方式使用它们都会导致所述 UB。

您需要在构造函数中将listHead初始化为 null 指针,而不是取消引用未初始化的变量。

如果你需要在列表的末尾保留一个虚拟节点(虽然我真的不明白为什么(,那么你实际上需要分配一个节点。

相关内容

  • 没有找到相关文章

最新更新