C++ 双链表中的删除

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-

每当我调用这个函数时,我的程序就会崩溃。我调试了它,这是因为行的开始=开始->下一步;还是不知道我哪里出错了。Mystart是节点的全局指针

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