C++ 链表保留功能不工作

C++ 链表保留功能不工作,c++,linked-list,C++,Linked List,这是一个关于数据结构课程的旧作业。目标是完成retain函数,其工作原理如下:listy.retain(listx),结果是删除listy中不包含在listx中的元素 我试着写我自己的代码如下 template<class Type> void linkedList<Type>::retain(const linkedList<Type>& other) { // Implement this function node<Typ

这是一个关于数据结构课程的旧作业。目标是完成retain函数,其工作原理如下:listy.retain(listx),结果是删除listy中不包含在listx中的元素

我试着写我自己的代码如下

template<class Type>
void linkedList<Type>::retain(const linkedList<Type>& other) 
{
    // Implement this function
    node<Type>* y = first;
    node<Type>* x;

    while(y != NULL)
    {
        x = other.first;

        while(x != NULL)
        {
            if(x->info == y->info)
                break;
        }
        if(x == NULL)
            remove(x->info);
        y = y->link;
    }
}
有什么想法吗??这是我第一次发帖,欢迎任何反馈,提前感谢

我相信 如果(x==NULL) 删除(x->info); 应该是 如果(x!=NULL)
删除(x->info)

函数
retain
有一个无限循环

    x = other.first;

    while(x != NULL)
    {
        if(x->info == y->info)
            break;
    }
如果第一个
x->info!=y->info
当循环对同一节点重复相同的迭代时,
x
因为
x
未被更改

这句话呢

    if(x == NULL)
        remove(x->info);
    y = y->link;
应替换为

    if(x == NULL)
        remove(y->info);
但在任何情况下,移除函数retain中的节点都比单独调用函数remove要好

这句话呢

    if(x == NULL)
        remove(x->info);
    y = y->link;
如果节点y将被前面的函数remove调用删除,则可能导致未定义的行为

至少内部循环应该是这样的

x = other.first;

while( x != NULL && x->info != y->info ) x = x->link;

if ( x == NULL )
{
    node<Type>* tmp = y->link;
    remove( y->info );
    y = tmp;
}
else
{
    y = y->link;
}
x=other.first;
而(x!=NULL&&x->info!=y->info)x=x->link;
如果(x==NULL)
{
节点*tmp=y->link;
删除(y->info);
y=tmp;
}
其他的
{
y=y->链接;
}

此外,您还应检查删除节点是否为第一个节点。否则节点
第一个
可能无效。

时,您没有在内部
中迭代
x
。nt
remove(x->info)
是否等同于
remove(y->info)
?@gaurav sehgal x->info是列表中必须存在的值。是否
y->info
等于
x->info
。调用
remove(y->info)
将从列表
y
中删除一个值为
y->info
的节点。因此,调用
remove(x->info)
将执行相同的操作,只要
y->info=x->info
@gaurav sehgal根据您必须删除不在第二个列表中的节点的分配。如果x->info等于y->info,则表示您正在删除一个有效的节点。My appologies。完全被误解了。我应该仔细阅读这篇文章。