我已经为此工作了大约 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);
问题是:如果要删除的指针(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;
}
顺便说一句:返回值是无稽之谈。如果函数没有有用的返回,它也可以返回 void。
好的,所以使用原始函数原型解决这个问题的方法是,如果你使用:
if(p->next != NULL){
/* do something */
}
您正在检查是否要删除下一个节点。 这使您可以访问上一个节点和下一个节点(要删除)。