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 *******************************************************************************/
18 typedef struct chainlink { /* Struktur f"ur ein Listenelement */
19 struct chainlink *next,*prev;
23 typedef struct chain { /* Struktur f"ur eine Liste */
26 chainlink *first,*last;
33 void chain_free(chain *c);
35 void chain_addafter(chain *c, void *element);
36 void chain_addbefore(chain *c, void *element);
37 void chain_addlast (chain *c, void *element);
38 void chain_addfirst (chain *c, void *element);
40 void chain_remove(chain *c);
41 void *chain_remove_go_prev(chain *c);
42 void chain_removespecific(chain *c, void *element);
44 void *chain_next(chain *c);
45 void *chain_prev(chain *c);
46 void *chain_this(chain *c);
48 void *chain_first(chain *c);
49 void *chain_last(chain *c);
53 --------------------------- Schnittstellenbeschreibung ------------------------
55 Bei Verwendung dieser Funktionen f"ur die Listenverwaltung mu"s, im
56 Gegenstatz zum Modul 'list', keine zus"atzliche Vorbereitung in den
57 Element-Strukturen gemacht werden.
59 Diese Funktionen sind daher auch ein wenig langsamer und brauchen
62 Eine neue Liste wird mit
65 angelegt. Der Unterschied ist, da"s bei der zweiten Variante alle
66 zus"atzlichen Datenstrukturen am DUMP-Speicher angelegt werden (was
67 schneller geht, und ein explizites Freigeben am Ende der Verarbeitung
68 unn"otig macht). Dabei mu"s man aber achtgeben, da"s man nicht
69 versehentlich Teile dieser Strukturen durch ein verfr"uhtes 'dump_release'
72 Eine nicht mehr verwendete Liste kann mit
74 freigegeben werden (nur verwenden, wenn mit 'chain_new' angefordert)
77 Das Eintragen neuer Elemente geht sehr einfach mit:
78 chain_addafter, chain_addlast, chain_addbefore, chain_addfirst
80 Durchsuchen der Liste mit:
81 chain_first, chain_last, chain_prev, chain_next, chain_this
83 L"oschen von Elementen aus der Liste:
84 chain_remove, chain_remove_go_prev, chain_removespecific
87 ACHTUNG: In den zu verkettenden Elementen gibt es ja (wie oben gesagt) keine
88 Referenzen auf die Liste oder irgendwelche Listenknoten, deshalb k"onnen
89 die Elemente nicht als Ortsangabe innerhalb der Liste fungieren.
90 Es gibt vielmehr ein Art 'Cursor', der ein Element als das gerade
91 aktuelle festh"alt, und alle Ein-/und Ausf"ugeoperationen geschehen
92 relativ zu diesem Cursor.