如何从列表中删除元素?

时间:2014-02-15 15:40:39

标签: c++ c list pointers delete-operator

以下是一些代码:

typedef struct n
{
    int value;
    struct n *next;
}ELEMENT;

typedef struct
{
    ELEMENT *head;
    ELEMENT *tail;
}INFO;

这是一个不起作用的功能:

void LIST::remove(int x)
{
ELEMENT *q = inf.head;

    while(q!=NULL)
    {
        if((q->value)==x)
        {
            ELEMENT * temp = q;
            q = q->next;
            delete temp;
            break;

        }
        else
            q=q->next;
    }
}

我不明白为什么从列表中删除元素不起作用。任何帮助将非常感激。

4 个答案:

答案 0 :(得分:4)

小提示:拿一些纸和铅笔绘制一些方框和箭头并模拟你正在做的事情:当你找到应删除的项目时,你只需要删除该元素,但不要调整next指针。前一项也不是头或尾指针。因此,在deletation之后,有一个元素具有next指针,指向无效的内存位置(所谓的悬空指针)。你想要做的是有一个指向前一项的附加指针来调整它的next指针。

答案 1 :(得分:3)

您忘记将已删除节点的前一个元素的next指针重新分配给已删除元素的next指针。编辑:您也忘了处理headtail指针,就像我最初做的那样。

void LIST::remove(int x)
{
    ELEMENT *q = inf.head;
    ELEMENT prev = NULL;

    while(q != NULL)
    {
        if(q->value == x)
        {
            if (q == inf.head)
                inf.head = q->next;
            else
                prev->next = q->next;
            if (q == inf.tail)
                inf.tail = prev;
            delete q;
            break;

        }
        else
        {
            prev = q;
            q=q->next;
        }
    }
}

答案 2 :(得分:0)

你也需要保留上一个元素,然后将其设置为q->接下来你已经做了什么

答案 3 :(得分:0)

从列表中删除元素不起作用,因为函数错误。您不会考虑被删除的元素是否是列表的头部或尾部,并且您没有在前一个元素的旁边设置字段。

尝试以下代码

void LIST::remove(int x)
{
   ELEMENT *p = NULL;
   ELEMENT *q = inf.head;

    while ( q != NULL && q->value != x )
    {
        p = q;
        q = q->next;
    }

    if ( q )
    {
        if ( p == NULL )
        {
            inf.head = NULL;
        }
        else
        {
            p->next = q->next;
        }

        if (  inf.tail == q )
        {
            inf.tail = p;
        }

        delete q;
    } 
}