2015-09-27 52 views
-1

我有问题正确释放我的链接列表。我真的不知道,如何与头部和电流使其...释放链接列表

typedef struct list{ 
    int info; 
    struct list *link; 
} Node; 

Node *_getnode(){ 
    return((Node *) malloc (sizeof (Node))); 
} 

int main() { 

    Node *s = _getnode(); 
    s -> link = NULL; 
    Node *t = s; 
    int c; 

    while (1) { 
     printf("\n\t Enter number : "); 
     scanf ("%d", &s -> info); 

     printf ("\n\t Continue? "); 
     __fpurge (stdin); 
     c = getchar(); 

     if (c == 'N' || c == 'n'){ 
      s -> link = NULL; 
      break; 
     } 

     s -> link = _getnode(); 
     s = s -> link; 
    } 

    s = t; 

    free(s); 
    free(t); 

    putchar('\n'); 
    return (0); 
} 

当我输入一个号码,比Valgrind的说,没有内存泄漏。但除此之外。我明白,我必须释放的不仅仅是拳头节点,但我不知道如何。

+0

使用'__fpurge'不是一个好主意 - 它不是可移植的等。双下划线是放弃 –

+1

不要强制'malloc()'的返回值。你需要释放每个节点。 –

回答

2

首先,线

free(s); 
free(t); 

是多余的,因为你已经在前面的行分配s = t;

发生内存泄漏是因为您只在头指针上使用free,而不是链接列表中的所有节点。所以,理想情况下,你应该通过所有节点和免费分配给每个节点的记忆回路,这里是你的代码应该是什么样子:

while(s != NULL) 
{ 
    t = s->link; 
    free(s); 
    s = t; 
} 
1

尝试这样

void free_list(Node *head) 
{ 
    Node *s; 
    Node *n; 
    if (head == NULL) /* passing `NULL' should be ok */ 
     return; 
    for (s = head ; s != NULL ; s = n) 
    { 
     n = s->link; 
     free(s); 
    } 
} 

你可以看到在您创建列表的方式一个明显的缺陷。

1

首先,请初始化节点,使程序能告诉结束正确列表。

Node *_getnode(){ 
    Node* buffer = malloc (sizeof (Node)); 
    if (buffer == NULL) exit(1); 
    buffer->info = 0; /* not important */ 
    buffer->link = NULL; /* this is important */ 
    return buffer; 
} 

然后,逐个释放节点。

void free_nodes (Node* head){ 
    while(head != NULL){ 
     Node* next = head->link; 
     free(head); 
     head = next; 
    } 
} 

没有测试,通过t这个free_nodes应该工作。

+0

谢谢你的指导。编辑。 – MikeCAT