linkedlist递归函数中的Malloc和free

linkedlist递归函数中的Malloc和free,c,C,我知道,对于每个malloc,都必须有一个free(),但是如果在递归函数中传递了一个现有的linkedlist,以便在linkedlist中插入一个新节点,您将如何释放它?我正在使用valgrind,它告诉我必须释放malloc 因此,我的函数有一个char*作为参数,指向列表的指针作为**传递,我做了一些研究,需要像这样传递,以便插入新节点,即使指针只起作用 void showDir(字符*名称,链接列表**列表){ DIR*DIR; 结构方向*条目; 如果(!(dir=opendir(na

我知道,对于每个malloc,都必须有一个free(),但是如果在递归函数中传递了一个现有的linkedlist,以便在linkedlist中插入一个新节点,您将如何释放它?我正在使用valgrind,它告诉我必须释放malloc

因此,我的函数有一个char*作为参数,指向列表的指针作为**传递,我做了一些研究,需要像这样传递,以便插入新节点,即使指针只起作用

void showDir(字符*名称,链接列表**列表){
DIR*DIR;
结构方向*条目;
如果(!(dir=opendir(name)),返回;
while((entry=readdir(dir))!=NULL){
如果(条目->数据类型==DT\U目录){
字符路径[1024];
如果(strcmp(条目->数据单元名称,“.”)=0 | | strcmp(条目->数据单元名称,“…”)==0)
继续;
snprintf(路径,sizeof(路径),%s/%s”,名称,条目->d_名称);
showDir(路径、列表);
}
linkedList*node=malloc(sizeof(linkedList));
如果(!节点){
printf(“错误!”);
}
节点->下一步=空;
char文件路径[1024];
snprintf(文件路径,sizeof(文件路径),“%s/%s”,名称,条目->d_名称);
节点->路径=malloc(strlen(filePath)+1);
strcpy(节点->路径,文件路径);
如果(*列表){
int=0;
对于(linkedList*ptr=*list;ptr!=NULL;ptr=ptr->next){
if(strcmp(ptr->path,filePath)==0){
发现=1;
}
如果(ptr->next==NULL&&found==0){
ptr->next=节点;
打破
}
}
}否则{
*列表=节点;
}
}
closedir(dir);
}
我像这样调用递归函数
showDir(ptr->path,&list)
像这样释放它

linkedList*ptr=list;
while(ptr!=NULL){
linkedList*next=ptr->next;
自由(ptr->path);
免费(ptr);
ptr=下一个;
}
当然,在第一次呼叫中传递的列表已经被填满了

谢谢你的阅读,希望你能帮助理解我在这里做错了什么

--编辑

创建一个tmp指针。 这样,当您释放它们时,仍然可以在结构中移动

如果不创建指向结构地址的临时指针,则将失去对其余节点的访问

    void freeList(struct node* head)
{
   struct node* tmp;

   while (head != NULL)
    {
       tmp = head;
       head = head->next;
       free(tmp);
    }

}

要递归释放Linkedlist,您可以按如下操作:

void freeList(struct node* head){
    if(head != NULL){
      freeList(head->next);
      free(head);
    }
}

不知道您是否遇到了这种情况(包括Valgrind报告),但如果找到了新分配的节点,您似乎不会释放该节点。现在的函数
showDir
似乎没有自我递归地调用它。但要回答您的问题,除非进行了一些重新分配,否则您可以在函数调用之后轻松地释放列表。您也可以在函数内部重新分配时释放。@500 InternalServerError包含valgrind报告。@SASSY_ROG我可以在函数调用后轻松释放列表是什么意思?我需要列表供以后使用,但无法释放它,如果我在分配节点并插入linkedlist后释放节点,它将出现分段错误。调用
showDir(ptr->path,&list)之前
list
的状态是什么?修改post并提供一个OP执行此操作的示例。
void freeList(struct node* head){
    if(head != NULL){
      freeList(head->next);
      free(head);
    }
}