为什么我在尝试在单向链表中打印元素时会出现这个永无止境的循环

why am i getting this never ending loop while trying to print elements in singly linked list

本文关键字:永无止境 循环 打印 为什么 链表 元素      更新时间:2023-10-16

我是数据结构的新手,我能够在 c 中实现这个单向链表并且工作正常。虽然我试图在C++中实现相同的内容,但除了printList()部分之外,我几乎完成了它。同样的函数在 C 中没有任何问题,但是当它在 C++ 中执行时,它会进入一个永无止境的循环。有人可以帮我解决这个问题吗?

另外,您能否向我推荐一些好的数据结构教程,因为它从未在我们大学教授过,如果不花我们在YouTube上观看一个概念的不同教程,我就无法很好地理解它。

#include <iostream>
using namespace std;
struct Node
{
int data;
Node *next;
};

Node *head = new Node;

void printList(){
Node *temp = head;
while(temp!=NULL){
cout << temp->data;
temp = temp->next;
}
}


void insertNode(int x){
Node *temp = new Node;
temp->data = x;
temp->next = head;
head = temp;
}
int main(){
int n,i,x;
cout << "How many numbers?" << endl;
cin >> n;
for(i=0; i<n; i++){
cout << "Enter data: " << endl;
cin >> x;
insertNode(x);
}
printList();
return 0;
}

你的错误在这里:

Node *head = new Node;

这是一个 bug 的一个原因是,您正在创建一个具有未初始化数据和未初始化的下一个指针的头节点。您可以通过为 Node 类添加构造函数或使用

Node *head = new Node{};

或者如果你有一个旧的编译器,则为 Node(( 添加一个构造函数。

但是,为什么首先要在列表中显示这个额外的节点呢?当您进行打印时,除非您修改打印代码以忽略最后一个节点,否则您将打印它。

更好的解决方案是将此行替换为:

Node *head = nullptr;

或者因为您使用的是 NULL 而不是 nullptr

Node *head = NULL;