Wie kann ich die in einer anderen Funktion zugewiesenen Knoten freigeben?
struct node {
int data;
struct node* next;
};
struct node* buildList()
{
struct node* head = NULL;
struct node* second = NULL;
struct node* third = NULL;
head = malloc(sizeof(struct node));
second = malloc(sizeof(struct node));
third = malloc(sizeof(struct node));
head->data = 1;
head->next = second;
second->data = 2;
second->next = third;
third->data = 3;
third->next = NULL;
return head;
}
Ich rufe die buildList-Funktion in der main () auf
int main()
{
struct node* h = buildList();
printf("The second element is %d\n", h->next->data);
return 0;
}
Ich möchte Kopf, zweite und dritte Variablen befreien.
Vielen Dank.
Aktualisieren:
int main()
{
struct node* h = buildList();
printf("The element is %d\n", h->next->data); //prints 2
//free(h->next->next);
//free(h->next);
free(h);
// struct node* h1 = buildList();
printf("The element is %d\n", h->next->data); //print 2 ?? why?
return 0;
}
Beide Drucke 2. Sollte nicht kostenlos (h) anrufen, h entfernen. Wenn ja warum stehen diese h-> nächsten-> Daten zur Verfügung, wenn h frei ist. Natürlich wird der 'zweite' Knoten nicht freigegeben. Da der Kopf jedoch entfernt wird, sollte er auf das nächste Element verweisen können. Was ist der Fehler hier?
Eine iterative Funktion, um Ihre Liste freizugeben:
void freeList(struct node* head)
{
struct node* tmp;
while (head != NULL)
{
tmp = head;
head = head->next;
free(tmp);
}
}
Was die Funktion tut, ist folgendes:
prüfen Sie, ob head
NULL ist. Wenn ja, ist die Liste leer und wir kehren zurück
Speichern Sie die Variable head
in einer Variable tmp
und machen Sie head
auf den nächsten Knoten in Ihrer Liste (dies geschieht in head = head->next
).
free(tmp)
sicher verwenden und head
zeigt nur auf den Rest der Liste. Gehen Sie zurück zu Schritt 1 Einfach durch die Liste durchlaufen:
struct node *n = head;
while(n){
struct node *n1 = n;
n = n->next;
free(n1);
}
Du könntest es immer rekursiv so machen:
void freeList(struct node* currentNode)
{
if(currentNode->next) freeList(currentNode->next);
free(currentNode);
}
Eine Funktion kann die Arbeit erledigen,
void free_list(node *pHead)
{
node *pNode = pHead, *pNext;
while (NULL != pNode)
{
pNext = pNode->next;
free(pNode);
pNode = pNext;
}
}