2013-02-15 1 views
1

Я искал много, чтобы найти полезный контент по этой теме, но invain. Я создал связанный список, который работает нормально. Теперь, в качестве привязки, я должен хранить некоторые словарные слова, указанные в файле «input.txt». Упоминается, что вы должны выполнить это задание с использованием двумерных связанных списков, т. Е. Создания другого связанного списка внутри узла связанного списка. Это означает, что каждый узел связанного списка теперь будет содержать список. Это также можно сделать с помощью векторов, но я думаю, что связанный список может быть более полезным. Теперь рассмотрим код.Как создать узел, который также будет содержать список

// В list.h

template <class T> 
struct ListItem 
{ 
    T value; 
    ListItem<T> *next; 
    ListItem<T> *prev; 
    ListItem(T theVal) 
    { 
     this->value = theVal; 
     this->next = NULL; 
     this->prev = NULL; 
    } 
}; 

template <class T> 
class List 
{ 
    ListItem<T> *head; 

public: 

    // Constructor 
    List(); 

    // Destructor 
    ~List(); 
} 

мне нужно сделать связанный список внутри узла Таким образом, в "Struct ListItem" Я делаю что-то вроде этого:

List<T> dictionary; 

Но это с сообщением об ошибке:

"ISO C++ forbids declaration of âListâ with no type" 

Во-вторых, как бы я начал создавать другой связанный список внутри узла. Я имею в виду, предположим, что указатель temp указывает на заголовок первого связанного списка. Как я теперь сделаю другой узел (который будет принадлежать моему 2-му связанному списку) внутри этого узла. Я предполагаю, что может быть что-то вроде этого:

temp->ListItem<T>* secondListNode = new ListItem<T>(item); // I don't know whether 
//It would or not as I am stuck in the first part. 

Это должно быть сделано с использованием формата 2-D так, пожалуйста, просто придерживаться ограничений. Любое другое полезное предложение по этой проблеме было бы полезно. Спасибо заранее.

+0

Почему вы думаете, что делать это со связанным списком было бы «более полезным»? Связанные списки - это ужасная структура данных и практически всегда используются в школьных заданиях. – jalf

+0

Так как бы я сделал вектор внутри узла ??? – DeadCoder

ответ

1

У вас есть круговая зависимость. Если у вас есть только указатель на ListItem<T> в List<T>, затем объявить ListItem<T> первым, а затем определить List<T> и после этого определить ListItem<T> класс:

template<class T> 
class ListItem; 

template<class T> 
class List 
{ 
    ListItem<T> *head; 

    // ... 
}; 

template<class T> 
class ListItem 
{ 
    // `dictionary` is not a pointer or a reference, 
    // so need the full definition of the `List<T>` class 
    List<T> dictionary; 

    // ... 
}; 
+0

Не работает ........ – DeadCoder

+1

@DeadCoder И под «нерабочим», вы имеете в виду? –

+0

@Joachmin Вы можете объяснить, что означает эта ошибка? ?????????/ – DeadCoder

0

Как вы обратитесь к словарю, вы можете подумать об использовании зОго :: вместо этого.

, например:

std::map<std::string, std::list<std::string> > 

, если вы храните ваши ценности, как станд :: строка.

0

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

Если вы просто хотите иметь список списков строк, вы можете легко создать экземпляр этого с существующей структурой данных List, благодаря функции шаблона:

List<List<std::string> > listOfLists; 

конечно, вы все равно можете иметь свой «1D-лист» тоже:

List<std::string> otherList; 

Как правило, это плохая идея адаптировать структуры данных к локальным требованиям, но вместо этого попытаться использовать общие структуры данных более специализированным способом, например, над «списком списков». Не выполняйте «список списков» как отдельный класс и не изменяйте общий список в 2D-список. Это всего лишь «список любого типа T», поэтому T также может быть снова списком (и снова, и снова ...).

+0

Как вы думаете, было бы намного проще Если каждый узел содержит вектор вместо списка ???? – DeadCoder

+0

Общий узел не должен содержать другую структуру данных. Вы создаете общую структуру данных «Список '. * Затем * вы создаете экземпляр с помощью определенного 'T', который может быть, например,« List 'или' std :: vector '. Существует различие между «списком списков» (мой подход) и «списком, в котором узел имеет список» (ваш подход). – leemes

+0

Если вы хотите сопоставить строку со списком строк (как я понимаю, «словарь»), вы должны создать класс, который содержит строку (ключ) и список строк (значений), назовем ее 'DictEntry' , Затем используйте этот класс в качестве типа элемента для вашего списка: 'Список dictionary'. Не трогайте свою реализацию 'List ', это неправильно! – leemes

Смежные вопросы