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);
}