Как удалить элемент из списка?

0

Вот какой код:

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;
    }
}

Я не понимаю, почему удаление элемента из списка не работает. Любая помощь будет очень оценена.

  • 0
    Не могли бы вы уточнить «не работает», пожалуйста?
  • 0
    эта функция удаления не выполняет свою работу.
Показать ещё 4 комментария
Теги:
list
pointers
delete-operator

4 ответа

4

Небольшой намек: возьмите бумагу и карандаш и нарисуйте несколько коробок и стрелок и имитируйте то, что вы делаете: когда вы нашли элемент, который нужно удалить, вы просто удалите элемент, но не приспособите next указатель предыдущего элемента, а также голову или хвост указатель. Таким образом, после удаления есть элемент, который имеет next указатель, указывающий на недопустимую ячейку памяти (так называемый висячий указатель). То, что вы хотите сделать, - добавить дополнительный указатель на предыдущий элемент, чтобы адаптировать его next указатель.

  • 0
    лучший способ понять его код. Я считаю, что он должен был сделать это сначала, а затем сделать код
3

Вы забыли переназначить next указатель предыдущего элемента предыдущего элемента на удаленный элемент next указателем. Редактирование: вы также забыли обработать указатели на head и tail, как я и делал вначале.

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;
        }
    }
}
  • 0
    Это, по крайней мере, удаляет элемент правильно. Но он все еще должен проверить указатель head и tail если первый или последний элемент удален (особенно, если пустой список создается путем удаления последнего элемента).
  • 0
    хорошая точка зрения. будет редактировать
Показать ещё 2 комментария
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;
    } 
}
0

вам также нужно сохранить предыдущий элемент и установить его рядом с q-> рядом с тем, что вы уже делаете

Ещё вопросы

Сообщество Overcoder
Наверх
Меню