C 我可以释放一个链表而不将引用传递给头部吗?
我正试图用下面的函数释放我的整个链表。但是,由于我正在将C 我可以释放一个链表而不将引用传递给头部吗?,c,pointers,linked-list,C,Pointers,Linked List,我正试图用下面的函数释放我的整个链表。但是,由于我正在将head的副本传递给函数,因此,head的末尾并没有指向NULL,而是指向其他内容。因此,我的程序崩溃了。有人能给我解释一下head实际指向的位置吗?有没有办法在不传递双指针的情况下将其更改为NULL void free_list(Node *head) { Node *curr_item = head; if(head == NULL) { printf("\nLinked list is em
head
的副本传递给函数,因此,head
的末尾并没有指向NULL
,而是指向其他内容。因此,我的程序崩溃了。有人能给我解释一下head
实际指向的位置吗?有没有办法在不传递双指针的情况下将其更改为NULL
void free_list(Node *head) {
Node *curr_item = head;
if(head == NULL) {
printf("\nLinked list is empty\n\n");
menu();
}
while(head != NULL) {
curr_item = head;
head = head->next;
free(curr_item);
}
menu();
}
如注释中所述:如果不想传递对head指针的引用,则让函数返回新值
head
(该值将为NULL
),并有一个“约定”,即调用者必须将返回值作为head
的新值。您还可以将此模式与其他列表修改功能一起使用,例如只删除一个节点(可能由给定的值或位置确定),或者插入一个新节点等等
拟议守则:
Node * free_list(Node *head) {
Node *curr_item;
while (head != NULL) {
curr_item = head;
head = head->next;
free(curr_item);
}
return head; // is NULL
}
调用代码可能如下所示:
//...
if (head == NULL) {
printf("\nLinked list is empty\n\n");
}
head = free_list(head);
menu();
// ...
将函数定义为
节点**phead
,以便可以分配*phead=NULL
。可以使用返回值告诉调用者head的新值应该是什么。(从此函数调用menu()
看起来很奇怪,而且您的设计中似乎存在一些问题)您可以通过写入head=NULL将head更改为NULL代码>,但由于您希望另一个函数的head变量为NULL,因此必须在该函数中写入它。我通过向head传递引用来实现,正如@iBug建议的那样。我只是好奇是否还有其他办法@MikeCAT该程序的目的是随时向链表中添加/删除节点。我正在调用menu()
,以便用户可以返回并选择继续程序或退出。您迫切需要了解最新信息。释放列表的函数不应生成菜单。您遇到的问题是,调用此函数的代码需要在释放列表后执行某些操作(将head
设置为NULL
)。但它不能这样做,因为此函数在释放列表后不会返回。释放列表的函数应该只释放列表。如果在释放列表后需要执行其他操作,则在调用此函数以释放列表后,其他函数应执行此操作。谢谢您的建议。我是通过向head指针传递一个引用来实现的,但是我认为我可以为其他函数实现这个模式。