Verkettete Liste Programmabsturz
-
Hallo,
bin grad dabei eine Liste zu schreiben. Aber irgendetwas scheint da nicht zu stimmen. Und zwar geht es um Funktion für einen Listeneintrag (Zeile 14). So wie ich den Code jetzt unten gepostet habe funktioniert das ganze auch.Ändere ich aber den Rückgabetyp der Funktion auf void, wird das Programm zwar kompiliert, stürzt aber ab.
Woran liegt das? Ist da vielleicht ein grundlegender Fehler im Code und das Programm funktioniert nur zufällig?
Da ich im Moment eh kein return drin hab, kann der Rückgabetyp doch gar keine Rolle spielen//Listen #include <stdio.h> #include <stdlib.h> //Listenstruktur typedef struct LISTE{ int inhalt; struct LISTE *next; struct LISTE *prev; } LISTE; //Listen Element hinzufügen rechts LISTE LISTE_EINTRAG_RECHTS(LISTE *liste, int inhalt){ //Hier void LISTE_EINTRAG_RECHTS... LISTE *eintrag; eintrag = malloc(sizeof(*eintrag)); eintrag->inhalt = inhalt; eintrag->next = NULL; eintrag->prev = liste; if(liste->inhalt != 0){ while(liste->next != NULL){ liste = liste->next; } liste->next = eintrag; } else{ liste->inhalt = inhalt; liste->next = NULL; } }; //Liste ausgeben void LISTE_ZEIGEN(LISTE *liste){ printf("%d\n", liste->inhalt); while(liste->next != NULL){ liste = liste->next; printf("%d\n", liste->inhalt); } }; //Main() int main(){ LISTE *testliste; testliste->next = NULL; testliste->inhalt = 0; LISTE_EINTRAG_RECHTS(testliste, 3); LISTE_EINTRAG_RECHTS(testliste, 4); LISTE_ZEIGEN(testliste); system("pause"); return 0; }
-
Bist du sicher, daß der jetzige Code ohne Fehler (und Warnungen) compiliert werden kann? Ansonsten sieht es so aus, als ob du dich ein wenig mit den Listen-Verkettungen verheddert hast - Das neue Element wird am Ende der Liste eingehängt, aber sein Vorgänger-Zeiger verweist auf das Anfangselement.
(und du hast ein Speicherleck beim ersten Aufruf und kannst keine Null-Werte an den Listenanfang einfügen)
-
Hab das jetzt umgeschrieben. Ging mir erstmal nur um die eine Richtung (also *next). Hab mich mehr nach einem Tutorial orientiert, wobei mir das nicht so gefällt (doppelter Zeiger - **). Sowas finde ich schwer nachzuvollziehen. Werde mal die Tage noch ein paar andere Tutorials anschauen und gucken was ich so finde.
Und ja, der Code wurde ohne Warnungen und Fehler kompoliert (hatte mich ja selbst überrascht).Danke für die schnelle Antwort.
Wens interessiert, hier der neue Code://Listen #include <stdio.h> #include <stdlib.h> //Listenstruktur typedef struct LISTE{ int inhalt; struct LISTE *next; } LISTE; //Listen Element hinzufügen rechts void LISTE_EINTRAG_RECHTS(LISTE **liste, int inhalt){ LISTE *eintrag; LISTE *l = *liste; eintrag = malloc(sizeof(*eintrag)); eintrag->inhalt = inhalt; eintrag->next = NULL; if(l != 0){ while(l->next != NULL){ l = l->next; } l->next = eintrag; } else{ *liste = eintrag; } }; //Liste ausgeben void LISTE_ZEIGEN(LISTE *liste){ printf("%d\n", liste->inhalt); while(liste->next != NULL){ liste = liste->next; printf("%d\n", liste->inhalt); } }; //Main() int main(){ LISTE *testliste; testliste = NULL; LISTE_EINTRAG_RECHTS(&testliste, 3); LISTE_EINTRAG_RECHTS(&testliste, 4); LISTE_ZEIGEN(testliste); system("pause"); return 0; }