Problem mit doppelt verketteter Liste (neues Element schreiben)
-
hi
Ich habe folgende Ausgangssituation und bekomm es nach etlichen Stunden noch imemr nicht hin.
Ich soll aus einer Textdatei ein paar Daten auslesen (Pfad, Titel, Länge). Es gibt ungefähr 50 solche Einträge. Jeder Einzelne davon soll in einer doppelt verketteten Liste gespeichert werden
Das Auslesen aus der Datei und speichern in den Variablen funktioniert auch gut (mit Debugger kontrolliert). Nur wenn ich die Liste ausgebe bekomme ich 50mal den selben Eintrag angezeigt (der als Letztes eingelesen wurde) Nur die Variable in der die Länge gespeichert ist, ist immer die richtigeHier die Struktur der Liste
typedef struct list { struct list *next; struct list *prev; int laenge; /* Länge des Liedes */ char *titel; /* Titel des Liedes */ char *pfad; /* Pfad des Liedes */ }listNode;
Hier der Code, der zum Einlesen aus der Datei dient
FILE *datei; char temp[100]; /* Temp Arrays um die Strings aus Datei zwischenzuspeichern */ char temp2[100]; char stringsep[] = ":,"; /* Vergleichsstring um den eingelesenen String bei : und , zu trennen */ int stringlength, wert; char *titel, *pfad, *token; listNode* head=NULL; do { fgets(temp, 100, datei); /* Erste Zeile einlesen */ token = strtok(temp, stringsep); /* String beim : trennen */ token = strtok(NULL, stringsep); /* String beim , trennen. In Token steht jetzt die Length Zahl, die man braucht */ if(token == NULL) break; wert = atoi(token); /* Length Zahl in int umwandeln und speichern */ token = strtok(NULL, stringsep); fgets(temp, 100, datei); /* Nächste Zeile einlesen. = PFAD */ stringlength = strlen(token); titel = (char *)malloc(sizeof(stringlength)); titel = token; stringlength = strlen(temp2); pfad = (char *)malloc(sizeof(stringlength)); pfad = temp2; ListInsert(&head, wert, titel, pfad); /* Element in Liste schreiben. */ } while(1);
Und zu guter letzt das schreiben eiens neuen Elementes in die Liste
void ListInsert(listNode **head, int laenge, char *titel, char *pfad) // In Liste Schreiben. { listNode* start = NULL; listNode *zeiger; listNode *zeiger1; if(*head == NULL) { start = (listNode*)malloc(sizeof(listNode)); start->laenge = laenge; start->titel = titel; start->pfad = pfad; start->next = NULL; start->prev = NULL; *head = start; } else { zeiger=*head; while( zeiger->next != NULL) { zeiger = zeiger->next; } zeiger1=zeiger; zeiger = (listNode*)malloc(sizeof(listNode)); zeiger->next = NULL; zeiger->laenge = laenge; zeiger->titel = titel; zeiger->pfad = pfad; zeiger->next = NULL; zeiger->prev = zeiger1; zeiger1->next = zeiger; } }
Ich hoffe ihr könnt mir weiterhelfen. Ich bin mit meinem Latein am Ende
-
beuschl schrieb:
titel = (char *)malloc(sizeof(stringlength)); titel = token;
Hier weist Du titel einen neuen Speicherbereich zu und wirfst diesen direkt in die Tonne. Danach weist Du Titel einen Teil des Lesepuffers zu, in den beim nächsten Lesen mit der nächste Eintrag hineingeschrieben wird.
Achso: Was soll sizeof(stringlength)? Brauchst Du soviel Speicher, wie die Länge des Strings belegt? Denk darüber mal nach
titel = malloc(stringlength + 1); strcpy(titel, token);
-
omg
da hab ich echt mist gebaut^^
danke auf jedenfall für die Hilfe. es funktioniert jetzt.. endlich