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