这是数据结构课程的旧任务。目标是完成保留函数,其功能如下: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;
}
}
此外,使用的删除功能在作业的一部分中提供。
template<class Type>
void linkedList<Type>::remove(const Type& x)
{ //remove the first instance of x in the list
node<Type> *p, *q;
p = first;
q = NULL;
while (p != NULL && p->info != x)
{
q = p;
p = p->link;
}
if (p != NULL)
{
if (p == first)
first = first->link;
else
q->link = p->link;
if (p == last)
last = q;
delete p;
count--;
}
}
它构建没有错误,但最初它应该显示新的listy但现在它在初始条件之后完全停止输出。
**** Part-1 unordered linkedList ****
-- Test 1A --
listx (len = 7) : 5 3 7 7 5 4 3
listy (len = 7) : 2 8 4 7 3 1 9
任何想法?这是我第一次发帖,所以欢迎任何反馈,并提前感谢!
答案 0 :(得分:1)
函数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);
应该替换为
if(x == NULL)
remove(y->info);
但无论如何最好删除函数保留范围内的节点,而不是单独调用函数remove。
这句话
y = y->link;
如果前一次调用函数remove将删除节点y,则会导致未定义的行为。
至少内循环应该看起来像
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;
}
此外,您应该检查除外节点是否是节点first
。否则节点first
可能无效。
答案 1 :(得分:0)
我相信这一点 if(x == NULL) 除去(X-&GT;信息); 应该 if(x!= NULL) 除去(X-&GT;信息);