从链接列表中间删除一个节点,函数原型为:int particle_remove(struct particle* p);



我已经为此工作了大约 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 */
}

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

相关内容

  • 没有找到相关文章

最新更新