我遇到了很多链表函数和C函数,它们打算传递双指针代替单个指向函数的指针。例如,这个函数用于链表中的排序插入:
void sortedinsert(struct node **headref,struct node *newnode)
{
while(*headref!=NULL&&(*headref)->data<newnode->data)
headref=&((*headref)->next);
newnode->next=headref;
*headref=newnode;
}
请解释一下使用双指针作为函数参数来代替单指针,以及如何轻松地为链表创建函数?
答案 0 :(得分:2)
这个“双指针”是指向指针的指针。它允许调用者的指针副本在更新列表的头项时由sortedinsert
函数更新。
行*headref=newnode;
更新调用者的指针以指向newnode
。 (顺便说一句,我认为代码是有问题的。看起来headref
始终设置为newnode
,无论插入的列表位置newnode
如何。)
请注意,在这种情况下,您可以避免使用指向指针的指针,方法是更改函数以返回指向列表头部的指针。
答案 1 :(得分:0)
sortedinsert
函数接受指向列表头部的指针和指向新节点的指针。
列表的头部只是一个指针,但是在这个函数中是一个“指向指针的指针”,因为该函数正在改变列表头部的位置。
新节点将添加到列表中的排序位置,并且磁头似乎始终被修改为指向最新节点。
答案 2 :(得分:0)
请注意,如果您使用的是C ++,则可以通过引用传递headref
,因此相同的代码会更简单。它完全相同,但更简单:
void sortedinsert(struct node* &headref,struct node *newnode)
{
while(headref!=NULL && headref->data < newnode->data)
headref = headref->next;
newnode->next = headref;
headref = newnode;
}