Problem mit verketteter liste

wolly84

Grünschnabel
Habe versucht eine verkettete liste zu erstellen. An sich klappt auch alles gut nur wenn ich dann die neu eingefügte struktur anhöngen will macht er das nur im unterprogramm aber nicht im hauptprogramm. Wäre gut wenn einer ne idee hätte was ich falsch gemacht habe.

Hauptprogramm
Code:
#include "header.h"


void main()
    {
    struct altersliste* liste;
    struct altersliste* start = 0;
    FILE* datei;


    datei = fopen("inhalt.txt", "r");


    liste = daten_lesen(datei);
    einfügen(liste, start);

    printf("%s", start->name);

    free(liste);
    free(start);
    }
Unterprogramm
Code:
#include "header.h"


struct altersliste* daten_lesen(FILE* datei)
    {
    struct altersliste* l1;
    char name[50];
    int alter;
    
    fscanf(datei,"%s %d", name, &alter);
    l1 = (struct altersliste*) malloc (sizeof(struct altersliste));
    l1->name = (char *) malloc (strlen(name)+1);
    strcpy (l1->name, name);
    l1->alter = alter;

    return l1;
    }

void einfügen(struct altersliste* liste, struct altersliste* start)
    {
    liste->next = start;
    start = liste;
    return;
    }
Headerdatei
Code:
#ifndef HEADER_H
#define HEADER_H

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct altersliste
    {
    struct altersliste *next;
    char *name;
    int alter;
    };

struct altersliste* daten_lesen(FILE* datei);
void einfügen(struct altersliste* liste, struct altersliste* start);

#endif
 
Code:
void einfügen(struct altersliste* liste, struct altersliste* start)
    {
    liste->next = start;
    start = liste;  // <- Fehler
    return;
    }

Du übergibst an dieser Stelle Zeiger "by Value", das heist der Zeiger "start" hier ist eine Kopie des Zeigers den du übergibst, nicht der Zeiger selbst. Da start also nur eine lokale Kopie des zeigers ist, den du im Hauptprogramm übergibst und diese lokale Kopie am Ende der Funktion gelöscht wird, ist die Zuweisung die du machst (start=liste) nur innerhalb der einfügen-Funktion sichtbar und geht dann verloren.

Lösungen:

1. start muß ein Zeiger auf einen Zeiger sein (struct altersliste** start) dadurch ändert sich entsprechend der Aufruf.

2. start muß eine Referenz von einem Zeger sein (wobei das in reinem C nicht geht)

3. Die funktion einfügen muß den Zeiger zurückgeben damit die zuweisung in der hauptfunktion gemacht werden kann
 

Neue Beiträge

Zurück