home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Programming Tool Box
/
SIMS_2.iso
/
bp_2_94
/
vbdos
/
pointer.bas
next >
Wrap
BASIC Source File
|
1994-04-09
|
5KB
|
153 lines
DECLARE SUB Liste1_Ausgabe (BYVAL Pointer AS INTEGER)
DECLARE SUB Liste1_Delete (BYVAL Pointer AS INTEGER)
DECLARE SUB Liste1_Dispose (BYVAL Pointer AS INTEGER)
DECLARE SUB Liste1_Init ()
DECLARE SUB Liste1_Insert (BYVAL NachPointer AS INTEGER, BYVAL WasPointer AS INTEGER)
DECLARE SUB Liste1_New (Pointer AS INTEGER)
DECLARE FUNCTION Liste1_Finde (BYVAL Pointer AS INTEGER, BYVAL Zeichen AS STRING) AS INTEGER
' POINTER.BAS - Demoprogramm für Listenverwaltung
TYPE Liste1_Typ
Wert AS STRING * 1
Prev AS INTEGER
Next AS INTEGER
END TYPE
DIM SHARED Liste1() AS Liste1_Typ
DIM NeuZeiger AS INTEGER, Zeiger AS INTEGER
DIM Char AS STRING
Liste1_Init
PRINT
PRINT "Eingabe der Startdaten"
DO
INPUT " Buchstaben eingeben (Leer=Ende): ", Char
IF Char = "" THEN EXIT DO
' Ein neues Element im Array erzeugen (es wird noch
' nicht in die Liste eingetragen)
Liste1_New Zeiger
' Den Buchstaben zuweisen und das Element an letzter
' Stelle [Liste1(0).Prev = letztes Element] in die
' Liste eintragen lassen
Liste1(Zeiger).Wert = Char
Liste1_Insert Liste1(0).Prev, Zeiger
LOOP
PRINT "Inhalt der Liste:": PRINT " ";
Liste1_Ausgabe Liste1(0).Next
INPUT "Welches Element löschen:", Char
Zeiger = Liste1_Finde(Liste1(0).Next, Char)
IF Zeiger = 0 THEN
PRINT " Gibt's nicht"
ELSE
PRINT " Adresse des gefundenen Elements:"; Zeiger
Liste1_Delete Zeiger
PRINT " Neue Liste:": PRINT " ";
Liste1_Ausgabe (Liste1(0).Next)
END IF
INPUT "Nach welchem Element einfügen:", Char
Zeiger = Liste1_Finde(Liste1(0).Next, Char)
IF Zeiger = 0 THEN
PRINT " Gibt's nicht - Einfügen am Anfang"
ELSE
PRINT " Adresse des gefundenen Elements:"; Zeiger
END IF
INPUT " Welches Zeichen einfügen:", Char
Liste1_New NeuZeiger: Liste1(NeuZeiger).Wert = Char
Liste1_Insert Zeiger, NeuZeiger
PRINT " Neue Liste:": PRINT " ";
Liste1_Ausgabe (Liste1(0).Next)
' Ausgabe einer Liste auf dem Schirm
SUB Liste1_Ausgabe (BYVAL Pointer AS INTEGER)
IF Pointer = 0 THEN PRINT : EXIT SUB
PRINT Liste1(Pointer).Wert; " ";
Liste1_Ausgabe Liste1(Pointer).Next
END SUB
' Löschen eines Elements aus der Liste mit Umbiegen
' der Zeiger. Das Element verbleibt aber zunächst im
' Array und wird erst von DISPOSE gelöscht.
SUB Liste1_Delete (BYVAL Pointer AS INTEGER)
Liste1(Liste1(Pointer).Prev).Next = Liste1(Pointer).Next
Liste1(Liste1(Pointer).Next).Prev = Liste1(Pointer).Prev
Liste1_Dispose Pointer
END SUB
' DISPOSE: Löschen eines Elements aus dem Array
SUB Liste1_Dispose (BYVAL Pointer AS INTEGER)
DIM Grenze AS INTEGER
Grenze = UBOUND(Liste1)
IF Pointer < Grenze THEN
' Wenn nicht das letzte Element gelöscht wird,
' muß das letzte Element umkopiert werden, um
' Speicherplatz freigeben zu können
Liste1(Liste1(Grenze).Prev).Next = Pointer
Liste1(Liste1(Grenze).Next).Prev = Pointer
Liste1(Pointer) = Liste1(Grenze)
END IF
Grenze = Grenze - 1
REDIM PRESERVE Liste1(0 TO Grenze) AS Liste1_Typ
END SUB
' Findet das erste Element, dessen "Wert" gleich dem
' gegebenen Zeichen ist, und gibt seinen Pointer zurück.
' Beginnt mit der Suche erst bei der übergebenen Adresse.
FUNCTION Liste1_Finde (BYVAL Pointer AS INTEGER, BYVAL Zeichen AS STRING) AS INTEGER
IF Pointer = 0 THEN
' Liste schon zu Ende - keine Aktion
ELSEIF Liste1(Pointer).Wert = Zeichen THEN
' Gefunden! Adresse zurückgeben:
Liste1_Finde = Pointer
ELSE
' Nicht gefunden, aber Liste geht weiter:
Liste1_Finde = Liste1_Finde(Liste1(Pointer).Next, Zeichen)
END IF
END FUNCTION
' Initialisiert die Liste. Das Element Nr. 0 dient als
' Kontroll-Element, sein Next-Pointer zeigt auf das erste,
' sein Prev-Pointer auf das letzte Element der Liste.
SUB Liste1_Init ()
REDIM Liste1(0 TO 0) AS Liste1_Typ
Liste1(0).Prev = 0: Liste1(0).Next = 0
END SUB
' Fügt das Element, auf das der Pointer "WasPointer"
' zeigt, hinter dem Listenelement "NachPointer" ein
SUB Liste1_Insert (BYVAL NachPointer AS INTEGER, BYVAL WasPointer AS INTEGER)
Liste1(WasPointer).Next = Liste1(NachPointer).Next
Liste1(Liste1(WasPointer).Next).Prev = WasPointer
Liste1(WasPointer).Prev = NachPointer
Liste1(NachPointer).Next = WasPointer
END SUB
' Einfuegen eines neuen Elements am Ende des Arrays
' (Wo innerhalb der Liste das Element eingefügt wird,
' ist hier nicht festgelegt, dazu muss erst INSERT
' aufgerufen werden!)
SUB Liste1_New (Pointer AS INTEGER)
Pointer = UBOUND(Liste1) + 1
REDIM PRESERVE Liste1(0 TO Pointer) AS Liste1_Typ
END SUB