每当我调用此函数时,我的程序崩溃了。我调试了它,这是因为start = start-> next行;仍然无法判断我哪里出错了。我的 start 是节点的全局指针。
void double_llist::delete_element(string value)
{
node *tmp, *q;
//first element
if (start->info == value)
{
tmp = start;
start = start->next;
start->prev = NULL;
cout<<"Element Deleted"<<endl;
delete tmp;
return;
}
q = start;
while (q->next->next != NULL)
{
//nth element
if (q->next->info == value)
{
tmp = q->next;
q->next = tmp->next;
tmp->next->prev = q;
cout<<"Element Deleted"<<endl;
delete tmp;
return;
}
q = q->next;
}
//last element
if (q->next->info == value)
{
tmp = q->next;
delete tmp;
q->next = NULL;
cout<<"Element Deleted"<<endl;
return;
}
cout<<"Element "<<value<<" not found"<<endl;
}
答案 0 :(得分:0)
似乎你的问题可能是:
if (start->info == value)
{
tmp = start;
start = start->next;
start->prev = NULL; // This line !!!!!
cout<<"Element Deleted"<<endl;
delete tmp;
return;
}
在使用start之前,您需要检查四个nullptr
。
也许这会有所帮助:
void double_llist::delete_element(string value)
{
if (start == NULL) return; // New line
node *tmp, *q;
//first element
if (start->info == value)
{
tmp = start;
start = start->next;
if (start != NULL) // New line
{
start->prev = NULL;
}
cout<<"Element Deleted"<<endl;
delete tmp;
return;
}
q = start;
while (q->next->next != NULL)
{
//nth element
if (q->next->info == value)
{
tmp = q->next;
q->next = tmp->next;
tmp->next->prev = q;
cout<<"Element Deleted"<<endl;
delete tmp;
return;
}
q = q->next;
}
//last element
if (q->next->info == value)
{
tmp = q->next;
delete tmp;
q->next = NULL;
cout<<"Element Deleted"<<endl;
return;
}
cout<<"Element "<<value<<" not found"<<endl;
}
顺便说一句:我认为这是某种功课。如果不是那么停止制作自己的链表!使用其中一个标准容器,例如矢量,列表,deque,而不是。
答案 1 :(得分:0)
您的函数太复杂,并且不检查节点是否等于NULL。
例如,通常start
可以等于NULL或start->next
可以等于NULL等等。
从您的函数
中考虑此代码段就足够了 if (start->info == value)
{
tmp = start;
start = start->next;
start->prev = NULL;
cout<<"Element Deleted"<<endl;
delete tmp;
return;
}
首先start
可以等于NULL。所以这句话
if (start->info == value)
或本声明
start = start->next;
已经错了。
或start->next
可以等于NULL。在这种情况下,下面的陈述中的第二个陈述
start = start->next;
start->prev = NULL;
也错了。
考虑到通常双链表支持指向尾(或结束)节点的指针。
可以更简单地编写函数。
例如
void double_llist::delete_element( std::string value )
{
node *current = start;
while ( current && current->info != value ) current = current->next;
if ( current )
{
if ( !current->prev )
{
start = current->next;
}
else
{
current->prev->next = current->next;
}
if ( !current->next )
{
// end = current->prev;
}
else
{
current->next->prev = current->prev;
}
delete current;
}
else
{
std::cout << "Element " << value << " not found" << std::endl;
}
}
在这个程序中,我评论了一个声明,如果你的列表支持指向列表最后一个节点的指针,你应该取消注释。