1 /************************* toolbox/chain.h *************************************
3 Copyright (c) 1997 A. Krall, R. Grafl, M. Gschwind, M. Probst
5 See file COPYRIGHT for information on usage and disclaimer of warranties
7 dient zur Verwaltung doppelt verketteter Listen mit externer Verkettung
9 Authors: Reinhard Grafl EMAIL: cacao@complang.tuwien.ac.at
11 Last Change: 1996/10/03
13 *******************************************************************************/
15 typedef struct chainlink { /* Struktur f"ur ein Listenelement */
16 struct chainlink *next,*prev;
20 typedef struct chain { /* Struktur f"ur eine Liste */
23 chainlink *first,*last;
30 void chain_free(chain *c);
32 void chain_addafter(chain *c, void *element);
33 void chain_addbefore(chain *c, void *element);
34 void chain_addlast (chain *c, void *element);
35 void chain_addfirst (chain *c, void *element);
37 void chain_remove(chain *c);
38 void *chain_remove_go_prev(chain *c);
39 void chain_removespecific(chain *c, void *element);
41 void *chain_next(chain *c);
42 void *chain_prev(chain *c);
43 void *chain_this(chain *c);
45 void *chain_first(chain *c);
46 void *chain_last(chain *c);
50 --------------------------- Schnittstellenbeschreibung ------------------------
52 Bei Verwendung dieser Funktionen f"ur die Listenverwaltung mu"s, im
53 Gegenstatz zum Modul 'list', keine zus"atzliche Vorbereitung in den
54 Element-Strukturen gemacht werden.
56 Diese Funktionen sind daher auch ein wenig langsamer und brauchen
59 Eine neue Liste wird mit
62 angelegt. Der Unterschied ist, da"s bei der zweiten Variante alle
63 zus"atzlichen Datenstrukturen am DUMP-Speicher angelegt werden (was
64 schneller geht, und ein explizites Freigeben am Ende der Verarbeitung
65 unn"otig macht). Dabei mu"s man aber achtgeben, da"s man nicht
66 versehentlich Teile dieser Strukturen durch ein verfr"uhtes 'dump_release'
69 Eine nicht mehr verwendete Liste kann mit
71 freigegeben werden (nur verwenden, wenn mit 'chain_new' angefordert)
74 Das Eintragen neuer Elemente geht sehr einfach mit:
75 chain_addafter, chain_addlast, chain_addbefore, chain_addfirst
77 Durchsuchen der Liste mit:
78 chain_first, chain_last, chain_prev, chain_next, chain_this
80 L"oschen von Elementen aus der Liste:
81 chain_remove, chain_remove_go_prev, chain_removespecific
84 ACHTUNG: In den zu verkettenden Elementen gibt es ja (wie oben gesagt) keine
85 Referenzen auf die Liste oder irgendwelche Listenknoten, deshalb k"onnen
86 die Elemente nicht als Ortsangabe innerhalb der Liste fungieren.
87 Es gibt vielmehr ein Art 'Cursor', der ein Element als das gerade
88 aktuelle festh"alt, und alle Ein-/und Ausf"ugeoperationen geschehen
89 relativ zu diesem Cursor.