0

我已经为此工作了大约 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);
4

2 回答 2

0

好的,所以使用原始函数原型解决这个问题的方法是,如果你使用:

if(p->next != NULL){
    /* do something */
}

您正在检查是否要删除下一个节点。这使您可以访问上一个节点和下一个节点(要删除)。

于 2013-11-06T16:19:18.687 回答
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 不是一个全局指针,那么您确实会得到一个函数,其中指向 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。

于 2013-11-05T00:51:20.427 回答