Вот какой код:
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;
}
}
Я не понимаю, почему удаление элемента из списка не работает. Любая помощь будет очень оценена.
Небольшой намек: возьмите бумагу и карандаш и нарисуйте несколько коробок и стрелок и имитируйте то, что вы делаете: когда вы нашли элемент, который нужно удалить, вы просто удалите элемент, но не приспособите next
указатель предыдущего элемента, а также голову или хвост указатель. Таким образом, после удаления есть элемент, который имеет next
указатель, указывающий на недопустимую ячейку памяти (так называемый висячий указатель). То, что вы хотите сделать, - добавить дополнительный указатель на предыдущий элемент, чтобы адаптировать его next
указатель.
Вы забыли переназначить 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;
}
}
}
head
и tail
если первый или последний элемент удален (особенно, если пустой список создается путем удаления последнего элемента).
Удаление элемента из списка не работает, потому что функция неверна. Вы не принимаете во внимание, является ли удаленный элемент головкой или хвостом списка, и вы не устанавливаете поле рядом с предыдущим элементом.
Попробуйте следующий код
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;
}
}
вам также нужно сохранить предыдущий элемент и установить его рядом с q-> рядом с тем, что вы уже делаете