如何打印简单的链表(C ++)?

时间:2017-06-02 07:35:16

标签: c++ loops for-loop linked-list doubly-linked-list

我所做的代码是:

struct node
{
    int value;
    node *prev;
    node *next;
};

void play()
{
    node *head = NULL, *temp = NULL, *run = NULL;

    for (int x = 1; x > 10; x++)
    {
        temp = new node();    //Make a new node
        temp -> value = x;    //Assign value of new node
        temp -> prev = NULL;  //Previous node (node before current node)
        temp -> next = NULL;  //Next node (node after current node)
    }
    if (head == NULL) 
    {
        head = temp; //Head -> Temp
    }
    else
    {
        run = head; //Run -> Head
        while (run -> next != NULL)
        {
            run = run -> next; //Go from node to node
        }
        run -> next = temp; //If next node is null, next node makes a new temp
        temp -> prev = run;
    }
    run = head; //Play from start again
    while (run != NULL)  //Printing
    {
        printf("%d\n", run -> value);
        run = run -> next;
    }
}


int main()
{
  play();
  system ("pause");
  return 0;
}

但是,它不起作用。没有输出(完全空白)。如何才能正确打印此链接列表?我希望它输出:

1 2 3 4 5 6 7 8 9 10

我拥有的其他选项是为打印创建另一个单独的函数或将整个事物移动到int main但我已经尝试过但它仍然没有输出任何内容。

4 个答案:

答案 0 :(得分:2)

对于初学者来说,在函数

中的第一个for循环的条件中存在拼写错误
for (int x = 1; x > 10; x++)
                ^^^^^^

必须有

for (int x = 1; x <= 10; x++)
                ^^^^^^

其次,尝试向列表添加新节点的代码位于for循环之外。因此,只有最后分配的节点才会添加到列表中。您必须将代码放在循环中。

此外,如果这是一个双链表,那么最好有一个尾节点,新的节点将附加到该尾节点。

你应该在退出函数之前释放所有已分配的内存。

该功能可以按照以下方式显示,如演示程序中所示。

#include <iostream>
#include <cstdlib>

struct node
{
    int value;
    node *prev;
    node *next;
};

void play()
{
    const int N = 10;
    node *head = nullptr, *tail = nullptr;

    for (int i = 0; i < N; i++)
    {
        node *temp = new node{ i + 1, tail, nullptr };

        if (tail == nullptr)
        {
            head = tail = temp;
        }
        else
        {
            tail = tail->next = temp;
        }
    }

    for (node *current = head; current != nullptr; current = current->next)
    {
        std::cout << current->value << ' ';
    }
    std::cout << std::endl;

    while (head != nullptr)
    {
        node *temp = head;
        head = head->next;
        delete temp;
    }
    tail = head;
}

int main() 
{
    play();
    // system("pause");

    return 0;
}

程序输出

1 2 3 4 5 6 7 8 9 10 

通过添加一个指定创建列表中节点数的参数而不是使用幻数10,可以使函数更灵活。

例如

void play( int n )
{
    node *head = nullptr, *tail = nullptr;

    for (int i = 0; i < n; i++)
    {
        node *temp = new node{ i + 1, tail, nullptr };

        if (tail == nullptr)
        {
            head = tail = temp;
        }
        else
        {
            tail = tail->next = temp;
        }
    }

    for (node *current = head; current != nullptr; current = current->next)
    {
        std::cout << current->value << ' ';
    }
    std::cout << std::endl;

    while (head != nullptr)
    {
        node *temp = head;
        head = head->next;
        delete temp;
    }
    tail = head;
}

在这种情况下,可以调用该函数,例如

play( 10 );

play( 20 );

等等。

答案 1 :(得分:1)

当您运行play()时,您将创建10个新节点,但在创建新节点之前将它们存储在任何地方。因此,您“丢失”所有节点 - 除了最后一个节点,它仍然在temp

相反,你应该做类似的事情:

for (int x = 1; x < 10; x++)
{
    if (temp == nullptr) {
        temp = new node();
        temp -> value = x;
        temp -> prev = nullptr;
        temp -> next = nullptr;
        head = temp;
    } else {
        temp -> next = new node();
        temp -> next -> value = x;
        temp -> next -> prev = temp;
        temp -> next -> next = nullptr;
        temp = temp -> next
    }
}

然后,您可以按照以下方式打印链接列表:

run = head; //Play from start again
while (run != nullptr)  //Printing
{
    printf("%d\n", run -> value);
    run = run -> next;
}

正如来自莫斯科的@Vlad所注意到的那样,在退出函数之前不要忘记释放已分配的内存。

请注意,我使用nullptr代替NULL。它是一个替换NULL的C ++ 11关键字。解释是here

答案 2 :(得分:0)

@Abrikots答案是一个解决方案,但不是问题的确切来源。您的for循环永远不会运行,因为x>10

时条件为x=1.

以下是您的代码的工作版本。

#include<iostream>
struct node
{
    int value;
    node *prev;
    node *next;
};

void play()
{
    node *head = 0, *temp = 0, *run = 0;  // 0 or nullptr can be used
    for (int x = 1; x < 10; x++) // fixed loop condition
    {
        node* oldtemp = temp; // always store the old value
        temp = new node();    //Make a new node
        temp -> value = x;
        if (head == 0) // if first node assign it as head
        {
            head = temp;
            temp -> prev = 0;
            temp -> next = 0;
        }
        else
        {
            temp->prev=oldtemp;  // connect the element to list
            oldtemp->next=temp;
            temp->next=0;
        }
    }
    run = head;
    while (run!= 0)  //Printing
    {
        printf("%d\n", run -> value);
        run = run -> next;
    }
}


int main()
{
  play();

  return 0;
}

答案 3 :(得分:0)

首先,您的程序永远不会进入for循环。你的循环相当于:

int x=1;
while(x>10) { // always false
  // do stuff
  x++;
}

因此,tempNULLhead初始化为NULL,但没有任何反应。

其次,列表的初始化不在循环中,因此最多只会初始化head。在函数末尾移动for循环的右括号(并调整缩进等)。

第二次,如果您的编译器允许,您可以考虑使用更多C ++习语而不是C语言(如果您的目标是学习C ++),使用nullptrcout,智能指针......但它是另一个故事!