C++ 链表保留功能不工作
这是一个关于数据结构课程的旧作业。目标是完成retain函数,其工作原理如下:listy.retain(listx),结果是删除listy中不包含在listx中的元素 我试着写我自己的代码如下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
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
。ntremove(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。完全被误解了。我应该仔细阅读这篇文章。