Einfach verkettete Liste

Schnelle objektorientierte, kompilierende Programmiersprache.
Antworten
WIngET
Beiträge: 1
Registriert: Mo Feb 10, 2020 1:06 am

Einfach verkettete Liste

Beitrag von WIngET » Di Feb 11, 2020 2:59 pm

Hallo , ich bin bisschen neu in der Programmiersprache C, ich habe leider ein riesen Problem mit verkettete Listen. Ich blicke da leider nicht richtig durch. Ich habe hier ein Programm geschrieben , was leider nur den letzten Knotenpunkt ausgibt , statt alle die drin stehen. Ich verstehe leider auch nicht wieso. Ich hoffe jemand kann mir helfen. Ich habe bei jedem Befehl hingeschrieben was dieser Befehl bewirken soll (bzw. Was ich mir erhoffe, dass dieser Befehl macht. Damit eventuell der Fehler schneller gefunden werden kann.

Code: Alles auswählen

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

struct data                     // Innere Struktur
{
    unsigned int nummer;
    char name[42];
    int anzahl;
};

typedef struct node             // Äußere Struktur
{
    struct data daten;
    struct node *next;

}node_t;



node_t *liste;              // Diese Instanz ist der Beginn der Liste. (wird verändert im laufe des Programms)
node_t *knoten;             // Speichert den ersten Knoten und verändert sich nicht mehr (Kopf der Liste)



// Funktion nimmt Variablen für den ersten Knoten entgegen
void erzeuge_knoten(unsigned int nummer, char name[42], int anzahl)
{
    node_t *neu = malloc(sizeof(node_t));   // Temporäres Element, vom typ node_t , bekommt dynamischen Speicher zugwiesen

    // Die durch main übergebende Werte, werden der Variablen der Struktur daten zugewiesen.
    neu->daten.nummer = nummer;
    strcpy(neu->daten.name, name);
    neu->daten.anzahl = anzahl;
    
    neu->next = NULL;   // Dem Zeiger next wird NULL zugewiesen [Da hinter dem letzten Element sich nichts befindet. Das letzte Element muss daher auf NULL zeigen]
    liste = neu;        // Temporäres Element neu , wird zur Anfangsinstanz
    knoten = neu;       // ERSTER Knotenpunkt in der Liste = Kopf der verketteten Liste
}



// Funktion bekommt neue Werte zugewiesen
void anhaengen(unsigned int nummer_neu, char name_neu[42], int anzahl_neu)
{
    node_t *neu = malloc(sizeof(node_t));   // temporären Knoten vom Typ node_t mit der Speichergröße von node_t

    // Variablen bekommen Werte zugewiesen vom Benutzer des Programms
    neu->daten.nummer = nummer_neu;       
    strcpy(neu->daten.name, name_neu);
    neu->daten.anzahl = anzahl_neu;

    neu->next = NULL;   // next zeiger muss auf NULL zeigen, denn hier ist aktuell der letzte Knotenpunkt der Liste
    liste = knoten;     // Liste wieder zum Anfang zurück spulen, da sie sich irgendwo mittendrin befinden könnte (knoten = kopf der liste)

    while(liste != NULL)           
    {
        if(liste->next == NULL)     // Überprüfen ob der nächste Knoten NULL ist
        {
            liste -> next = neu;    // next bekommt neu zugewiesen (Temporäres Element)
            break;                  // wenn das Ende gefunden wurde, dann höre ich auf zu suchen und springe raus aus der Schleife
        }
        else                        // falls das nächste next nicht NULL ist
        {   
            liste = liste->next;    // liste zeigt jetzt auf den nächsten Knoten, so lange bis der Nächste Knoten ein NULL-Zeiger ist (Abbruchbedingung while)
        }
    }
}



// Funktion zur Ausgabe der Liste
void ausgeben()
{
    liste = knoten; // Damit immer zum Kopf (anfang) der Liste gesprungen wird und nicht irgendwo mittendrin angefangen wird.

    while(liste != NULL)    // Schleife soll solange laufen bis es kein Knoten mehr gibt (Sobald NULL erreicht worden ist)
    {
        printf("%03u : %s (%02d) \n" ,liste->daten.nummer ,liste->daten.name ,liste->daten.anzahl); // aktueller Knoten wird ausgegeben
        liste = liste->next;    // Auf next zeigen, damit der nächste Knoten als nächstes abgerufen wird. (nach der Ausgabe des aktuellen Knotens)
    }   
}



int main()
{
    erzeuge_knoten(1, "rot", 10);
    erzeuge_knoten(2, "lila", 5);
    erzeuge_knoten(3, "schwarz", 50);

    ausgeben();

    free(liste);
}
Ich weiss der Code ist nicht der beste und man könnte bestimmt einen effektiveren und besseren Code schreiben aber wie gesagt ich bin neu was das programmieren angeht und wäre auch für jeden Tipp Oder Erklärung sehr dankbar , da ich das Thema noch nicht ganz verstehe.

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8531
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Einfach verkettete Liste

Beitrag von Xin » Di Feb 11, 2020 3:10 pm

Du erzeugst Knoten und erklärst diese zum Anfang der Liste. Sie haben keine Nachfolger.
Du rufst anhaengen nie auf. Entsprechend besteht die Liste immer nur aus einem Element - dem letzten, das Du erzeugt hast.

Was ist der Unterschied zwischen "liste" und "knoten". Kopiere nicht das, was Du da in den Quelltext geschrieben hast, sondern begründe es für Dich, was Du damit machen willst und was Du bei erzeuge_knoten damit machst.

Ansonsten willkommen on Board. :-)
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Antworten