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指针传递一个引用来实现的,但是我认为我可以为其他函数实现这个模式。