我一直在努力工作10个小时。
int particle_remove(struct particle* p);
当我将“要删除的节点”的位置传递给函数时,如何找到头部?
我知道:
prev->next = curr->next;
free(curr);
如何找到头部的位置向下移动到(curr -1)?
这是我到目前为止所做的:
int particle_remove(struct particle *p){
struct particle *curr = p;
struct particle *prev = *head; /* should point to the head */
if (p != NULL){
while (prev != curr){
prev=curr->next;
}
prev->next = curr->next;
free(curr);
}
return 0;
}
我已经超过这一百万次并且我无法想到如何到达头节点,而不将头节点的位置参数传递给函数。是否可以使用当前功能“签名”执行此操作,还是必须添加对头部的引用?
好的我已经通过创建一个新功能来解决这个问题,该功能既可以销毁当前节点,也可以指向头部的指针,因为我不认为仅使用要删除的节点的函数将作为没有提到头部。 (除非有人能证明我错了,请做!)
我最终得到了一个看起来像这样的原型:(对于那些正在寻找提示的人)
int particle_remove(struct particle *p, struct particle **head);
答案 0 :(得分:0)
问题是:如果要删除的指针(p
)恰好是列表中的第一个,则必须更改头指针。使用指向指针(指向头指针的指针)是最简单的方法:
int particle_remove(struct particle *p){
struct particle **pp; /* should point to the head */
for(pp = &head; *pp; pp = &(*pp)->next){
if (*pp != p) continue;
*pp = p->next;
free(p);
break;
}
return 0;
}
如果head不是gobal指针,你的确最终会得到一个函数,其中指向head的指针作为参数传递:
int particle_remove(struct particle **pphead, struct particle *p){
for( ; *pphead; pphead = &(*pphead)->next){
if (*pphead != p) continue;
*pphead = p->next;
free(p);
break;
}
return 0;
}
BTW:返回值是无意义的。如果函数没有有用的返回值,那么它也可以返回void。
答案 1 :(得分:0)
好的,所以使用原始函数原型解决这个问题的方法是使用:
if(p->next != NULL){
/* do something */
}
您正在检查是否要删除下一个节点。这使您可以访问上一个节点和下一个节点(要删除)。