home *** CD-ROM | disk | FTP | other *** search
- MODULE Trie;
- (* M.Holzherr, April 88, MacMETH2.4, MacReflex
- Erprobung einer Datenstruktur zur Speicherung
- eines Woerterbuchs. Alle ueber die Tastatur
- eingebenen Worte werden in einem Trie gespeichert.
- Eingabeschlusszeichen ist ein ".". Anschliessend werden
- alle gefundenenWorte alphabetisch geordnet aufgelistet. *)
-
- FROM InOut IMPORT Write, Read, WriteString, WriteLn ;
- FROM Storage IMPORT ALLOCATE;
-
- TYPE TRIE = POINTER TO NODE; (* Zeiger auf
- Woerterbuchknoten *)
- NODE = RECORD
- Char : CHAR;
- wordEnd : BOOLEAN; (* TRUE = Wortende hier *)
- v, h : TRIE (* v-ertikal, h-orizontal *)
- END;
-
-
- VAR ch, Ch : CHAR; (* Ch = CAP(ch) *)
-
- (* -1---- insert liest ein Wort buchstabenweise und
- fuegt es in das Woerterbuch ein, falls es nicht
- schon eingetragen ist. Beim Aufruf muss der erste
- Buchstabe des Wortes schon gelesen sein ------ *)
- PROCEDURE insert( VAR p : TRIE (* in/out *) );
-
- (* -1-1-- make erzeugt neuen Knoten -- *)
- PROCEDURE make( VAR p : TRIE (* out *) );
- BEGIN
- ALLOCATE( p, SIZE( NODE) );
- WITH p^ DO
- Char:= Ch; wordEnd:= FALSE; v:= NIL; h:= NIL
- END;
- END make;
-
- (* -1-2-- readAndInsertNextChar liest und verarbeitet
- das naechste Zeichen ---- *)
- PROCEDURE readAndInsertNextChar;
- BEGIN
- Read(ch); Write(ch); Ch:= CAP(ch);
- IF (Ch >= 'A') & (Ch <= 'Z') THEN
- insert(p^.v)
- ELSE p^.wordEnd:= TRUE
- END;
- END readAndInsertNextChar;
-
-
- VAR q : TRIE;
- BEGIN
- IF p = NIL THEN
- make(p);
- readAndInsertNextChar;
- ELSIF p^.Char > Ch THEN
- make(q); q^.h:= p; p:= q;
- readAndInsertNextChar;
- ELSIF p^.Char < Ch THEN
- insert(p^.h)
- ELSE
- readAndInsertNextChar;
- END
- END insert;
-
-
-
- (* -2-- printTrie schreibt das Woerterbuch alphabetisch
- geordnet, zeilenweise auf das Ausgabemedium -- *)
- VAR S : ARRAY[0..100] OF CHAR;
- (* S[0...level] = Wortteil *)
- PROCEDURE printTrie( p : TRIE; level : INTEGER );
- VAR i : INTEGER;
- BEGIN
- IF p <> NIL THEN
- S[level]:= p^.Char;
- IF p^.wordEnd THEN
- FOR i:= 0 TO level DO Write(S[i]) END; WriteLn;
- END;
- printTrie(p^.v, level + 1);
- printTrie(p^.h, level );
- END
- END printTrie;
-
- VAR t : TRIE;
- BEGIN (* Trie. Test mit Tastatureingabe *)
- t:= NIL;
- WriteString('Beliebig viele Worte eingeben (keine Umlaute)');
- WriteString(' Abschluss durch Eingabe von "." ');
- WriteLn; WriteLn;
- REPEAT
- Read(ch); Write(ch); Ch:= CAP(ch);
- IF (Ch >= 'A') & (Ch <= 'Z') THEN
- insert(t)
- END
- UNTIL ch = ".";
- WriteLn; WriteLn; printTrie(t, 0);
- Read(ch)
- END Trie.
-
-
-
-
-
-
-
-