链表保留函数不起作用

Linked List Retain Function Not Working

本文关键字:不起作用 函数 保留 链表      更新时间:2023-10-16

这是数据结构课程上的一项旧作业。目标是完成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(;