2011-12-26 3 views
1

У меня есть на структуру следующим образом:Как очистить память с

struct Node{ 
int *arr; 
int *sol; 
struct Node *Next; 
}; 

я создаю узел таким образом:

Node* MyNode = (Node *)malloc(sizeof (struct Node)); 
MyNode->arr = malloc(sizeof(int)*N); 
MyNode->sol= malloc(sizeof(int)*N); 

Я затем добавить MyNode в связанный список. Как я могу освободить память для элемента в списке.
это правильно:

pop(){ 
    free(first->arr); 
    free(first->sol); 
    first=first->Next; 
} 
+1

Покажите нам настоящий код. –

+0

На каком языке? Кроме того: существует ';' отсутствует в определении вашей структуры (* для обоих языков *). – wildplasser

+1

Что дальше? Ваш 'Node' не содержит указатель' Next'. –

ответ

4

Для любого struct быть узлом в linked-list, вам нужно self-referential structure variable, который должен быть объявлен как struct Node *next;

struct Node{ 
    int *arr; 
    int *sol; 
    struct Node *next; 
} 

выделить память для узла связанного списка вам необходимо следующее:

/* allocate memory for a node */ 
struct Node * MyNode = (struct Node *)malloc((int)sizeof(struct Node)); 
if (MyNode == NULL) { 
    printf("ERROR: unable to allocate memory \n"); 
    return 1; 
} 

/* allocate memory for the content of a node */ 
MyNode->arr = (int *) malloc((int)sizeof(int) * N); 
if (MyNode->arr == NULL) { 
    printf("ERROR: unable to allocate memory \n"); 
    return 1; 
} 

MyNode->sol = (int *) malloc((int)sizeof(int) * N); 
if (MyNode->sol == NULL) { 
    printf("ERROR: unable to allocate memory \n"); 
    return 1; 
} 

/* add the new node to a list by updating the next variable */ 
MyNode->next = ... 

Если вы не уверены в операциях, которые необходимо выполнить для удаления узла в связанном списке, вы можете использовать переменную temp, чтобы сделать то же самое более простым способом.

pop() 
{ 
    struct Node * temp = first; 
    first = first->next; 
    free(temp->arr); 
    free(temp->sol); 
    free(temp); 
} 

правила большого пальца руки для free - для каждого malloc() должно быть free()

Ото, чтобы пройти через различные сценарии в удалении узла в связанном списке, пожалуйста, обратитесь this ссылки.

1
pop(){ 
    free(first->arr); 
    free(first->sol); 
    Node* temp = first; //<======== 
    first=first->Next; 
    free (temp); //<======= 
} 
+0

вы не можете выполнить 'first = first-> next' after' free (first)' ... –

+0

@Mat, Roee, дайте мне 20 секунд! –

+0

Да, вы правы (-: –

3

почти, вам нужно освободить сам узел:

pop(){ 
    Node* old_first = first; 
    free(first->arr); 
    free(first->sol); 
    first=first->Next; 
    free(old_first); 
} 
+0

* nitpick * 'old_first' не объявлен, в вашем ответе есть ошибка компиляции :) –

+0

true ........... –

1

Это близко, но не правильно - вы должны иметь столько free сек, как у вас есть malloc s. Вы забываете освободить Node.

Чтобы это исправить, добавить временный:

Node *next = first->next; 
free(first->arr); 
free(first->sol); 
free(first); 
first = next; 
Смежные вопросы