我有这个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;
}
我无法看到我失踪的东西。 我是初学者,所以我可能犯了一个简单的错误。
答案 0 :(得分:1)
更改为:
*value = (*ptr)->value; //saves the value
您只需设置value
,即外部变量地址的本地副本。这不会改变调用函数中的外部变量。
有些问题:
position
的值不正确,会发现没有节点,会发生什么?temp = ptr;
的目的是什么,因为temp
被temp = &(*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)
您对指针和解除引用以及&
和*
实际执行的内容感到困惑。这对于初学者来说是一种正常的事态。
首先,ptr
和value
在没有*
之前使用时是函数参数,就像自动(局部)变量一样,它们在函数范围退出时消失。所以这句话:
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;
}