2013-07-02 52 views
0

我試圖做一個包含另一個鏈接列表的列表,然後我想將它們連接成一個列表。我遇到了一些困難。所以首先我做這個: typedef List DList; - 它使一種鏈接列表; 然後,例如,我做DList A和B.我插入一些數字,如1,2,3 ...在他們兩個; 後來我加入他們的主要鏈表是這樣的:另一個鏈接列表中的鏈接列表

List<DList> L; 
L.Add_Node(A); 
L.Add_Node(B); 

,一切似乎要被罰款,在這個階段的程序。在此之後,我試圖做一個函數來連接分離鏈表。我將創建一個新的列表新列表其中值將被存儲。我的問題出現了。我不知道如何編寫這個函數。 我做了這樣的事情:首先我做一個函數,它將循環L列表中的節點(有兩個小列表)。然後我去我的連接功能。你可以在下面的代碼中看到它們:

template<class T> 
void Start(List<T> L, List<T> NewList) 
    { 
    List<T> *temp = L.start_ptr; //I get the position of the first element; 
    while(temp) 
     { 
     NewList = Concat(NewList, temp->data); 
     temp = temp->next; 
     } 
    } 

template<class T> 
List Concat(List<T> L1, List<T> L2) 
    { 
    List<T> *temp1, *temp2; 
    List<T> NewList; 
    temp1 = L1.start_ptr; 
    temp2 = L2.start_ptr; 
    while(temp1) 
     { 
     NewList.Add_Node(temp1->data); 
     temp1 = temp1->next; 
     } 
     while(temp2) 
     { 
     NewList.Add_Node(temp2->data); 
     temp2 = temp2->next; 
     } 
    return NewList; 
    } 

這些是我的功能。也許他們是完全錯誤的......編譯器給我錯誤,成員start_ptr,數據和下一個是私人的(這是真的)。它給了我更多的錯誤......類似這樣的東西寫在我正在學習的書中,但它在那裏非常複雜......如果你不想花時間幫助我,我會很感激如果你給我一個很好的來源,我可以從中閱讀更多關於這種類型的列表。

回答

0

在你的函數開始,你通過類型T

但後來,你串聯整個列表與其他列表的兩個列表,當你連接兩個列表在你的Concat方法中。

此外,您通過複製傳遞參數,這可能不是你想要做的事情。

我想你的意思做的是類似的東西:

void Start(List< List <T> > & L, List<T> &NewList) 

通過複製傳遞意味着你的程序發送參數的副本給你的函數。 這意味着您通過的列表將被複制(如果您的列表很大,可能會非常沉重),並且只有副本將被修改。

在我給你的開始函數的新版本中,你可以注意到我添加了&。這意味着該值通過引用傳遞。基本上,這意味着它實際上是您使用的對象,而不是副本。

最後,關於成員是私人的,你應該添加公共訪問器,以便他們可以在你的課外使用。

在你的情況,你可以在你的類添加一個公共方法:

template<class T> 
const List<T> *get_start_ptr() const 
{ 
    return (start_ptr); 
} 

,然後添加public方法移動,如:

template<class T> 
const List<T> *next() const 
{ 
    return (next); 
} 

的訪問返回值作爲常量,以確保它們在此過程中不被非自願地修改。即使你明顯沒有在你的代碼中修改它,但是儘可能地使用const也是一個好習慣,並且當你真正想要修改一個值的時候是明確的。

+1

您需要一個參考'List &NewList'作爲參數,否則當函數體超出作用域時,串聯將最終被丟棄。 – ondrejdee

+0

那我得到的班級成員的錯誤是什麼(它說他們是私人的)。 –

+0

你使用std :: list嗎?或者是列出你自己的? – doctorlove