删除双向链表中的项目

时间:2013-12-12 14:54:10

标签: c++ doubly-linked-list

我的程序应该执行3个操作:1.insert 2.delete 3.show使用双向链接列表...我在删除功能方面有问题。这是代码:

void List::del()
{
    int num;
    Node *Aux1=first;
    Node *Aux2=NULL;
    if(isempty())
        cout<<"List is Empty!"<<endl;

    else
    {
        cout<<"Enter the number that you want to DELETE:"<<endl;
        cin>>num;
        while(Aux1->info!=num && Aux1 != NULL)
        {
            Aux2=Aux1;
            Aux1=Aux1->left;
        }
        if(Aux1!=NULL)
        {
            if(Aux2!=NULL)
            {
                if(Aux1->left==NULL)
                    Aux2->left=NULL;
                else
                {
                Aux2->left=Aux1->left;
                Aux1=Aux1->left;
                Aux1->right=Aux2;
                }
            }
            else
            {
                first=Aux1->left;
                //first->right=NULL;
            }
        }
        system("pause");
    }
}

在删除功能中,我想找到用户想要删除的号码,然后将其从列表中删除...问题是当用户输入列表中不存在的号码时!!在这种情况下,我希望我的程序不要在列表上做任何事情,也不要从列表中删除任何项目。但是当它发生时,我遇到了这个错误:

App Crash Window

我的代码出了什么问题? ; - ?

2 个答案:

答案 0 :(得分:1)

您的while循环在检查NULL指针是否为NULL之前取消引用该NULL指针。您需要将循环更改为:

while(Aux1 != NULL && Aux1->info!=num)

答案 1 :(得分:0)

有问题的部分是以下部分:

    while(Aux1->info!=num && Aux1 != NULL)
    {
        Aux2=Aux1;
        Aux1=Aux1->left;
    }

在检查Aux1是否为NULL之前取消引用。因此,您将在此循环中获得分段错误。

但是,您的数据结构存在更严重的问题。

首先,你的字段名称有点奇怪。通常,双向链表分别具有上一个和后一个元素的prev和next指针。

其次,您实际上并不计算项目,而是依赖于他们的信息字段。但是你永远不会更新这个字段,所以过了一段时间,这个ID将变得毫无意义和碎片化。

考虑用户输入五个节点的情况:

0 --> 1 --> 2 --> 3 --> 4

现在你调用delete(2):

0 --> 1 --> 3 --> 4

现在,您的用户必须获取所有ID并选择正确的ID,在这种情况下您的分段错误将会发生 - 如果用户再次调用delete(2),现在会发生什么? 通常,人们不会通过魔术ID号删除节点,而是使用一个函数来获取指向需要删除的节点的指针。

NodePayload* delete(Node* node)

然后,这将删除相应的节点,并可选地返回指向实际删除的节点/或其有效负载的指针。因为通常出于内存管理的原因,List类可能会分配节点,但不能分配它们的有效负载,因此用户可以使用List及其分配的自定义有效负载。