打印链接列表中的元素,但却打印出反转的C++元素。

问题描述 投票:1回答:1

在这里,我只是想打印我创建的链接列表中的元素,但它是以反向顺序打印的,看起来代码中存在一个错误,帮助我解决它push函数每次我们输入元素插入链接列表时都会向链接列表添加节点,我已经传递了头和数据的参考。每次调用push函数时,都会动态创建一个节点。我在这里使用的是C++语言。

#include<iostream>
using namespace std;
class node{
    public:
    int data;
    node* next;
};
//creating linked list 
    void push(node** head_ref,int new_data) //passing address of head and data to put in list
    {

        node* new_node=new node(); //new node created
        new_node->data=new_data;   //data inserted
        new_node->next=*(head_ref);
        *(head_ref)=new_node;
    }

int main()
{
    node* head=NULL;

    int n;
    cin>>n; //number of elements in linked list
    for(int i=0;i<n;i++)
    {
        int val;
        cin>>val;
        push(&head,val); //push function which creates a linked list

    }

//while loop for printing elements of linked list
        while(head!=NULL)
        {
            cout<<head->data;
            head=head->next;
        }

    return 0;
}
c++ data-structures linked-list singly-linked-list
1个回答
0
投票

你目前所做的是将每个节点指定为当前头部的前身,所以最终你的头部将是你添加的最新元素,它的继承者是最后的第二个元素,它的继承者是最后的第三个元素等等,从而导致一个反向的列表。

你应该将新的节点分配为 继承者 的当前 "头",像这样。

void push(node** tail_ref,int new_data) //passing address of tail and data to put in list
{
    node* new_node=new node(); //new node created
    new_node->data=new_data;   //data inserted
    (*tail_ref)->next= new_node;
    *(tail_ref)=new_node;
}

请注意,我重命名了 head_reftail_ref 在上面的代码段中,它更好地描述了指针实际代表的内容:指向列表当前最后一个元素的指针,因此是列表的尾部。

当然,你需要保存指向第一个元素的指针。否则你将无法在你的链接列表中迭代。


0
投票

扩展到 西蒙的答案,到目前为止是正确的。

你已经有了一个 "节点 "类 - 为什么不创建一个 "列表 "或 "linked_list "类呢?

class LinkedList
{
    node* m_head = nullptr;
    node* m_tail = nullptr;
};

现在你总是把头和尾结合在一起,而不需要分开存储它们。注意,在上面的例子中,它们都是 私人. 其实你应该这样设计你的类。如果你不这样做,那么你就允许用户从外部破坏列表的实现(例如,有人可能只是将其中一个指针设置为nullptr,在head的情况下产生内存泄漏)。

然而,现在你必须提供适当的手段来访问和修改列表。

class LinkedList
{
public:
    void append(int new_data);  // as Simon proposed
    void prepend(int new_data); // your implementation
    int head();
    int tail();
    void dropHead();
    //void dropTail(); // is an O(n) operation with singly linked list, though!
private:
    node* m_head = nullptr;
    node* m_tail = nullptr;
};

节点类和你的列表有非常紧密的联系,你可以考虑不要让它成为一个独立的类,而是让它成为一个嵌套类。还有相当多的内容需要补充(例如如何在列表上迭代)。要想得到一些提示,我建议偷看一下STL,熟悉一下迭代器的概念。

最后是 不要再重复发明轮子了 STL已经提供了完全实现的双重(std::list)和单一地(std::forward_list)链接列表。实验一下自己的实现,了解一下风向,是可以的,但是一旦了解了,就换回STL。

© www.soinside.com 2019 - 2024. All rights reserved.