C ++ Linked List Traversal&使用For循环打印

时间:2016-02-14 15:30:42

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

嘿伙计们,我在使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;

}

因为我输出到文件(使用ofstream outfile)。如果我做

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

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

 listNode* test = myList.ListHead;
然后它会拒绝运行。它编译得很好,但运行结束了。

我在main中用来填充linkedList

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

    myList.listInsert(data);
  }

1 个答案:

答案 0 :(得分:1)

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

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初始化为空指针,而不是取消引用未初始化的变量。

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