0

我正在尝试创建一个包含另一个链接列表的列表,然后我想将它们连接到一个列表中。我对此有一些困难。所以首先我做这个: typedef List DList; - 它制作了一种链表;然后例如我制作 DList A 和 B。我在它们两个中都插入了一些数字,例如 1,2,3...;然后我将它们添加到主链表中,如下所示:

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

在程序的这个阶段,一切似乎都很好。在此之后,我试图创建一个函数来连接单独的链接列表。我创建了一个新的List 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 是私有的(这是真的)。它给了我更多的错误。我正在学习的书中写了这样的内容,但是那里很复杂...如果您不想花时间帮助我,我什至会感激不尽如果你给我一个很好的来源,我可以从中阅读更多关于这种类型的列表。

4

1 回答 1

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,并在您实际想要修改值时明确说明。

于 2013-07-02T16:14:06.653 回答