Pointer für verkette Liste
-
Hallo
Ich versuche eine verkette Liste in C zu implementieren um vorallem meine Fähigkeiten im Umgang mit Pointern zu verbessern.
Dazu habe ich folgende Struktur:
struct entry { char name; struct entry *next; }*start ; void addEntry(char** name) { struct entry *current = start; struct entry *new_entry = (struct entry*) malloc(sizeof(struct entry)); new_entry->name = *name; new_entry->next = NULL; while(current->next != NULL) current = current->next; current->next = new_entry; }
Der start-Pointer soll den Anfang der Liste repräsentieren.
Die addEntry-Funktion soll einen Wert übergeben bekommen, für welchen Ich dann ein neuen entry erzeuge und diesen hinten an hänge.Der Aufruf sieht etwa so aus:
int main(void) { char *ptr = "abc"; for(int i=66; i <=90; i++) { addEntry(ptr); } ... }
Was mache ich falsch?Was ist hier der richtige Lösungsansatz?
Danke schonmal!
-
Zwei Sachen:
1. Der Cast bei malloc ist unnötig
2. addEntry erwartet einen char**, du übergibst ihm einen char*
Beim nächsten mal schreibe bitte genau den Fehler dabei. Was du gemacht hast dürfte zu einem Segmentation Fault geführt haben. Hättest dud as dabeigeschrieben wäre die Fehlersuche wesentlich einfacher gewesen
-
Hab unten im Code par Dinge geändert, siehe Kommentare.
struct entry { char* name; // Hier möchtest du wahrscheinlich einen string und nicht nur einen einzelnen character, darum char* verwenden struct entry *next; }*start ; void addEntry(char* name) // Hier willst du ja ein Array von characters übergeben, also nur ein * und nicht zwei { struct entry *current = start; struct entry *new_entry = (struct entry*) malloc(sizeof(struct entry)); new_entry->name = name; // Hier kannst du dann den Dereferenzierungsoperator * weglassen new_entry->next = NULL; while(current->next != NULL) current = current->next; current->next = new_entry; } int main(void) { char *ptr = "abc"; for(int i=66; i <=90; i++) { addEntry(ptr); } }
Scheint so zu funktionieren. Habs aber nicht getestet.
-
Hallo,
Danke für die schnelle Hilfe!
Nachdem ich den code gemäß eurer Anweisung folgend modifiziert habe, sieht er so aus:
struct entry { char *name; struct entry *next; }*start ; void addEntry(char* name) { struct entry *current = start; struct entry *new_entry = (struct entry*) malloc(sizeof(struct entry)); new_entry->name = name; new_entry->next = NULL; while(current->next != NULL) current = current->next; current->next = new_entry; } int main(void) { char *ptr = "abc"; for(int i=66; i <=90; i++) { addEntry(ptr); } .... }
Gibt er quasi noch eine Warnung:
verkette_liste.c:46: Warnung: veraltete Konvertierung von Zeichenkettenkonstante in »char*«
Wie sollte man hier denn eigentlich vorgehen?Will ja sauberen Code produzieren!
Außerdem bekomme ich leider noch einen Segmenation Fault
-
verkette_liste.c:46: Warnung: veraltete Konvertierung von Zeichenkettenkonstante in »char*«
Der Fehler ist in Zeile 46. Also sind die ... falsch.
-
Tja, dann sei froh, dass es knallt.
So bemerkst du wenigstens Fehler.
Und der Fehler wird beim Deferenzieren eines NULL Zeigers geworfen, d.h. also beim erstmaligencurrent->next