Einfach verkettete Liste
-
Hallo liebe Gemeinde ich hab ein Problem mit meiner Liste wäre nett wenn ihr mir helfen könntet und zwar ist das problem das ich keine neuen elemente aufnehmen kann Es liegt glaub ich an der Funktion appendToList das könnt ihr auch ausprobieren wenn ihr das if auf 1 setzt dann zeigt er es nämlich richtig an
Vielen Dank für eure Hilfe!!!#include <stdio.h> #include <string.h> #include <stdlib.h> #include <conio.h> #define ERROR printf("Zuwenig Speicherplatz oder Falsche Eingabe"); \ getch(); typedef struct Element_t{ char name[30]; int mtr; struct Element_t *next; } Element_t; Element_t* createElement() { Element_t *newelement; newelement = (Element_t *) malloc(sizeof(Element_t)); if(newelement == NULL) { ERROR; } else { printf("Eingabe\n\tName : "); scanf("%29s",newelement->name); printf("\tMtr : "); scanf("%i",&newelement->mtr); } return newelement; } void appendToList (Element_t *p,Element_t *newelement) { while( p != NULL ) { //Am Ende dieses Durchlaufs bin ich bei dem Elem. p = p->next; // was auf NULL zeigt und dann füge ich mein } // neues Element ein und setze nun das ende eins weiter p = newelement; p->next = NULL; } void printList(Element_t *p) { if( p != NULL ) { printf("\n\n\n"); printf("Name : %s\nMtr : %i",p->name,p->mtr); printList(p->next); } } int main(){ Element_t *head=NULL,*newelement; int choice; if(0){ head=createElement(); head->next=createElement(); head->next->next=NULL; } while(1) { system("cls"); printf("\n(1)Neues Element hinzuf\x81 \bgen"); printf("\n(2)Liste anzeigen"); printf("\n(3)Beenden"); printf("\nIhre Eingabe : "); scanf("%i",&choice); switch(choice) { case 1: newelement = createElement(); appendToList(head,newelement); break; case 2: printList(head); getch(); break; case 3: return 0; break; } } getch(); }
-
Wenn du etwas ans Ende der Liste anhängen willst, solltest du dir auch das letzte Element merken:
void appendToList (Element_t *p,Element_t *newelement) { while( p->next != NULL ) { // Am Ende dieses Durchlaufs bin ich beim letzten p = p->next; // Element der Liste und hänge das neue Element als } // dessen Nachfolger ein p->next = newelement; newelement->next = NULL; }
Edit: Das getch() am Ende deines Programms ist übrigens sinnlos - da kommst du nie vorbei.
-
Wenn ich es so wie du mache stürzt das Programm ab wenn ich schon bei NULL bin kann ich ja nicht nochmal next nehmen und dann hinter der NULL das Element einfügen
-
conio.h ist kein C Standard.
getch() ist kein C Standard.
scanf mit "%i" ist undefiniert.
Das Makro ERROR ist stockhäßlich und stark fehleranfällig.system("cls");
ist nicht portabel.
-
Ok sry jetzt versteh ich dein Programm aber es ist nur dann der Fall wenn es bereits schon einen Datensatz gibt wenn ich von Anfang an das Programm starte ist der head noch auf null da gibts dann in der while schleife kein next wie kann man das lösen ?
-
Wahrscheinlich mit einer if else Abfrage die gugt ob der head auf Null steht klappt gibt es noch andere Möglichkeiten ? also direkt anhand der Schleife ?
-
Kardok schrieb:
Ok sry jetzt versteh ich dein Programm aber es ist nur dann der Fall wenn es bereits schon einen Datensatz gibt wenn ich von Anfang an das Programm starte ist der head noch auf null da gibts dann in der while schleife kein next wie kann man das lösen ?
Den Fall mußt du vermutlich gesondert betrachten. Und um den (noch leeren) Anfangszeiger beeinflussen zu können, mußt du einen Zeiger darauf übergeben:
void appendToList (Element_t **pstart,Element_t *newelement) { if(*pstart == NULL) *pstart = newelement else { Element_t* p = *pstart; while( p->next != NULL ) { // Am Ende dieses Durchlaufs bin ich beim letzten p = p->next; // Element der Liste und hänge das neue Element als } // dessen Nachfolger ein p->next = newelement; } newelement->next = NULL; } //Aufruf per appendToList(&head,newelement);
-
Wutz schrieb:
scanf mit "%i" ist undefiniert.
Meckerst du einfach so rum oder hast du tatsächlich keine Ahnung?
Laut Standard ist es sehr wohl definiert ($7.19.6.2).
-
Vielen Dank CStoll für die schnelle und sehr gute Erklärung