删除C函数中的链表节点不会转移到调用函数

时间:2018-01-16 09:17:37

标签: c xcode linked-list

我有这个C函数,它应该在链表中找到一个具有特定" pos"的元素。 value,删除它,并将删除的值返回给调用函数。它确实删除了该项目,但更改未保存在调用函数中,列表只是没有更新新的更改。 我的列表结构如下:

struct list{
    int value;
    int pos;
    struct list * next_ptr;
};

我的C函数是这样的:

bool findDeleteElement(struct list **ptr, int position, int *value){
     struct list** temp = ptr;
    if(*ptr!=NULL){
        while((*ptr)->pos!=position) ptr=&(*ptr)->next_ptr; //Gets to desired node
        temp=ptr;
        value=&(*ptr)->value; //saves the value
        temp=&(*temp)->next_ptr; //Goes to next node
        ptr=temp; //Makes ptr point to next node
        return 1;
    }
    else return 0;
}

我无法看到我失踪的东西。 我是初学者,所以我可能犯了一个简单的错误。

3 个答案:

答案 0 :(得分:1)

更改为:

*value = (*ptr)->value; //saves the value

您只需设置value,即外部变量地址的本地副本。这不会改变调用函数中的外部变量。

有些问题:

  • 如果position的值不正确,会发现没有节点,会发生什么?
  • temp = ptr;的目的是什么,因为temptemp = &(*temp)->next_ptr;覆盖而未被使用。

免责声明:我没有进一步检查此功能。

我建议您采用其他代码格式规则,以增加空气并使事情更具可读性。这是一个例子:

bool findDeleteElement(struct list **ptr, int position, int *value)
{
    struct list** temp = ptr;

    if (*ptr != NULL)
    {
        // Gets to desired node
        while((*ptr)->pos != position)
        {
            ptr = &(*ptr)->next_ptr; 
        }

        temp   = ptr;
        *value = (*ptr)->value;      // Saves the value
        temp   = &(*temp)->next_ptr; // Goes to next node
        ptr    = temp;               // Makes ptr point to next node

        return 1;
    }
    else
    {
        return 0;
    }
}

答案 1 :(得分:0)

您对指针和解除引用以及&*实际执行的内容感到困惑。这对于初学者来说是一种正常的事态。

首先,ptrvalue在没有*之前使用时是函数参数,就像自动(局部)变量一样,它们在函数范围退出时消失。所以这句话:

value=&(*ptr)->value;

仅仅更改value的值,即它指向的内容,并且对调用者没有明显的影响。你需要改变的是value指向的东西。即声明应如下所示:

*value = (*ptr)->value;

不同之处在于,不是将value设置为(*ptr)->value地址,而是设置value指向(*ptr)->value的内容。

您与ptr存在类似问题。但是你的问题更加微妙,因为你也试图将它用作循环变量。分开两种用途会更好。我写的函数是这样的:

bool findDeleteElement(struct list **head, int position, int *value)
{
    struct list* temp = *head;
    struct list* prev = NULL;
    while(temp != NULL && temp->pos != position) 
    {
        prev = temp;
        temp = temp->next;
    }
    if (temp == NULL) // position not found
    {
        return false;
    }
    else 
    {
        *value = temp->value;
        // Now need to delete the node.
        if (prev != NULL)
        {
            // If prev has been set, we are not at the head
            prev->next = temp->next; // Unlink the node from the list
        }
        else // We found the node at the head of the list
        {
            *head = temp->next;
        }
        free(temp); // Assumes the node was malloced.
        return true;
    }
}

上述内容未经过测试甚至编译。我把它作为练习留给你。

答案 2 :(得分:0)

int delete(struct llist **pp, int pos, int *result)
{
struct llist *tmp;

while ( (tmp = *pp)) {
        if (tmp->pos != pos) { pp = &tmp->next; continue; }
        *result = val;
        *pp = tmp->next;
        free(tmp);
        return 1;
        }
return 0; 
}