请看下面的完整代码。
我有一个名为arr的初始数组。
我使用链接列表通过append函数存储一些索引。得到索引后,我将它们存储在链表中,并使用clearList将相应的值更改为0(在本例中为arr[2]和arr[4])。
最后,我通过调用freeList释放内存,因为我已经完成了链接列表。
然而,为了能够一次又一次地做同样的事情,我需要在每次调用head时将freeList设置为空。但我不能。知道怎么解决这个问题吗?
谢谢您。

#include <stdio.h>
#include "gurobi_c.h"
#include <stdlib.h>

//Gurobi variables
GRBenv   *env = NULL;
GRBmodel *model = NULL;
//Gurobi variables

struct Node
{
  int data;
  struct Node *next;
  struct Node *end;
};

void append(struct Node** head_ref, int new_data)
    {
    struct Node *last = *head_ref;
    struct Node* new_node = (struct Node*) malloc(sizeof(struct Node));
    new_node->data  = new_data;
    new_node->next = NULL;
    new_node->end = new_node;
    if (*head_ref == NULL)
    {
       *head_ref = new_node;
       //printf("  ..Init Append %d\n",new_data);
       return;
    }
    last = (*head_ref)->end;
    last->next = new_node;
    (*head_ref)->end=new_node;
    //printf("  ..Append %d\n",new_data);
    return;
}

void clearList(struct Node *node, double *arr)
    {
    int i;
    if(node!=NULL)
        {
        struct Node tmp;
        tmp=*(node->end);
        while (node != NULL)
            {
            i=node->data;
            arr[i]=0;
            //printf("   ..clear %d \n", node->data,(node->end)->data);
            node = node->next;
            }
        }
    }

void freeList(struct Node *node)
    {
    struct Node *tmp,*hd;
    hd=node;
    while (node != NULL)
        {
        tmp=node;
        node = node->next;
        //printf("  ..Free %d \n", tmp->data);
        free(tmp);
        }
    hd=NULL;
    }

int main (){
    Node *head;
    double *arr = (double *) malloc(sizeof(double) * 10);
    for(int i=0;i<10;i++)
        arr[i]=i;

    head=NULL;
    printf("Head:  %s\n", head);
    append(&head,2);
    append(&head,4);
    clearList(head,arr);
    for(int i=0;i<10;i++)
        printf("No %d : %.2f\n",i,arr[i]);
    freeList(head);

    free(arr);

    printf("%s", head);
    getchar();
    return 0;
    }

最佳答案

您已经在append函数中更改了head的值,因此基本上需要在freeList中执行相同的操作:

void freeList(struct Node **head_ref)
    {
    struct Node *tmp,*node;
    node=*head_ref;
    while (node != NULL)
        {
        tmp=node;
        node = node->next;
        //printf("  ..Free %d \n", tmp->data);
        free(tmp);
        }
    *head_ref=NULL;
    }

int main (){
    /* do stuff */
    freeList(&head);
    /* do stuff */
    }

10-06 06:02