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

时间:2013-11-04 16:53:20

标签: linked-list particles

我一直在努力工作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);

2 个答案:

答案 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 */
}

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