如何在C中删除链表?

如何在C中删除链表?,c,memory,linked-list,malloc,free,C,Memory,Linked List,Malloc,Free,我正在尝试使用以下定义在c中创建一个链表: /** * The definition of node and linked list. */ typedef struct _node{ void * val; struct _node * next; } node; typedef struct{ node * head; } linkedlist; 我有一个函数可以完全删除它(不是针对单个节点,而是整个列表): 我的问题是: 它有用吗 我怎么知道它是否真的有效

我正在尝试使用以下定义在c中创建一个链表:

/**
 * The definition of node and linked list.
 */
typedef struct _node{
    void * val;
    struct _node * next;
} node;

typedef struct{
    node * head;
} linkedlist;
我有一个函数可以完全删除它(不是针对单个节点,而是整个列表):

我的问题是:

  • 它有用吗
  • 我怎么知道它是否真的有效

我在MacBook Pro上工作,使用gcc作为编译器。

我永远不会理解为什么有编译代码的人会发布不编译的代码。但是,假设linkedlist本身需要释放,下面是我的方法(未经测试):


你试过了吗?如何在调试器中单步执行?在
linkedlist
中执行
curr
的目的是什么?我编译了它,它工作正常,但我的问题是如何知道它是否真的释放了我创建的内存(malloc)。查看此代码是否工作的最佳方法?写一个
intmain()
方法!您可以使用valgrind来查看是否正确释放了所有分配的内存。您可能已经更改了它,但问题中的代码仍然无法编译。如果你按照我的建议发布代码,你不会编辑,你只需要使用复制粘贴。不管怎么说,我已经克服了这一点。我已经介绍了如何清理这样一个linkedlist的代码。
void clean_list(linkedlist * ll){
    node * temp;
    curr = ll->head;

    while(ll->curr->next != NULL){
    temp = curr;
    curr = curr->next;
    free(temp->val);
    free(temp);
    }
}
void clean_list(linkedlist *pll)
{
    node *pnext;

    for (node *pnode = pll->head; pnode != NULL; pnode = pnext)
    {
        pnext = pnode->next;
        free(pnode->val);
        free(pnode);
    }
    free(pll);
}
void clean_list(linkedlist * ll){
    node *temp, **ppp;

    for (ppp= &ll->head; temp = *ppp;   ){
      *ppp = temp->next;
      free(temp->val);
      free(temp);
      }
}