联盟的两个链表

时间:2013-11-22 03:36:58

标签: c++

我正在尝试为两个链接列表的联合开发友元函数。编译器一直给我一个错误,说明Node未在此范围内声明,以及p,q未在此范围内声明。所以我添加了List :: Node,但它还没有执行联合

   const List getunion(const List&a, const List&b) {

      List::Node * p=a.list;
      List::Node* q=b.list;
      List result;

      while (q!=NULL && p!=NULL) {

         if(q->value==p->value) {
           result.insert(q->value);
           q=q->next;
           p=p->next;
         }
        q=q->next;
           p=p->next;
     }
      return result;
  }

  void insert(int x) {
    Node* tmp=new Node;
    tmp->value=x;

   if(list==NULL || list->value >x){
     tmp->next=list;
     list=tmp;
   } 

   else {
    Node *curr=list;
     while (curr->next !=NULL && curr->next->value < x) {
          curr=curr->next;
     }

   tmp->next=curr->next;
   curr->next=tmp;
}

注意我的插入函数按升序添加节点,我已经尝试过它并且它确实适用于测试用例,当我实现union函数时,事情会误入歧途......

2 个答案:

答案 0 :(得分:1)

我认为你修复了编译错误,现在你想知道它为什么不起作用。

您没有正确合并这两个列表。问题是:

  1. 只有在两个列表中都插入一个项目 - 即交集,而不是 union

  2. 你正在同时推进这两个指针。

  3. 您需要合并其中一个:

    while ( q && p ) {
        if( q->value < p->value ) {
            result.insert(q->value);
            q = q->next;
        } else if( q->value > p->value ) {
            result.insert(p->value);
            p = p->next;
        } else {
            result.insert(q->value);
            q = q->next;
            p = p->next;
        }
     }
    

    现在,一旦这些列表指针中的任何一个到达结尾,您仍然需要添加其他元素。这样就可以了:

    for(; q; q = q->next) result.insert(q->value);
    for(; p; p = p->next) result.insert(p->value);
    

    另请确保您已为List定义了复制构造函数。看起来你在那里做自己的内存分配,所以你必须遵循三法则。

答案 1 :(得分:0)

首先,我不确定您的代码是打算做什么的。 您似乎期望输入是2个列表,您可以并行执行,如果相应的值匹配,则构建第三个列表。 这更像是一个交汇点而不是一个联盟,因为它更关心位置。

插入似乎是一个已排序的插入。

无论如何,这部分肯定是错的:

  

if(q-&gt; value == p-&gt; value){              result.insert(Q-&GT;值);              Q = Q-&gt;接着,              P =对 - &gt;接着,            }

删除这些q = q-&gt; next和p = p-&gt; next。 这些导致了双重步骤,因为它在if语句内部和外部完成。

双重步进是不好的,因为它可能会超过列表的末尾,导致崩溃。