链接列表保留功能不起作用

时间:2015-07-02 18:30:26

标签: c++ linked-list

这是数据结构课程的旧任务。目标是完成保留函数,其功能如下: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 

任何想法?这是我第一次发帖,所以欢迎任何反馈,并提前感谢!

2 个答案:

答案 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;信息);