Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/148.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 两个链表的并集_C++ - Fatal编程技术网

C++ 两个链表的并集

C++ 两个链表的并集,c++,C++,我正在尝试为两个链接列表的并集开发一个friend函数。编译器不断给我一个错误,说节点未在此范围内声明,以及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!=N

我正在尝试为两个链接列表的并集开发一个friend函数。编译器不断给我一个错误,说节点未在此范围内声明,以及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;
}
const List getunion(const List&a、const List&b){
List::Node*p=a.List;
列表::节点*q=b.List;
列出结果;
while(q!=NULL&&p!=NULL){
如果(q->value==p->value){
结果.插入(q->值);
q=q->next;
p=p->next;
}
q=q->next;
p=p->next;
}
返回结果;
}
空白插入(整数x){
Node*tmp=新节点;
tmp->value=x;
if(list==NULL | | list->value>x){
tmp->next=列表;
列表=tmp;
} 
否则{
节点*curr=列表;
while(curr->next!=NULL&&curr->next->value下一步;
}
tmp->next=当前->next;
当前->下一步=tmp;
}

请注意,我的insert函数按升序添加节点,我已经尝试过了,它在测试用例中也能工作,当我实现union函数时,事情就误入歧途了…

我认为您修复了编译错误,现在您想知道为什么它不工作了

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

  • 只有在两个列表中都有项目时,才可以插入该项目-这是交集,而不是并集

  • 您正在同时推进两个指针

  • 您需要合并其中一个:

    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;
        }
     }
    

    另外,请确保您已经为
    列表定义了一个复制构造函数。看起来您正在其中进行自己的内存分配,因此必须遵循三个规则。

    首先,我不确定您编写的代码打算做什么。 似乎您希望输入是两个列表,您可以并行地逐步遍历它们,如果相应的值匹配,则构建第三个列表。 这更像是一个十字路口,而不是一个联盟,尽管它比这更严酷,因为它关心的是位置

    插入内容似乎是已排序的插入内容

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

    如果(q->value==p->value){ 结果.插入(q->值); q=q->next; p=p->next; }

    删除这些q=q->next和p=p->next。 这导致了一个双重步骤,因为它是在if语句内部和外部完成的


    双击是不好的,因为它会让你越过列表的末尾,导致崩溃。

    union
    在C++oops中是一个保留字,它实际上是getunion,节点是如何声明的?@kotlinski请参阅edit,现在我在list::中添加了这个函数,但实际的函数仍然没有将它们联合起来,因为我希望下次发布整个类时使用它。没有任何一个函数会这样做o偷你的
    名单
    班,注意安全。是的,我把他们弄糊涂了。谢谢
    for(; q; q = q->next) result.insert(q->value);
    for(; p; p = p->next) result.insert(p->value);