链接列表不适用于输入

时间:2014-10-16 18:01:55

标签: c++

我编写的代码采用从用户输入的整数并创建链接列表,然后打印出列表。但是,当我输入值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;
    }
}

2 个答案:

答案 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;
    }
}

取出它会使其正确打印。