Класс двусвязного списка

Я пытаюсь сделать двусвязный список. Функция push(int x) должна добавить узел в список и сделать правильную ссылку. Я использую:

class Node {
public:
    int value;
    Node* next;
    Node* prev;

public:
    Node() {}
    void set_value(int x) { value = x; }
    void set_next(Node* x) { next = x; }
    void set_prev(Node* x) { prev = x; }

    Node* get_next() { return next; }
    Node* get_prev() { return prev; }        
};

class deque {
    public:
        Node* head;
        Node* tail;
    public:
        deque() { head = NULL; tail = NULL; }
        void push(int x) {
             Node* n = new Node();
             n->set_value(x);
             n->set_next(NULL);
             n->set_prev(NULL);

             Node* t = head; //link to the next node           
             if (t == NULL) {
                 head = n; 
             } else {
                 while (t->get_next() != NULL) {
                       t = t->get_next();
                 }
                 t->set_next(n);
             }
        }     
};

Поскольку я тестировал часть, которая соединяет узел со следующим, работает нормально, но у меня возникли проблемы с подключением узла к предыдущему. На ум приходит вариант первого:

Node* t = tail;             
if (t == NULL) {
    tail = n; 
} else {
    while (t->get_prev() != NULL) {
          t = t->get_prev();
    }
    t->set_prev(n);
}

Но при использовании этого хвостовой узел всегда является текущим узлом n, если только узел n является единственным узлом в очереди... Что мне делать? большое спасибо


person Giannis Thanasiou    schedule 25.01.2015    source источник
comment
Почему бы просто не использовать что-то вроде n->set_prev(tail); tail->set_next(n); tail = n; с правильной проверкой нулевого указателя?   -  person Angivare    schedule 25.01.2015


Ответы (1)


Рисование всегда помогает с такими структурами данных. Что у вас есть на данный момент:

введите здесь описание изображения

Вы правильно установили next t с помощью: t->set_next(n);. Чего не хватает, так это стрелки под ним, и это: n->set_prev(t).

В общем, при работе с двусвязными списками вызов set_next всегда (в большинстве случаев) должен сопровождаться вызовом set_prev в аргументе set_next. Это из-за свойства двусвязного списка:

x->next == y подразумевает y->prev == x, а y->prev == x подразумевает x->next == y.

person BartoszKP    schedule 25.01.2015