C++ 双链表中的删除
每当我调用这个函数时,我的程序就会崩溃。我调试了它,这是因为行的开始=开始->下一步;还是不知道我哪里出错了。Mystart是节点的全局指针C++ 双链表中的删除,c++,pointers,doubly-linked-list,C++,Pointers,Doubly Linked List,每当我调用这个函数时,我的程序就会崩溃。我调试了它,这是因为行的开始=开始->下一步;还是不知道我哪里出错了。Mystart是节点的全局指针 void double_llist::delete_element(string value) { node *tmp, *q; //first element if (start->info == value) { tmp = start; start = 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;
}
void double\u llist::delete\u元素(字符串值)
{
节点*tmp,*q;
//第一要素
如果(开始->信息==值)
{
tmp=启动;
开始=开始->下一步;
开始->上一个=空;
coutinfo==值)
{
tmp=q->next;
q->next=tmp->next;
tmp->next->prev=q;
coutnext;
删除tmp;
q->next=NULL;
cout看来您的问题可能是:
if (start->info == value)
{
tmp = start;
start = start->next;
start->prev = NULL; // This line !!!!!
cout<<"Element Deleted"<<endl;
delete tmp;
return;
}
顺便说一句:我假设这是一种家庭作业。如果不是这样,那么就停止制作自己的链表!使用标准容器之一,例如vector、list、deque。您的函数太复杂,无法检查节点是否等于NULL
例如,一般来说,start
可以等于NULL,或者start->next
可以等于NULL,依此类推
<> P>从函数考虑这个代码片段就足够了。
if (start->info == value)
{
tmp = start;
start = start->next;
start->prev = NULL;
cout<<"Element Deleted"<<endl;
delete tmp;
return;
}
还是这句话
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;
}
}
void double\u llist::delete\u元素(std::string值)
{
节点*当前=开始;
而(当前和当前->信息!=值)当前=当前->下一步;
如果(当前)
{
如果(!当前->上一个)
{
开始=当前->下一步;
}
其他的
{
当前->上一个->下一个=当前->下一个;
}
如果(!当前->下一步)
{
//结束=当前->上一个;
}
其他的
{
当前->下一个->上一个=当前->上一个;
}
删除当前文件;
}
其他的
{
std::cout从代码中不清楚列表是否也支持尾部节点,还是只支持开始节点。谢谢。这是一个简单的错误,没有将我的开始值等于NULL。@AhsanAsif根本没有。:)是的,这是一个没有向量的家庭作业。
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;
}
}