嘿伙计们,我在使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);
}
答案 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
初始化为空指针,而不是取消引用未初始化的变量。
如果你需要在列表的末尾保留一个虚拟节点(虽然我真的不明白为什么),那么你实际上需要分配一个节点。