Einfach verkettete Liste
-
Hey Leute
Leider will meine selbst geschriebene Liste nicht so..
Wenn ich ein element einfüge gehts ... wenn ich zwei einfüge gibt es einen Heap error....leider hab ich grad ein Brett vorm Kopf und suche schon Stunden nach dem Fehler....:/
Wäre Super wenn mir jemand helfen könnte!Vielen Dank im vorraus!!!
MFG#include <stdlib.h> #include <stdio.h> #include <string.h> typedef struct addr{ char name[20], address[256]; int age; struct addr *next; }Adress_t; //Um dann einen Datensatz an dei Liste zu anzuhängen brauchen wir eine globale Variable Adress_t *first; Adress_t ElementEinfügen(char *name, char *address,int age) { //Wenn die Liste, quasi First leer ist, ist das Einfügen recht einfach... //sollte die Liste aber schon gefüllt sein, braucht man einen erneuten Zeiger der bist zum //Ende der Liste läuft und das letzte Element sucht, an das angehangen werden kann! Adress_t *ptr; if(first ==NULL) { first = (Adress_t *) malloc(sizeof(first)); strcpy(first->name,name); strcpy(first->address,address); first->age=age; first->next =NULL; //Und nun lassen wir den Zeiger des neu eingefügten Elements wieder auf NULL zeigen um das Ende zu makieren } else //Falls es doch schon Elemente in der Liste gibt, muss ersteinmal das letzte Element ermittelt werden. Hierfür verwenden wir den neuen Zeiger ptr. { ptr = first; //Wir setzten ihn an die gleiche Stelle wie den first Zeiger. while (ptr != NULL) //Wir durchlaufen die Liste bis wir an der letzen Stelle angekommen sind. Dann verlassen wir die Schleife { ptr = ptr->next; } ptr->next =(Adress_t *) malloc(sizeof(ptr)); ptr=ptr->next; //Dann lass ich den ptr Zeiger wieder auf das nächste Element zeigen. //Ich übergebe die Werte an das allokierte Element strcpy(ptr->name,name); strcpy(ptr->address,address); ptr->age=age; ptr->next =NULL; } return *first; } void ausgeben() { Adress_t *ptr; ptr=first; while(ptr !=NULL) { printf("%s %s %d",ptr->name,ptr->address,ptr->age); ptr=ptr->next; } } int main(void) { //Adress_t neueAdress; ElementEinfügen("Matthias","azf",'23'); //ElementEinfügen("Jonas","azf",'22'); //ElementEinfügen("Stef","azf",'13'); //ElementEinfügen("Roberts","azf",'43'); //ElementEinfügen("Paul","azf",'53'); //ElementEinfügen("Peters","azf",'63'); ausgeben(); return 0; }
-
Welchen Wert hat ptr in Zeile 38?
Wenn du es nicht siehst, nimm den Debugger oderprintf("ptr nach while: %p\n", ptr);
-
ich seh grad das der schon bei malloc beim debug sagt, dass der den Ausdruck gar nicht auswerten kann...
sowohl bei adresse, als auch bei age usw...
Wie kann das sein?
-
DirkB schrieb:
Welchen Wert hat ptr in Zeile 38?
Hast du das printf mal vor Zeile 38 eingebaut? Was kommt da raus?
-
http://s1.directupload.net/file/d/3141/9ayqg2qt_jpg.htm hier ein screenshot
-
Und sizeof(ptr) ist die Größe des Pointers (4 oder
und nicht die Größe der struct.
Das gilt ebenso für first.Da meinst du sizeof(*ptr) bzw. sizeof(*first)
-
Whereeaglesdare schrieb:
... hier ein screenshot
Spaßvogel, da ist doch gar kein while.
Das kommt erst im else-Zweig.
-
oh sorry...
Das passiert, wenn man nach stunden programmieren nur noch müde ist
-
also wie sollte es aussehen?
Könntest du den Code korrigieren?
Würde mir sehr helfen!!
Schreibe da bald ne Klausur und muss es wissenVielen Dank im schoneinmal!!
-
while (ptr != NULL) // Die Schleife wird verlassen, wenn ptr GLEICH NULL ist { ptr = ptr->next; } ptr->next = .... // Unde wenn ptr gleich NULL ist, dann funktioniert der Verweis natürlich nicht
Das ist das Problem.
Die Abbruchbedingung ist falsch.
Du bist schon einen Schritt zu weit.Und überleg mal selber.
Du willst in der Liste das Element haben, dessen next auf NULL zeigt.
-
verstehe ehrlichgesagt nicht warum dann z.b. in einem beispiel das so steht:
while(zeiger != NULL) {
printf("|%12s,%-12s| %02d.%02d.%04d|"
"%02d.%02d.%04d|%06ld|\n",
zeiger->name,zeiger->vorname,zeiger->alter.tag,
zeiger->alter.monat,zeiger->alter.jahr,
zeiger->eingest.tag,zeiger->eingest.monat,
zeiger->eingest.jahr,zeiger->gehalt);zeiger=zeiger->next;
}wüsste nicht, was ich anders gemacht habe:/
-
Da greifst du innerhalb der while-Schleife auf die Elemente zu.
Und da gilt ja nochzeiger != NULL
.Nur nach der Schleife ist dann auch
zeiger
gleich NULL.
-
Wenn man (spazieren) geht, dann macht man das normalerweise so:
Solange die Stelle vor mir kein Loch ist, gehe ich weiter.Du machst aber:
Solange die Stelle auf der ich gerade bin kein Loch ist, gehe ich weiter.Kleiner Unterschied, aber so fällst du rein, weil du nicht überprüfst, was vor die liegt.
-
achso
Super vielen Dank für diese gute Hilfe!!!
Ich schaue mir das morgen nochmal in Ruhe an!
Aber langsam wird mir klar, was du meinst!!
DANKESCHÖN!!
LG