segmentation fault bei einfach verkettete listen
-
huhu gemeine
Also hätte ein Problem, ich schreibe mir zur Zeit eine einfach verlinkte Liste.
Nur hänge ich gerade daran wieso ich diesen Segmentation fault kriege:
hier meine main:
#include <iostream> #include "kette.h" int main () { int lauf= 10; while(lauf != 0 ){ hinzu(lauf); --lauf; } ausgeben(); }
hier meine kette.h:
struct list{ int id; struct list *next; } *head; void hinzu(int id){ if(head == NULL){ //hier in den nächsten 3 zeilen muss er sein ... std::cout << "1" << std::endl; head->id = id; std::cout << "1" << std::endl; head->next = NULL; std::cout << "1" << std::endl; }else{ struct list* llist; llist=head; while(llist->next != NULL) // wird durchgeschaut wann next = 0 llist=llist->next; llist->id = id; llist->next = NULL; } } void ausgeben(){ struct list *llist; llist = head; while(llist->next != NULL ) // solange bis das letzte Listenelement durch ist { int nr = 0; std::cout << nr << ":" << llist->id << std::endl; ++nr; } } #endif /* _KETTE_H */
Danke schonmal im voraus
-
Schön, dass du den Fehler so eingrenzen konntest. Oft sieht man hier hunderte von Zeilen irrelevanten Code, teilweise sogar externe Verlinkungen.
if(head == NULL){ head->id = id;
Hier liegt das Problem. Wenn
head
ein Nullzeiger ist, darfst du ihn nicht dereferenzieren (was du mit->
aber tust). Wahrscheinlich willst du sowas erreichen:if (head == NULL) head = new list; // ... // und nach Gebrauch freigeben delete head;
Übrigens: Dafür
int lauf= 10; while(lauf != 0 ){ hinzu(lauf); --lauf; }
gibts eine For-Schleife.
for (int lauf = 10; lauf != 0; --lauf) hinzu(lauf);
Ach ja, es heisst "voraus". Und weshalb sind wir gemein? :p
-
new problem, wieso geht der bei mir nicht in die while schleife?!
habe mal da als Test die Variable "nr" ausgegeben und gab nix aus ...void hinzu(int id){ if(head == NULL){ head= new list; head->id = id; head->next = NULL; }else{ struct list* llist; llist = new list; llist=head; while(llist->next != NULL) // wird durchgeschaut wann next = 0 {llist = llist->next;} llist = new list; llist->id = id; llist->next = NULL; }
-
guck mal noch mal in deinem C++-Buch nach, was new macht - du verwendest es hier zumindest einmal vollkommen sinnlos (im else-zweig).
das sollte aber einfach nur nen memory-leak erzeugen und nicht zu deinem beschriebenen problem führen.
zeig mal die ausgabe her - vll findet sich ja dort ein fehler...ansonsten:
void hinzu(int id) { if(head == NULL) { head = new list; head->id = id; head->next = NULL; //normalerweise werden diese 3 Zielen über einen Konstruktor in einer Zeile erledigt return; //übersichtlicher als der lange else zweig, aber wohl geschmackssache } list* last = head; while(last->next != NULL) { last = last->next; } last->next = new list; last->next->id = id; last->next->next = NULL; }
es sieht so aus, als ob man das new und die beiden zuweisungen nur einmal schreiben müsste - aber iwie komm ich gerad nicht auf die schnelle auf die idee, wie rum man das angehen sollte...
bb
-
danke dir unskilled werde es dann gleich versuchen.
Zur Ausgabe es existiert keine, da das Konsolenfenster leer ist :s
-
demonking schrieb:
danke dir unskilled werde es dann gleich versuchen.
Zur Ausgabe es existiert keine, da das Konsolenfenster leer ist :s
ich meinte den quellcode zur ausgabe... ^^
das hinzufügen sollte so auf jeden fall funktionieren