2013-07-02 140 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