繁体   English   中英

删除双向链接列表中的项目

[英]deleting an item in Doubly-linked list

我的程序应该执行3个操作:1.插入2.删除3.使用双向链接列表显示...我的删除功能有问题。 这是代码:

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

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

应用崩溃窗口

我的代码有什么问题? ;-?

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

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

问题部分是以下部分:

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

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

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

首先,您的字段名称有点奇怪。 通常,双向链接列表分别具有针对上一个元素和下一个元素的上一个和下一个指针。

其次,您实际上并不计算项目,而是依靠它们的信息字段。 但是您永远不会更新此字段,因此一段时间后,此ID将变得毫无意义且零碎。

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

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

现在调用delete(2):

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

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

NodePayload* delete(Node* node)

然后,这将删除适当的节点,并有选择地返回指向实际删除的节点/或其有效负载的指针。 因为通常出于内存管理的原因,您的List类可能会分配Node,而不分配其有效载荷,因此用户可以将List与分配的自定义有效载荷一起使用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM