2013-02-15 45 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