понимание enqueue в связанном списке - PullRequest
0 голосов
/ 06 апреля 2020

эй, я пытаюсь добавить в свою очередь, но у меня есть проблема, и мне нужна помощь, я использовал связанный список для своей очереди, и проблема в том, что когда я добавляю третий элемент в свой список, я перезаписываю второй, это код

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

1 Ответ

1 голос
/ 06 апреля 2020

Функция может выглядеть следующим образом. Я предполагаю, что элемент данных next узла, на который указывает указатель data, уже установлен на nullptr.

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

То есть, если очередь пуста (указатели begin и end равны nullptr), тогда начало и конец устанавливаются на добавленный указатель.

В противном случае новый узел добавляется в конец очереди. В этом случае элемент данных, следующий за узлом, на который указывает конец указателя, устанавливается на новый указатель, и этот указатель становится указателем конца.

Обратите внимание, что пользователь очереди ничего не должен знать о узел класса. Класс должен быть объявлен как закрытый или защищенный член очереди класса. И метод addNode должен заменить метод pu sh, объявление которого должно выглядеть как

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