C++ 使用链接列表A和B的公共元素创建链接列表C++;

C++ 使用链接列表A和B的公共元素创建链接列表C++;,c++,linked-list,C++,Linked List,顾名思义。我需要采取2个链表,并创建第三个列表的共同元素只有前2个链表 这是我写的函数 void computeC(DLL<int> &a, DLL<int> &b, DLL<int> &c) { Node<int> *hunterA, *hunterB; hunterA = a.getHead(); hunterB = b.getHead(); while ( hunterA != NULL

顾名思义。我需要采取2个链表,并创建第三个列表的共同元素只有前2个链表

这是我写的函数

void computeC(DLL<int> &a, DLL<int> &b, DLL<int> &c)
{
    Node<int> *hunterA, *hunterB;
    hunterA = a.getHead();
    hunterB = b.getHead();


  while ( hunterA != NULL )
    {
        while ( hunterB != NULL )
        {
            int aData = hunterA->data, bData = hunterB->data;

            if ( aData == bData )
            {
                    int temp = bData;
                c.progAppend2(temp);
            }
            else
            {
                hunterB = hunterB->next;
            }   
        }
        hunterA = hunterA->next;
    }
    c.output();
}
void computeC(DLL&a、DLL&b、DLL&c)
{
节点*hunterA,*hunterB;
亨特拉=a.getHead();
hunterB=b.getHead();
while(hunterA!=NULL)
{
while(hunterB!=NULL)
{
int aData=hunterA->data,bData=hunterB->data;
如果(aData==bData)
{
int temp=bData;
c、 程序2(温度);
}
其他的
{
亨特布=亨特布->下一步;
}   
}
亨特拉=亨特拉->下一步;
}
c、 输出();
}
下面是我的双链表类中的progAppend2()函数

template <class Type>
void DLL<Type>::progAppend2(Type data)
{
    Node<Type> *newNode = new Node<Type>;
    newNode->data = data;

    if ( head == NULL )
    {
        head = newNode;
        tail = newNode;
        size++;
    }

    else
    {
         tail->next = newNode;
        newNode->prev = tail;
        tail = tail->next;
        size++;
    }
}
模板
无效DLL::progAppend2(类型数据)
{
Node*newNode=新节点;
新建节点->数据=数据;
if(head==NULL)
{
头=新节点;
tail=newNode;
大小++;
}
其他的
{
tail->next=newNode;
newNode->prev=尾部;
tail=tail->next;
大小++;
}
}
这里是main()

int main(无效)
{   
int a[9]={3,7,10,15,16,9,22,17,32};
int b[9]={16,2,9,13,37,8,10,1,28};
DLL listA、listB、listC、listD;
对于(int i=0;i<9;i++)
{
清单a.2(a[i]);
清单b.2(b[i]);
}
computeC(listA、listB、listC);
输出();
返回0;
}
我遇到的问题是,由于某种原因,在调用output()时,ListC没有被任何东西填充,只有output和空列表


我认为问题在于computeC函数。外部while循环应该将hunterA设置为指向ListA中的一个元素,内部循环应该将listB的每个元素与hunterA所指向的元素进行比较。如果找到匹配项,则该元素将复制到ListC中。至少我认为它应该是这样工作的。非常感谢您的帮助。

每次检查a中的新节点时,都需要再次查看B中的所有节点。例如,如果A中的第一个节点与B中的任何元素都不匹配(如输入中),则指针将移动到B的末尾。因此,在通过A的while循环中,将B指针重置为B列表的开头


注意:如果a和b中的节点匹配,那么您也会进入一个无限循环,因为您无法在if-then语句中断开或移动b指针。

我认为@a.E.Drew给您的建议是正确的

我只想补充一点,你的解决方案是时间复杂度O(长度(A)*长度(B)),更好的解决方案是O(长度(A)+长度(B))。您可以散列所有A-list节点,然后迭代B-list以查找A-list中是否有任何B-node

希望这也有帮助:)

可能会重复
int main (void)
{   
    int a[9] = {3,7,10,15,16,9,22,17,32};
    int b[9] = {16,2,9,13,37,8,10,1,28};
    DLL<int> listA, listB, listC, listD;
    for ( int i = 0; i < 9; i++ )
    {
        listA.progAppend2(a[i]);
        listB.progAppend2(b[i]);
    }
    computeC(listA,listB,listC);
    listC.output();

    return 0;
}