2009-12-22 68 views
1

這些是哪一種更正確的方法來將第一個對象存儲在鏈接列表中? 或者有人可以指出每個人的優點/缺點。謝謝。指向鏈表中的第一個對象,在類內部還是外部?

class Node 
{ 
    int var; 
    Node *next; 

    static Node *first; 

    Node() 
    { 
     if (first == NULL) 
     { 
      first = this; 
      next = NULL; 
     } 
     else 
      //next code here 
     } 
    } 
} 

Node* Node::first = NULL; 
new Node(); 

- 或 -

class Node 
{ 
    int var; 
    Node *next; 

    Node() 
    { 
     //next code here 
    } 
} 

Node* first = new Node(); 

回答

3

最常見的是有一個單獨的List類和一個單獨的Node類。節點通常非常簡單。 List包含一個指向第一個Node的指針,並實現各種列表操作(添加,刪除,查找等)。

像下面

class List 
{ 
public: 
    List() 
    { 
    first = new Node(); 
    } 

    void insert(int val); 
    void remove(int val); 
    // ... and so on 

    ~List() 
    { 
    // ... clean up 
    } 

private: 
    struct Node 
    { 
    int val; 
    Node* next; 

    Node(int val_ = 0, Node* next_ = 0) 
     : val(val_), next(next_) 
    {} 
    }; 

    Node* first; 
}; 

注意,如果你想,你可以把外面的節點列表,但這通常並沒有太大的意義。

+0

我需要一個獨特的列表類爲不同的節點類,說NodeOne,NodeTwo和NodeThree? – Ash 2009-12-22 17:00:46

+0

@Ash:不確定你在這裏是什麼意思?你可以絕對模板List(和Node通過它)來獲得任意類型的值。爲什麼你還需要不同類別的節點? – 2009-12-22 17:05:55

+0

我上面的例子只是我寫的一個俄羅斯方塊克隆的縮寫。我有兩個類,Shape和Text。他們都使用鏈表,所以我可以動態地添加/刪除塊和文本。我可以模板「列表」來控制添加/刪除/插入功能的兩個類的鏈接列表嗎? – Ash 2009-12-22 17:15:08

6

後者是絕對優選的。通過將第一個節點指針設置爲靜態類成員,基本上說,在整個程序中將只有一個單個鏈接列表。

第二個示例允許您創建多個列表。

3

想必您可能有多個列表?在這種情況下,靜態選項是非啓動器。

4

第一個例子有一個明確的缺點,就是隻能在整個程序中創建一個鏈表,所以我不會這樣做。

第二個工作正常,但並沒有屏蔽該類的用戶與鏈接列表的工作方式。最好添加第二個類,例如名爲LinkedList,存儲「第一個」指針並執行列表管理。

更好的是,你可以使用std :: list代替。

3

你絕對不希望「第一」是靜態的。這意味着整個程序中只有一個鏈表。靜態意味着整個程序中每個鏈表中的每個節點都有相同的開始。

這就是說你想要你的節點有最少的責任 - 它是有意義的,它存儲它的價值,並能夠到達下一個節點。它增加了維護「第一」指針的工作的複雜性。例如,當你在開始處插入一個新元素時會發生什麼?那麼你必須更新每個人的「第一個」指針。鑑於上述兩種選擇,我選擇了第二種選擇。

我會進一步添加第三個選項。添加一個「鏈接列表」包裝,使您可以輕鬆訪問「第一個」,「最後」,並允許您輕鬆插入和遍歷列表。喜歡的東西:

class LinkedList 
{ 
    Node* First; 
    Node* Last; 

public: 
    Node* GetFirst() {return First;} 
    Node* GetLast() {return Last;} 

    // insert after "where" 
    void Insert(Node* where, Node* newNode); 
    ... 
} 
1

不會徒勞地限制你的代碼到一個列表實例是代碼變種一個很好的說法2.

然而,僅僅從表面上看着兩個例子,線路數量之多的代碼也給出了一個很好的指示,即變體2具有優於變體1的優點,因爲它明顯更短。

相關問題