我编写的代码采用从用户输入的整数并创建链接列表,然后打印出列表。但是,当我输入值1,2,3,4,5时,输出仅为5 5 5 5 5
请告诉我我在哪里错了。
代码如下:
include"iostream"
using namespace std;
struct node
{
int number;
node* next;
};
int main()
{
node* head;
head = NULL;
int i,n,x;
cin>>n;
cout<<endl;
for(i=0;i<n;i++)
{
cin>>x;
//Insert(x);
node* temp;
temp = new node;
temp->number = x;
temp->next = NULL;
head = temp;
}
//Print();
node* temp;
temp = head;
while(temp != NULL)
{
for(int j=0; j<n; j++)
cout<<temp->number<<" ";
temp = temp->next;
}
}
答案 0 :(得分:1)
这看起来有点不对劲:
while(temp != NULL)
{
for(int j=0; j<n; j++)
cout<<temp->number<<" "; // Only this is part of the for() loop
temp = temp->next; // This happens after the for() loop ends
}
只有第一行由for()
循环执行,因此它会保持输出相同的数字。为什么for循环呢?该怎么办?
试试这个:
while(temp != NULL)
{
cout<<temp->number<<" ";
temp = temp->next;
}
看看它是否更好。
同时强>
正如@crashmstr指出你的插入逻辑是错误的:
for(i=0;i<n;i++)
{
cin>>x;
//Insert(x);
node* temp;
temp = new node;
temp->number = x;
temp->next = NULL; // this should point to the nextnode
head = temp;
}
<强>尝试:强>
for(i=0;i<n;i++)
{
cin>>x;
//Insert(x);
node* temp;
temp = new node;
temp->number = x;
temp->next = head; // the current begining
head = temp;
}
*另外2:
include"iostream" // not right
请使用:
#include <iostream> // correct!
答案 1 :(得分:1)
请记住,在设置head
指针时,只应在列表为空时(即head == NULL
时)执行此操作。我们应该在创建新节点后执行此操作,以便知道将head
设置为:
node* temp = new node;
temp->number = x;
temp->next = NULL;
if (head == NULL) // if the list is empty then...
head = temp; // temp is the start of the list
还有另一个问题。 temp
应该在每次创建时添加到列表的 end 中。如果列表为空,则head
是列表的结尾,但如果列表已经有元素,那么我们需要转到结尾并将该节点的next
指针设置为{{1} }。这是相当简单的,只需要一个while循环迭代列表到最后:
temp
还可以选择保持if (head == NULL)
head = temp;
else // the list is not empty
{
// so we need to go to the end
node* p = head;
while (p->next != NULL)
p = p->next; // keep going through
// p now points to the last node
p->next = temp;
}
节点指向插入的最后一个元素。这使得我们不必每次都查看结果列表:
prev
最后一件事就是你打印的方式。你不应该在这里有一个嵌套的for循环:
node* head = NULL, prev = NULL;
for (/* ... */)
{
// ...
if (head == NULL)
head = prev = temp;
else
{
prev->next = temp;
prev = temp;
}
}
取出它会使其正确打印。