【问题标题】:understanding enqueue in a linked list理解链表中的排队
【发布时间】:2020-04-06 11:13:38
【问题描述】:

嘿,我正在尝试添加到我的队列中,但我遇到了问题,我需要一些帮助 我为我的队列使用了一个链接列表,问题是当我将第三个项目添加到我的列表中时,我覆盖了第二个 这是代码

void addnode(node* data)
{
    if (begin == NULL)
    {
        data->next = begin;
        begin = data;
    }
    else
    {
        end = data; //this is where the problem when i add a 3rd data i dont save anywhere my end so its gone
        begin->next = end;
        end->next = NULL;
    }
}

在我的代码中,我已经开始队列的开始,结束队列

我建立的链表是 C++ 中的类, 但是每当我添加第三个数据时,第二个数据就会被覆盖,所以我总是有两个.. 我需要一些关于如何修复它的帮助,谢谢:)

编辑这是更多的代码:这是我的队列类

#include"node.h"
class queue
{
public:
    queue();
    ~queue();
    void addNode(node*);
private:
    node* begin;
    node* end;

};

这是我从中获取数据的类

using namespace std;
class node
{
    friend void printclient(node &);
public:
    node();
    ~node();
    void setstr(string);
    void setmoney(int);
    node* next;
private:
    string name;
    double money;
    int id;
};

【问题讨论】:

  • end 指针代表什么?
  • 请显示足够的代码。 beginend 是未定义的,node 的结构也是如此。
  • 我发布了编辑
  • @shahar 不幸的是,编辑还不够。例如,next 在哪里定义?请仔细阅读help for posting questions,并创建minimal, reproducible example
  • 现在可以了,我希望

标签: c++ class linked-list queue singly-linked-list


【解决方案1】:

该函数可以如下所示。我假设指针data指向的节点的数据成员next已经设置为nullptr

void addnode(node* data)
{
    if (begin == nullptr)
    {
        begin = end = data;
    }
    else
    {
        end = end->next = data;
    }
}

即如果队列为空(指针beginend 等于nullptr)那么begin 和end 被设置为添加的指针。

否则,新节点将附加到队列的末尾。在这种情况下,指针end指向的节点的数据成员next被设置为新指针,这个指针成为结束指针。

注意队列的用户应该对类节点一无所知。该类应声明为类队列的私有或受保护成员。并且方法 addNode 应该替代方法 push 声明,其应该看起来像

void push( const std::string &name, int id, double money );

【讨论】:

  • 谢谢它有效.. 你能解释一下为什么我不需要设置我的开始->下一步吗?
  • @shahar 当列表为空并且您向其中添加了一个节点时,两个指针开始和结束都指向同一个节点。因此,如果您将使用指针 end 更改节点的数据成员 next,那么使用指针 begin 是相同的。但是由于您总是将新节点添加到列表的末尾,因此无需使用指针 begin。
猜你喜欢
  • 1970-01-01
  • 2011-09-11
  • 2013-12-02
  • 2018-05-10
  • 2022-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多