双向链表删除

deletion in doubly linked list

每当我调用这个函数时,我的程序就会崩溃。我调试了一下,是因为start=start->next;这一行。仍然无法弄清楚我哪里出错了。我的start是node的全局指针

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

看来您的问题可能是:

if (start->info == value)
{
    tmp = start;
    start = start->next;
    start->prev = NULL;  // This line !!!!!
    cout<<"Element Deleted"<<endl;
    delete tmp;
    return;
}

使用开始前需要检查四个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;
 }

顺便说一句:我认为这是某种家庭作业。如果不是,请停止制作您自己的链表!使用标准容器之一,例如向量,列表,双端队列,而不是。

你的函数太复杂了,没有检查节点是否等于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;
    }
}                 

在这个程序中,我评论了一个声明,如果你的列表支持指向列表最后一个节点的指针,你应该取消注释。