Letztes Element einer LinkedList
-
DAS Compiliert?
void Create(LinkedList LinkedList) { LinkedList = NULL; }
-
nö - aber das akzeptiert mein Compiler:
#include <stdio.h> struct LinkedListElement { int value; struct LinkedListElement *next; }; typedef struct LinkedListElement *LinkedList; // Fuegt ein Element in die LinkedList ein void Insert(int value, LinkedList LinkedList) { struct LinkedListElement *tmp = LinkedList; LinkedList = malloc(sizeof(struct LinkedListElement)); LinkedList->value = value; LinkedList->next = tmp; } // Zeigt die Liste an void Show(LinkedList LinkedList) { struct LinkedListElement *tmp = LinkedList; while(tmp != NULL) { printf("%d\n", tmp->value); tmp = tmp->next; } } // Loescht die LinkedList void Delete(LinkedList LinkedList) { struct LinkedListElement *tmp; while (LinkedList != NULL) { LinkedList = LinkedList->next; free(LinkedList); LinkedList = tmp; } } int main(void) { LinkedList Liste=NULL; Insert(5, Liste); Insert(10, Liste); Insert(12, Liste); Show(Liste); Delete(Liste); }
was mach ich da falsch
-
Versuch mal das hier.
/* Code nach C99 (ISO/IEC 9899:1999) */ #include <stdio.h> #include <malloc.h> #include <stdio.h> struct LinkedListElement { int value; struct LinkedListElement *next; }; typedef struct LinkedListElement *LinkedList; // Fuegt ein Element in die LinkedList ein void Insert(int value, LinkedList *LinkedList) { struct LinkedListElement *tmp = (*LinkedList); (*LinkedList) = (LinkedListElement*)malloc(sizeof(struct LinkedListElement)); (*LinkedList)->value = value; (*LinkedList)->next = tmp; } // Zeigt die Liste an void Show(LinkedList LinkedList) { struct LinkedListElement *tmp = LinkedList; while(tmp != NULL) { printf("%d\n", tmp->value); tmp = tmp->next; } } // Loescht die LinkedList void Delete(LinkedList LinkedList) { struct LinkedListElement *tmp=NULL; while (LinkedList != NULL) { LinkedList = LinkedList->next; free(LinkedList); LinkedList = tmp; } } int main(void) { LinkedList Liste=NULL; Insert(5, &Liste); Insert(10, &Liste); Insert(12, &Liste); Show(Liste); Delete(Liste); return 0; }
*EDIT* Ein Include zuviel
-
ups... Zeiger auf Zeiger - da fällt mir jetzt wieder was ein
-
Netzwerk-Latenz schrieb:
// Loescht die LinkedList 1: void Delete(LinkedList LinkedList) 2: { 3: struct LinkedListElement *tmp=NULL; 4: while (LinkedList != NULL) 5: { 6: LinkedList = LinkedList->next; 7: free(LinkedList); 8: LinkedList = tmp; 9: } 10:}
ist das nicht ein Memory Leak?
in Zeile 8 setzt du LinkedList auf den Wert NULL - damit ist die Schleife beendet - es wird maximal einmal free aufgerufen
-
// Loescht die LinkedList void Delete(LinkedList *LinkedList) { struct LinkedListElement *tmp = NULL; while(*LinkedList != NULL) { tmp = (*LinkedList)->next; free(*LinkedList); *LinkedList = tmp; } }
irgendwie funzt das auch wieder nicht - kann aber keinen fehler erkennen...
-
// Loescht die LinkedList void Delete(LinkedList LinkedList) { struct LinkedListElement *tmp=NULL; while (LinkedList != NULL) { tmp = LinkedList->next; free(LinkedList); LinkedList = tmp; } }
Und so.
-
Die Funktion Delete bekommt ja bei deiner Version nur eine Kopie der Adresse geliefert, wobei bei meiner Version call by reference stattfindet - ich will die übergebene liste nachdem ich sie "deletet" habe auf NULL setzten - das geht halt nur wenn ich call by reference mach
-
kann mir jemand meinen Fehler bei Folgender Funktion sagen (der Funktionskopf soll nicht verändert werden):
// Loescht die LinkedList void Delete(LinkedList *LinkedList) { struct LinkedListElement *tmp = NULL; while(*LinkedList != NULL) { tmp = (*LinkedList)->next; free(*LinkedList); *LinkedList = tmp; } }
-
Ich finde, du solltest erstmal ausschlafen, oder alternativ das Kapitel Zeiger (inkl. * und -> Operatoren) nochmal überfliegen. Das kann eigentlich nicht sein, dass man solche Fehler nicht selber findet.