我一直在学习C ++,最近才开始查看链接列表。我可以使用通常的函数insert / remove从后面/前面构造一个模板类List。现在我想出了一个练习,要求我编写一个函数来处理列表中任何位置的插入/删除。
请记住,我的问题非常基本。
我遇到的问题是我认为这个问题含糊不清。该功能需要什么样的信息?例如,为了删除,我可以提出几个候选人: 1)删除具有特定值的第一个节点(参数:value) 2)删除具有特定值的所有节点(参数:value) 3)删除特定节点(参数:指向该节点的指针) 1)和2)我可以轻松编码。 3)更难,但我也可以做到。我只是没有看到3)中的重点。使用列表时是否通常操作节点(列表定义之外)?对于使用列表的程序实际操作指向节点的指针通常是否正常?
"删除任何地方"的通常含义是什么?在这个环境中?
同样,对于"在任何地方插入",措辞很奇怪。什么,#34;任何地方"意思?链表中的位置应该由特定节点给出吗?
答案 0 :(得分:1)
在链表中,您可以持续访问第一个元素。所以删除/插入任何地方意味着第一个和最后一个元素之间存在的位置。基本上你需要有2个迭代器。当您找到要删除/插入元素的位置时,应该引用它之前的对象。因为您无法访问prev元素,只能访问下一个元素:
让我们说我们的链表如下:
E0-> E1-> E2-> E3-> E4
如果你想删除E3,你需要在E2上设置迭代器,以便你可以纠正E2-> next的指针。
很好的参考资料是Nicolai M. Josuttis撰写的标准图书馆。你遇到的问题在那里被广泛描述。
答案 1 :(得分:0)
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;
}