2013-02-15 33 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(); 
} 

我需要的节点内部链表因此,在“结构列表项”我做这样的事情:

List<T> dictionary; 

但它是给出一个错误:

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

第二,我将如何开始在节点内制作另一个链表。我的意思是假设temp指针指向第一个链表的头部。我将如何在此节点内创建另一个节点(属于我的第二个链表)。我想可能是这样的:

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 2013-02-15 12:12:22

+0

那么,如何将一个节点内的节点? – DeadCoder 2013-02-15 12:31:15

回答

1

你有循环依赖。如果你只有一个指向List<T>ListItem<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 2013-02-15 12:33:16

+1

@DeadCoder通过“不工作”,你的意思是? – 2013-02-15 12:36:53

+0

@Joachmin你能解释一下这个错误是什么状态吗?/ – DeadCoder 2013-02-15 12:36:58

0

当你查字典,你可以考虑使用一个std ::地图代替。

例如:

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

如果你存储你的价值观作为的std :: string。

0

我不知道如果我完全理解你的意思是什么“这意味着链表的每一个节点,现在将包含一个列表为好。

如果你只是想有一个列表串的列表,你可以很容易地与您现有列表数据结构实例此,由于模板功能:

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

当然,你仍然可以有你的“维列表”太:

List<std::string> otherList; 

通常,将数据结构适应本地需求是一个糟糕的主意,而是尝试以更专业化的方式使用通用数据结构,如上面的“列表清单”。不要将“列表列表”作为单独的类来实现,也不要将通用列表更改为2D列表。这只是一个“任何类型的列表T”,所以T也可以再次列表(再次,再次...)。

+0

你认为这会更容易如果我每个节点包含一个向量而不是一个列表????? – DeadCoder 2013-02-15 12:34:05

+0

通用节点不应该包含其他数据结构。你设计一个通用数据结构'List '。 *然后*用一个特定的'T'实例化它,例如可以是'List '或'std :: vector '。 “列表清单”(我的方法)和“节点列表清单”(您的方法)之间有区别。 – leemes 2013-02-15 12:50:56

+0

如果你想从一个字符串映射到一个字符串列表(正如我所理解的一个“字典”),你应该创建一个包含字符串(键)和字符串列表(值)的类,我们称之为“DictEntry” 。然后,使用这个类作为列表的项目类型:'List dictionary'。不要触摸你的'List '的实现,那是错误的! – leemes 2013-02-15 12:53:39

相关问题