在双向链表中删除

时间:2015-11-18 17:33:11

标签: c++ pointers doubly-linked-list

每当我调用此函数时,我的程序崩溃了。我调试了它,这是因为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;
 }

2 个答案:

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

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