home *** CD-ROM | disk | FTP | other *** search
- (* ------------------------------------------------- *)
- (* INDEX.PAS *)
- (* (c) 1990, 1992 Horst Zein & DMV-Verlag *)
- (* ------------------------------------------------- *)
- UNIT Index;
-
- INTERFACE
-
- CONST
- MaxKeySize = 10; { natürlich anpassen }
-
- TYPE
- sPointer = ^Schluessel;
-
- Schluessel = RECORD
- Next : sPointer;
- Key : LONGINT;{ evtl. anpassen }
- RecNo : WORD; { LongInt unpassEND }
- END;
-
- VAR
- HeapTop : ^INTEGER; { für Mark, Release }
- Kette : FILE OF Schluessel;
- Find : sPointer;
- s : Schluessel;
- Root : ARRAY [1..MaxKeySize] OF sPointer;
-
- PROCEDURE ReadKette;
-
- PROCEDURE WriteKette;
-
- FUNCTION FindKey (KeyNr : BYTE;
- Key : LongInt) : BOOLEAN;
-
- FUNCTION PrevKey (KeyNr : BYTE;
- stat : sPointer) : sPointer;
-
- FUNCTION NextKey (KeyNr : BYTE;
- stat : sPointer) : sPointer;
-
- PROCEDURE AddKey (KeyNr : BYTE;
- NeuerSatz : Schluessel);
-
- PROCEDURE DelKey (KeyNr : BYTE; era : sPointer);
-
-
- IMPLEMENTATION
-
- VAR
- i : BYTE;
- work, save : sPointer;
-
-
- PROCEDURE ReadKette;
- { Einlesen der Indexstruktur (im Hauptprogramm }
- { "Assign" nicht vergessen!). }
- { Leere Ketten sind mit SatzNummer $FFFF in ersten }
- { Eintrag gekennzeichnet. }
- BEGIN
- FOR i := 1 TO MaxKeySize DO Root[i] := NIL;
- Find := NIL;
- i := 1;
- {$I-}
- Reset(Kette);
- {$I+}
- WHILE (i <= MaxKeySize) AND (IOResult = 0) DO BEGIN
- IF NOT EoF(Kette) THEN BEGIN
- { Init. Kettenanfang }
- New(Find);
- Read(Kette, Find^);
- IF Find^.RecNo <> $FFFF THEN
- { keine leere Kette }
- Root[i] := Find;
- END;
- WHILE (Find^.Next <> NIL) AND
- (Find <> NIL) DO BEGIN
- { Lesen restliche Sätze }
- New(Work);
- Find^.Next := Work;
- Read(Kette, Work^);
- Find := Work;
- END;
- Inc(i); { nächste Kette }
- END;
- END;
-
- PROCEDURE WriteKette;
- { Auslesen der Ketten; leere Strukturen werden mit }
- { Satznummer $FFFF gekennzeichnet (siehe auch }
- { ReadKette) }
- BEGIN
- Rewrite(Kette);
- FOR i := 1 TO MaxKeySize DO BEGIN
- { jeweils eine Struktur }
- IF Root[i] = NIL THEN BEGIN
- s.RecNo := $FFFF; { für Wiedereinlesen }
- s.Next := NIL;
- Write(Kette, s);
- END;
- Find := Root[i]; { auf Anfang und ... }
- WHILE Find <> NIL DO BEGIN
- { alle Einträge auslesen }
- Write(Kette, Find^);
- Find := Find^.Next;
- END;
- END;
- Close(Kette);
- END;
-
- FUNCTION FindKey (KeyNr: BYTE;
- key: LongInt): BOOLEAN;
- { In der Kette "KeyNr" wird der übergebene Schlüssel}
- { gesucht und im Erfolgsfall TRUE, sonst FALSE }
- { zurückgegeben. }
- { Die globale Variable "Find" zeigt auf den }
- { gefundenen Eintrag. }
- BEGIN
- Find := Root[KeyNr];
- WHILE (Find <> NIL) AND (Find^.Key <> Key) DO
- Find := Find^.Next;
- FindKey := Find <> NIL;
- END;
-
- FUNCTION PrevKey (KeyNr : BYTE;
- stat : sPointer) : sPointer;
- { Umsetzen des aktuellen Zeigers auf Vorgänger bzw. }
- { aufletzten falls am Kettenanfang }
- { (d.h. Ringstruktur) }
- BEGIN
- Find := Root[KeyNr];
- WHILE (Find^.Next <> stat) AND
- (Find^.Next <> NIL) DO
- Find := Find^.Next;
- PrevKey := Find;
- END;
-
- FUNCTION NextKey (KeyNr : BYTE;
- stat : sPointer) : sPointer;
- { Umsetzen des aktuellen Zeigers auf Nachfolger bzw.}
- { auf ersten falls am Kettenende (d.h. Ringstruktur)}
- BEGIN
- IF Stat^.Next <> NIL THEN
- NextKey := stat^.Next
- ELSE
- NextKey := Root[KeyNr];
- END;
-
- PROCEDURE AddKey (KeyNr : BYTE;
- NeuerSatz : Schluessel);
- { Einfügen des übergebenen Schlüssels in bestehende }
- Struktur einschließlich Setzen der Verweise }
- BEGIN
- New(Work);
- Work^ := NeuerSatz;
- Work^.Next := NIL;
- Find := Root[KeyNr];
- Save := NIL;
- WHILE Find <> Work^.Next DO
- IF Find^.Key < Work^.Key THEN BEGIN
- { Kriterium evtl. ändern }
- Save := Find;
- Find := Find^.Next;
- END ELSE
- Work^.Next := Find;
- IF Save = NIL THEN
- Root[KeyNr] := Work
- ELSE
- Save^.Next := Work;
- END;
-
- PROCEDURE DelKey (KeyNr : BYTE; era : sPointer);
- { Löschen eines Satzes (ohne Freigabe des Speicher- }
- { platzes) durch Umsetzen der Verweise }
- BEGIN
- Find := Root[KeyNr];
- Save := NIL;
- WHILE Find <> era DO BEGIN
- Save := Find;
- Find := Find^.Next;
- END;
- IF Save = NIL THEN
- Root[KeyNr] := era^.Next
- ELSE
- Save^.Next := era^.Next;
- END;
-
- END.
- (* ------------------------------------------------- *)
- (* Ende von INDEX.PAS *)
-