verkette Liste mit Funktion erzeugen
-
Hallo Leute.
Ich wollte eine einfach verkettete Liste mit einer Funktion erzeugen. das Problemist allerdings, dass ich als Ausgabe immer noch eine Zahl "hinten dran" ausgegeben bekomme.
typedef struct _zahlliste { int ziffer ; struct _zahlliste * next; } zahlenliste; void eintragen(zahlenliste **pointer, int wert){ zahlenliste *zeiger=*pointer; while(zeiger->next!=NULL) zeiger=zeiger->next; zeiger=(zahlenliste *) malloc(sizeof(zahlenliste)); if(zeiger->next==NULL) return; zeiger->ziffer=wert; zeiger->next=NULL; printf("%d\n",zeiger->ziffer); *pointer=zeiger; } int main(){ zahlenliste *zeiger; zeiger->next=NULL; eintragen(&zeiger, 42); eintragen(&zeiger, 22);
Als Ausgabe (siehe Befehl in Zeile 21) bekomme ich "42 22 0". Wie kommt das zustande?
Gruß und schonmal Danke!
-
Als Ausgabe (siehe Befehl in Zeile 21) bekomme ich "42 22 0".
Ich einen Segfault. Wirst wohl an eine böse Stelle schreiben.
-
als kleiner tipp wenn du dir das letzte element merkst dann brauchst es nicht immer wieder zu suchen
while(zeiger->next!=NULL) zeiger=zeiger->next;
oder du fügst dann einfach in der mitte ein...
typedef struct _zahlliste { int ziffer; struct _zahlliste *next; }zahlenliste; zahlenliste *eintragen(zahlenliste *last, int wert){ zahlenliste *ret = malloc(sizeof(zahlenliste)); if(ret != NULL){ ret->ziffer = wert; if(last->next == NULL) ret->next = NULL; else ret->next = last->next; last->next = ret; } return ret; } void plot(zahlenliste *first){ while(last != NULL){ printf("%d\n",last->ziffer); last = last->next; } } int main(void){ zahlenliste root; root.next = NULL; root.ziffer = 0; zahlenliste *zeiger = root; zeiger = eintragen(zeiger, 42); zeiger = eintragen(zeiger, 42); plot(root.next); }
hoffe das klappt so wenn nicht sag bescheid
btw. kpl wie die ausgabe zustande kommt "42 22 0"
lg lolo
-
µngbd schrieb:
Als Ausgabe (siehe Befehl in Zeile 21) bekomme ich "42 22 0".
Ich einen Segfault. Wirst wohl an eine böse Stelle schreiben.
Und zwar gleich in Z 30. Nicht schwer zu finden.
-
zahlenliste *zeiger = &root; statt zahlenliste *zeiger = root;
hoffe da sind nicht noch mehr fehler...
-
So habe nochmal komplett umgestellt und in 2 Fälle aufgeteilt:
1. wenn die Liste leer ist
2. wenn die Liste nicht leer istvoid eintragen(zahlenliste **pointer, int wert){ if(*pointer==NULL) { *pointer=(zahlenliste *) malloc(sizeof(zahlenliste)); if(*pointer==NULL) return; (*pointer)->ziffer=wert; (*pointer)->next=NULL; } else { zahlenliste *hilf=*pointer; while(hilf->next!=NULL) hilf=hilf->next; hilf->next=(zahlenliste *) malloc(sizeof(zahlenliste)); if(hilf->next==NULL) return; hilf->ziffer=wert; hilf->next=NULL; } } int main(){ zahlenliste *zeiger=NULL; eintragen(&zeiger, 42); eintragen(&zeiger, 22); eintragen(&zeiger, 33); printf("%d\n",zeiger->ziffer); return 0; }
Allerdings bekomme ich die Ausgabe nicht hin, weil mein Zeiger immer auf das letzte Element zeigt. Ich frage mich warum, weil ja eigentlich der übergebene Zeiger nicht verändert wird, außer die Liste ist leer.
-
1. du brauchst keinen zeiger auf nen zeiger zu übergeben das ist überflüssig
[/cpp]void eintragen(zahlenliste *pointer, int wert){[cpp]
dann kannst in der function eintragen schon mal min. 6 entfernen und klammern kannst dir auch schenken, schau dir doch einfach mal meinen letzten post an auch wenns kein musterbeispiel für gute programmierung ist, aber laufen sollts schon...
-
uiii
void plot(zahlenliste *first){ while(first != NULL){ printf("%d\n",first->ziffer); first = first->next; } } statt void plot(zahlenliste *first){ while(last != NULL){ printf("%d\n",last->ziffer); last = last->next; } }
-
@ nobblolo
wenn ich doch den anfang verändern möchte worauf der zeiger zeigt muss ich doch den doppelten übergeben oder nicht? weil sonst könnte ich den zeiger doch nicht verändern, an erster stelle
EDIT: sry nooblolo
-
nee du kannst da übergeben was du willst du wirst aus ner einfach verketteten liste nie den vorgänger bekommen, das geht nur wit einer doppelt verketteten liste
was man machen kann:
einfach verkettet
-------- knoten ---------->doppelt verkettet
<------- knoten ---------->du mußt aber mindestens einen einfachen zeiger übergeben weil sonst die structur zahlenliste in die function kopiert wird und deine veränderung von "hilf.next" (der punkt deshalb weil hilf eine kopie und kein zeiger ist) würde beim verlassen der function einfach verworfen außer du kopierst die structur zahlenliste mit einem return wieder raus aber das macht fast keiner evtl. ;fricky ....