繁体   English   中英

在C ++中的链接列表中的任意位置插入/删除

[英]Insert/Delete Anywhere in a Linked List in C++

我学习C ++已有一段时间了,最​​近才开始查看链接列表。 我可以使用从后/前插入/删除常用功能构造一个模板类List。 现在我想出了一个练习,要求我编写一个函数来处理列表中任何位置的插入/删除。

请记住,我的问题是非常基本的。

我的问题是我认为这个问题模棱两可。 该功能需要什么样的信息? 例如,对于删除,我可以提出几个候选对象:1)删除具有特定值(参数:值)的第一个节点2)删除具有特定值(参数:值)的所有节点3)删除特定节点(参数:指向该节点的指针)1)和2)我可以轻松编写代码。 3)比较难,但我也可以做到。 我只是看不到3)中的要点。 使用列表时,通常会操纵节点(在列表定义之外)吗? 像这样,使用列表的程序通常实际操作指向节点的指针吗?

在此设置中“删除任何地方”的通常含义是什么?

同样,对于“在任何地方插入”,措辞很奇怪。 “任何地方”是什么意思? 链表中的位置是否应该由特定节点指定?

在链接列表中,您可以恒定时间访问第一个元素。 因此,在任何地方删除/插入都意味着第一个元素与最后一个元素之间存在的位置。 基本上,您需要有2个迭代器。 当找到要删除/插入元素的位置时,应在该对象之前引用该对象。 因为您无权访问prev元素,而只能访问下一个元素:假设我们的链接列表如下所示:
E0-> E1-> E2-> E3-> E4

如果要删除E3,则需要在E2上设置迭代器,以便可以更正E2-> next的指针。

很好的参考书是Nicolai M. Josuttis撰写的Standard Library一书。 您所遇到的问题在此处得到了广泛描述。

node*insert(node*head,int d){

    node*temp=new node;
    temp->data=d;
    if(head==NULL){
        temp->next=NULL;
        head=temp;}
    else 
         {node*curr=head,*pre=NULL;
    while (curr!=NULL && curr->data<temp->data)
    {
        pre=curr;
        curr=curr->next;
    }
    temp->next=curr;
    if(pre==NULL)
        head=temp;
    pre->next=temp;
    }
    return head;
}

暂无
暂无

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

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