我正在尝试从用户输入创建一个链接列表,但是当我尝试打印它时它不会打印任何内容。甚至不是头脑。另请注意,它是故意向后的。
这是我获取用户输入的函数,它返回列表。我知道这是错的,但是我已经花了好几个小时就无法让它工作......
#include <iostream>
#include <limits>
#include <ios>
struct Node {
int value;
Node *next;
}
Node* getInput() {
Node* head = nullptr;
Node* tmp;
while (true) {
int x;
if (!(cin >> x)) {
break;
} else if ( head == nullptr) {
head = new Node{x, nullptr);
} else {
tmp = new Node{x , nullptr};
tmp->next = head;
head = head->next;
}
}
return tmp;
}
int main() {
cout << getInput()->value;
}
答案 0 :(得分:1)
get input()的返回值不是列表的实际开头/开头。插入任何节点时,Head将始终指向null。在第一次插入时,头值可以存储在临时指针中,并返回临时指针而不是头部。
答案 1 :(得分:1)
如果您尝试以相反的顺序打印链接列表,这是一个可用的版本:
#include <iostream>
#include <limits>
#include <ios>
using namespace std;
struct Node {
int value;
Node *next;
Node(int val, Node *nextPtr) {
value = val;
next = nextPtr;
}
};
Node *getInput() {
Node *head = nullptr;
Node *tmp;
while (true) {
int x;
if (!(cin >> x)) {
break;
} else if (head == nullptr) {
head = new Node(x, nullptr);
} else {
tmp = new Node(x, nullptr);
tmp->next = head;
head = tmp;
}
}
return head;
}
int main() {
Node *head = getInput();
Node *tmp;
while (head != nullptr) {
cout << head->value << ", ";
tmp = head;
head = head->next;
delete tmp;
}
cout << endl;
return 0;
}
答案 2 :(得分:1)
有几个很好的解决方案,但由于请求是针对后退列表,这可能非常非常简单。
Node* getInput()
{
Node* head = nullptr;
int x;
while (std::cin >> x) // keep going until we can't get a good x.
{
head = new Node{x, head}; // point node at current head, assign new head
// head always points at the beginning of list because items are
// always inserted at the start of the list.
}
return head;
}
因此,要证明此列表向后打印,这里是一个简单的测试人员
int main()
{
Node* cur = getInput();
while (cur)
{
std::cout << cur->value << '\n';
cur = cur->next;
}
}
答案 3 :(得分:0)
head = head->next;
是问题所在。您正确地分配了Node
,但是您立即泄漏Node
而head
指向nullptr
。
最简单的解决方案是将head
指向最近的Node
。第一次插入时您需要一个特殊情况,因为head
将是未初始化的(顺便说一下,请修复),但这样您始终指向最近的Node
。
如果遇到问题,请用箭头在纸上画出Node
。观察每次插入时箭头的变化情况,您就会看到发生了什么。