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