这是数据结构课程上的一项旧作业。目标是完成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;
}
}
此外,所使用的remove函数在赋值的一部分中提供。
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
有什么想法吗??这是我第一次发帖,所以欢迎任何反馈,并提前感谢!
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);
但在任何情况下,移除函数retain中的节点都比单独调用函数remove要好。
这个声明
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;
}
此外,您还应该检查交付节点是否为节点first
。否则,节点first
可能无效。
我相信if(x==NULL(删除(x->info(;应该是if(x!=NULL(删除(x->info(;