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

Я хочу просто создать двусвязный список и проверить, пуст ли он. Подскажите пожалуйста ошибку. Показана ОШИБКА: в функции empty() голова и хвост выходят за рамки. Не работало при определении как структуры в классе Dict.

#include <iostream>
#include <fstream>
#include <string>
using namespace std;

class node
{   public:
    string data;
    node* next;
    node* prev;
    friend class Dict;
};

class Dict
{   public:
    bool empty();
    Dict();
    node* head;
    node* tail;

};

Dict::Dict()
{   head=new node;
    tail= new node;
    head->next=tail;
    tail->prev=head;

}

bool empty()
{
    return head->next==tail;
}

int main()
{
    Dict my_list;
    if(my_list.empty())
        {cout<<"empty list"<<endl;}
    else
        {cout<<"Not empty"<<endl;}
}

person Nikhil Chilwant    schedule 26.08.2013    source источник


Ответы (3)


Я думаю, вам просто нужно включить пустой метод в свой класс:

bool Dict::empty()
{
    return head->next==tail;
}
person McKay    schedule 26.08.2013
comment
OK. но не могли бы вы сказать мне, почему это не работает? (если вам нужна книга, загрузите: temp-share.com/show/KdP03058h Это указано на странице № 123 PDF-файла) - person Nikhil Chilwant; 26.08.2013
comment
Причина, по которой вы получили сообщение head and tail are out of scope, заключается в том, что вы пытались получить к ним доступ вне соответствующего класса. пустой метод принадлежит классу Dict (который, вероятно, следует переименовать в DoublyLinkedList или что-то подобное) - person McKay; 26.08.2013
comment
Извините за странное имя. Имя было частью моего задания. Спасибо за быструю помощь. - person Nikhil Chilwant; 26.08.2013

Ну, во-первых, вы не создаете пустой список, потому что ваш конструктор создает новые узлы.

В вашем «пустом» методе вы пытаетесь сослаться на переменную «head», определенную в классе Dict.

возможное исправление:

Dict::Dict()
{
    head = tail = null;
}

bool Dict::empty()
{
    return head == null;
}
person McKay    schedule 26.08.2013
comment
Кроме того, если head-›next==tail, у вас явно есть головной узел, а не пустой список. - person ChrisCM; 26.08.2013
comment
Это метод создания двух узлов для головы и хвоста без данных. Они содержат только head-›next и tail-›prev - person Nikhil Chilwant; 26.08.2013
comment
Да, похоже, он не понимает концепции нуля. что в этих головах должно быть что-то, поэтому, если это то же самое, что и хвост, это должна быть та пустая штука, которую я туда вставил с самого начала. - person McKay; 26.08.2013
comment
Поэтому не включайте в список головные и хвостовые узлы. - person Nikhil Chilwant; 26.08.2013
comment
Некоторые из этих комментариев (@ChrisCM) кажутся принадлежащими ОП? - person McKay; 26.08.2013
comment
@Nikhil Плохой тон - иметь узел, на котором нет данных для вашего пустого дела. Что делать, если вы хотите сохранить что-то, что является нулевым? Как вы ведете счет? Как это должно выглядеть, если в списке ровно один Item? - person McKay; 26.08.2013
comment
OK . Пожалуйста, прочитайте текст из книги Гудрича здесь: tiikoni.com/tis/view/?id =d11e647 - person Nikhil Chilwant; 26.08.2013
comment
@Nikhil, хорошо, я создал новый ответ на этот случай. - person McKay; 26.08.2013
comment
оно работает! Но почему раньше показывалось недоступное сообщение?? В книге сказано делать так. Так что логика та же. (если вам нужна книга, загрузите: temp-share.com/show/KdP03058h) Это указан на стр. №. 123 PDF-файла. - person Nikhil Chilwant; 26.08.2013
comment
@Nikhil см. комментарии к другому ответу. - person McKay; 26.08.2013

  • Есть пара вещей, над которыми вам нужно поработать. Сначала вы не включили свой node.cpp, есть только node.h, что делает ваш конструктор узла? В конструкторе Dict() вы должны вызвать конструктор узла, т.е. node(), это инициализирует класс узла для того, что делает ваш конструктор узла, т.е. устанавливает переменные строковые данные в некоторое входное значение.
  • Что такое пустой() вывод. По вашему определению. Метод empty() делает то же самое, проверяя, находится ли head->next в той же ячейке памяти, что и tail. Я не знаю, что вы хотите, потому что он всегда будет возвращать true, если вы вызываете конструктор dict(). Если вы не вызовете dict(), он вернет false или вы даже можете получить ошибку дескриптора, «нулевую ссылку».
  • Чтобы создать список узлов или связанный список, вам необходимо определить метод ADD, этот метод должен иметь возможность добавлять новый узел или связывать текущий узел со следующим узлом.
  • Вам также необходимо определить узел удаления, который удаляет или удаляет любой заданный узел. Вероятно, это будет самый сложный метод, который вы когда-либо писали.
person Juniar    schedule 26.08.2013
comment
Хорошо, спасибо за предложения, но это не полный код. Чтобы узнать полный код, загрузите книгу: загрузите с: temp-share.com/show/KdP03058h) Это дано на странице №. 123 из PDF - person Nikhil Chilwant; 27.08.2013