1 | #include <stdio.h>
|
2 |
|
3 | struct Liste
|
4 | {
|
5 | char name; // Daten
|
6 | struct Liste * next; // Zeiger auf naechstes Element
|
7 | };
|
8 |
|
9 | typedef struct Liste * Pliste; // Zeigertype definieren
|
10 |
|
11 | void Element_anhaengen(Pliste, char);
|
12 | Pliste Liste_anlegen(void);
|
13 | Pliste Liste_zerstoeren(Pliste);
|
14 |
|
15 |
|
16 | int main(void) // ANSI C
|
17 | {
|
18 | Pliste top;
|
19 |
|
20 | top = Liste_anlegen();
|
21 | Element_anhaengen(top, 'a');
|
22 | top = Liste_zerstoeren(top);
|
23 | }
|
24 |
|
25 | Pliste Liste_anlegen(void)
|
26 | {
|
27 | // Listenanfang = Leeres Element vom Typ struct Liste anlegen
|
28 | p = (Pliste) malloc(sizeof(struct Liste));
|
29 |
|
30 | if (p != NULL)
|
31 | {
|
32 | // Ausnullen (macht malloc() nicht)
|
33 | p->daten = 0;
|
34 | p->next = NULL;
|
35 | }
|
36 |
|
37 | // Listenanfang merken, d.h. zurückgeben
|
38 | return p;
|
39 | }
|
40 |
|
41 | void Element_anhaengen(Pliste akt, char daten)
|
42 | {
|
43 | if (akt == NULL)
|
44 | return;
|
45 |
|
46 | // Leeres Element am Ende suchen
|
47 | while(akt->next != NULL)
|
48 | {
|
49 | akt = akt->next;
|
50 | }
|
51 |
|
52 | // Daten in letztes, leere Element eintragen
|
53 | akt->daten = daten;
|
54 |
|
55 | // neues leeres Element anhängen
|
56 | akt->next = (Pliste) malloc(sizeof(struct Liste));
|
57 | akt = akt->next;
|
58 |
|
59 | if (akt != NULL)
|
60 | {
|
61 | // Ausnullen (macht malloc() nicht)
|
62 | akt->daten = 0;
|
63 | akt->next = NULL;
|
64 | }
|
65 | }
|
66 |
|
67 | Pliste Liste_zerstoeren(Pliste akt)
|
68 | {
|
69 | while(akt != NULL)
|
70 | {
|
71 | // Zeiger auf ggf. nächstes Element merken
|
72 | Pliste next = akt->next;
|
73 |
|
74 | // aktuelles Element ausnullen
|
75 | akt->daten = 0;
|
76 | akt->next = NULL;
|
77 |
|
78 | // und freigeben
|
79 | free(akt);
|
80 |
|
81 | // und wiederholen mit nächstem Element
|
82 | akt = next;
|
83 | }
|
84 |
|
85 | return akt;
|
86 | }
|
Die Liste wird vom Anfang in Richtung Ende freigegeben, d.h.
widernatürlich im Bezug zum Anlegevorgang (Man sägt nicht am Ast auf dem
man sitzt).
Man könnte das beheben, in dem man eine doppelt verkettete, d.h. auch
rückwärtz verlinkte Liste anlegt oder in dem man mit Rekursion arbeitet.
Code ist ungetestet, lediglich hingeschrieben!