Problem mit verketteter Liste
-
Bei dem nachfolgenden Programm sollen die Zeilen einer Textdatei eingelesen und in ein verkettete Liste geschrieben werden. Mein Problem is, dass nichts ausgegeben wird und ich nichts finde warum das so ist. Ich hoffe jmd kann mir helfen. (das Struct ist so vorgegeben):
#include<stdio.h> #include<stdlib.h> #include<string.h> struct element{ struct element *next; char *zeichenkette; } main(){ char i[100], *z; struct element *k, *start=NULL, *lauf=NULL; z=fgets(i,sizeof(i)+1,stdin); while(z!=NULL){ k = malloc(sizeof(struct element)); k->zeichenkette = z; k->next = NULL; if(start==NULL){ start=k; lauf=k; }else{ lauf-> next = k; lauf = k; } z=fgets(i,sizeof(i)+1,stdin); } lauf = start; while(lauf!=NULL){ fputs(lauf->zeichenkette,stdout); lauf = lauf-> next; } }
später soll dann noch sortiert werden aber das ist ne andere Geschichte und dürfte kein Problem sein.
-
1. main muss den Rückgabewert int haben ("int main()").
2. die struct-Definition muss mit einem Semikolon abgeschlossen werden.
3. Solltest du für z nicht auch Speicher allozieren (malloc)?
...to be continued...
-
ja das mit z hat mich auch gewundert:)
-
_matze schrieb:
1. main muss den Rückgabewert int haben ("int main()").
2. die struct-Definition muss mit einem Semikolon abgeschlossen werden.
3. Solltest du für z nicht auch Speicher allozieren (malloc)?
...to be continued...
zu 1. hab bisher in keinem Programm den Rückgabewert int gehabt und die haben alle funktioniert.
zu 2. ok hab ich vergessen, ändert aber leider nichts.
zu 3. wenn ich mir jedes eingelesene z ausgeben lasse sind es die Zeilen. muss wohl beim erzeugen der Liste hängen.
hier mal die Ausgabe mit meiner Testtextdatei:
hallo 5 ich 6 aber 1 kanndt 7 orte 9 leipzig 8 zeichen 10 beruf 2 ellen 4 berufe 3
die ersten 10 Zeilen sind die Ausgabe von z und danach folgen 12 Leerzeilen.
-
_matze schrieb:
3. Solltest du für z nicht auch Speicher allozieren (malloc)?
und dann mit dem rückgabewert von 'fgets' überschreiben?
nene, das lassen wir mal lieber bleiben.
-
memoryleak-freak schrieb:
_matze schrieb:
3. Solltest du für z nicht auch Speicher allozieren (malloc)?
und dann mit dem rückgabewert von 'fgets' überschreiben?
nene, das lassen wir mal lieber bleiben.
Ah, ok. Hab noch nie mit fgets gearbeitet ((deshalb war meine Anmerkung auch vorsichtig als Frage formuliert
), und mir kam das einfach spanisch vor...
Liqid schrieb:
zu 1. hab bisher in keinem Programm den Rückgabewert int gehabt und die haben alle funktioniert.
Ja, ich weiß, dass das eigentlich nie Probleme macht. Trotzdem ist es falsch. main muss einen int-Wert zurückgeben, so ist es definiert. Außerdem nimmt man sich ja auch ein Stück Funktionalität weg (Returncode von main kann ja weiterverwendet werden, z.B. in BAT-Datei).
-
die zeile
z=fgets(i,sizeof(i)+1,stdin);
muss heissen
z=fgets(i,sizeof(i),stdin);so.
und hier bekommst du definitiv probleme:
k->zeichenkette = z;du muss nämlich für k->zeichenkette speicherplatz reservieren, nämlich
(strlen(z)+1) * sizeof(char) byte
und dann
strcpy( k->zeichenkette, z );im prinizp brauchst du z garnicht:
if ( NULL == fgets(i,sizeof(i),stdin) )
return 1; // fehlerund dann weiter unten
k->zeichenkette = malloc( strlen(i)+1 );
strcpy( k->zeichenkette, i );eventuell vorher noch das '\n' aus dem i-puffer entfernen
die verkettung würde ich auslagern
mfgk.
-
thx, jetzt funzt es^^.
naja auslagern tu ich es nicht... kommt ja nur noch nen sortier algoritmus rein...
aber danke nochmal