我正在尝试创建一个包含另一个链表的List,然后我想将它们连接成一个列表。我有一些困难。所以首先我做到这一点: typedef列表DList; - 它是一种链表; 然后例如我制作DList A和B.我在两者中插入一些数字,如1,2,3 ......; 然后我将它们添加到主链表中,如:
List<DList> L;
L.Add_Node(A);
L.Add_Node(B);
在这个项目的这个阶段,一切似乎都很好。在此之后,我正在尝试创建一个连接separete链接列表的函数。我创建了一个新的列表NewList ,其中将存储值。这就是我的问题。我不知道怎么写这个函数。 我做了这样的事情:首先我创建一个函数来循环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,data和next都是私有的(而且它是真的)。它给了我更多的错误..这样的东西写在我正在学习的书中,但它在那里很复杂......如果你不想花时间帮助我,我会感激甚至如果你给我一个很好的资料来源,我可以从中了解更多关于这种类型的列表。
答案 0 :(得分:0)
在你的函数开始中,你将经历两个类型为T.的列表。
但是,当您在Concat
方法中连接两个列表时,您将整个列表与另一个列表的值连接在一起。
此外,您通过副本传递参数,这可能不是您想要做的事情。
我认为你的意思是这样的:
void Start(List< List <T> > & L, List<T> &NewList)
通过复制传递意味着您的程序将参数的副本发送到您的函数。 这意味着您传递的列表将被复制(如果您的列表很大,则可能非常繁重),并且仅复制将被修改。
在我给你的Start函数的新版本中,你可以注意到我添加了&
。这意味着该值通过引用传递。基本上,这意味着它实际上是您正在使用的对象,而不是副本。
最后,关于私有成员,你应该添加公共访问者,以便它们可以在你的课外使用。
在您的情况下,您可以在班级中添加公共方法:
template<class T>
const List<T> *get_start_ptr() const
{
return (start_ptr);
}
然后添加要移动的公共方法,例如:
template<class T>
const List<T> *next() const
{
return (next);
}
访问器将值返回为const,以确保在此过程中不会无意识地修改它们。即使您显然没有在代码中修改它,最好尽可能多地使用constness,并在实际想要修改值时明确。