home *** CD-ROM | disk | FTP | other *** search
- (* ------------------------------------------------------ *)
- (* INDEX.PAS *)
- (* (c) 1990 Horst Zein & TOOLBOX *)
- (* ------------------------------------------------------ *)
- 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 Satz-
- nummer $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 ge-
- sucht 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. auf
- letzten 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 Speicherplatzes)
- 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 *)