C 清除链接结构中的每个节点

C 清除链接结构中的每个节点,c,pointers,struct,nodes,C,Pointers,Struct,Nodes,我被困在这里了。 你能帮帮我吗? 我似乎无法实现这个函数“freeThis”。 我正在尝试释放链接列表中的节点 结构 struct node { unsigned x; double y; struct node *next; }; typedef struct node Nodes, *This; 职能声明 void freeThis(This *); void freeThis(This *head) { This * tmp; while (hea

我被困在这里了。 你能帮帮我吗? 我似乎无法实现这个函数“freeThis”。 我正在尝试释放链接列表中的节点

结构

struct node {
    unsigned x;
    double y;
    struct node *next;
};
typedef struct node Nodes, *This;
职能声明

void freeThis(This *);
void freeThis(This *head)
{
   This * tmp;

   while (head != NULL)
    {
       tmp = head;

       *head = *head->next; /*error is here I think */

       free(tmp);
    }

}
职能的执行

void freeThis(This *);
void freeThis(This *head)
{
   This * tmp;

   while (head != NULL)
    {
       tmp = head;

       *head = *head->next; /*error is here I think */

       free(tmp);
    }

}
更新

当有这样声明的函数时

void freeNodes(Nodes *);
像这样实现

void freeNodes(Nodes *a)

    {
        free(a);
        printf(“sucess”);
    }
我将如何使用此功能

像这样

freeNodes(*tmp);
这是一种指针类型:typedef struct node Nodes,*This

请注意,您不需要指向指针的指针,一个指针就足够了,因此请更改:

void freeThis(This *head) /* head is a pointer to pointer */
{
   This * tmp;


是的,问题在这里:

*head = *head->next; 
这是因为运算符优先级。->首先计算,然后计算*

试一试

有关更新:

如果您已将temp声明为

Nodes * temp 
然后调用函数

freeNodes(temp)

你也可以试试这个

  void freeThis(Nodes **head)
  {
    Nodes *tmp;

    while (*head)
    {
      tmp = *head;/*first node to be delete*/
      *head = *head->next;/*2nd node is updated as headpointer*/
      free(tmp);/* freeing first node & here you can call your freeNodes function...*/
     }

 }

*头部=*头部->下一步;这很管用,但我遇到了另一个problem@billybob我怀疑它是否有效。从语义上讲,它是不正确的。释放链接列表的惯用方法不是替换节点本身,而是只替换指针,原因很明显。另外,不要将指针隐藏在typedef后面。完全去掉这个,只使用Node*。你是如何声明temp的?哦,tmp应该与我之前发布的内容一致。而不是使用freetmp;我试图使用void freeNodesNodes*a,它本身将使用freetmp;稍后,但我需要这样做,但您不需要指向指针的指针,请参阅我的答案。@AlterMann:我知道指向指针的指针不是必需的。我刚刚给出了问题的解决方案。@Arpit,这是OP对“是”的回复,有效,您的答案是正确的;简短回答:不要键入def。typedef只是为了让您感到困惑。直到你知道更多
freeNodes(temp)
  void freeThis(Nodes **head)
  {
    Nodes *tmp;

    while (*head)
    {
      tmp = *head;/*first node to be delete*/
      *head = *head->next;/*2nd node is updated as headpointer*/
      free(tmp);/* freeing first node & here you can call your freeNodes function...*/
     }

 }