我是C编程的初学者,我对指针有点困惑。我正在尝试创建一个删除链接列表的所有元素的函数。但是我的代码会删除除头部以外的所有元素。
我无法改变
void destroy(node * h)
由于作业标题引起的参数。
void destroy(set_element* head){
set_element* temp ;
set_element* curr = head;
if(head){
curr = head->next;
head->next = NULL;
while(curr !=NULL){
temp = curr->next;
free(curr);
curr = temp;
}
head =NULL;
}
}
提前谢谢。
答案 0 :(得分:1)
问题在于这一行
curr = head->next;
在此,您curr
指向 next 节点。您需要将curr
直接指向head
。
该功能的更简单版本可能是例如这样:
void destroy(set_element **head)
{
set_element *next;
for (set_element *curr = *head; curr; curr = next)
{
next = curr->next;
free(curr);
}
*head = NULL;
}
请注意,我通过引用传递head
指针,否则对NULL
的赋值只会更改指针的本地副本。
答案 1 :(得分:1)
如果您要做的只是删除整个链接列表(包括头节点)并且不关心调用者是否留有悬空指针,这会变得非常简单:
void destroy(set_element* head)
{
set_element* temp;
while (head)
{
temp = head;
head = head->next;
free(temp);
}
}
在来电方面调用:
destroy(head);
也就是说,如果要修改调用者传入指针,则无法使用此函数签名执行此操作。与C中的所有其他内容(数组不能承受)一样,参数按值传递,如果需要修改调用者数据,则参数必须是指针,传入的值是地址:
void destroy(set_element** headp)
{
set_element* temp;
while (*headp)
{
temp = *headp;
*headp = temp->next;
free(temp);
}
}
在调用者方面调用
destroy(&head);
这两个都假设您的列表已正确终止为NULL。