|
Hauptseite - Welches System? - Hardware - Software - Emulatoren - |
Internet MausNet Programmieren Verweise Über |
Die folgenden Beispiele zeigen eine doppelt verkettete Liste.
| Sprache | C | Pascal | Modula |
|---|---|---|---|
| Beispiel | dliste.c | dliste.pas | dliste.mod |
/* Da der Datentyp der Liste erst bei einer konkreten Anwendung */ /* feststeht, ist die Liste nur als Beispiel und nicht als Modul */ /* programmiert. */ #include#include typedef long ListeKeyType; typedef struct liste_element { ListeKeyType Key; struct liste_element *Prev; struct liste_element *Next; } ListeElement, *ListeKnoten; typedef ListeKnoten Liste; void ListeCreate(Liste *Wurzel) { *Wurzel=NULL; } int ListeInsert(Liste *Wurzel, ListeKeyType Daten) { ListeKnoten WorkPtr, NewElement; int fertig; /* neues Listenelement erzeugen */ NewElement = malloc(sizeof(ListeKnoten)); if (NewElement != NULL) { NewElement->Key = Daten; /* Listenelement einfuegen */ if (*Wurzel == NULL) { /* Liste ist leer -> als erstes Element einfuegen */ NewElement->Prev = NULL; NewElement->Next = NULL; *Wurzel = NewElement; } else { /* die einzufuegende Stelle suchen */ if (NewElement->Key <= (*Wurzel)->Key) { /* als erstes Element einfuegen, da kleinster Schluessel */ (*Wurzel)->Prev = NewElement; NewElement->Prev = NULL; NewElement->Next = *Wurzel; *Wurzel = NewElement; } else { /* Liste durchlaufen */ WorkPtr = *Wurzel; fertig = 0; while ((WorkPtr->Next != NULL) && !fertig) { if (WorkPtr->Next->Key > NewElement->Key) { /* Der Nachfolger der aktuellen Position hat einen groesseren Schluessel -> einfuegen */ NewElement->Next = WorkPtr->Next; WorkPtr->Next->Prev = NewElement; NewElement->Prev = WorkPtr; WorkPtr->Next = NewElement; fertig = 1; } else /* noch nicht gefunden -> Liste weiter durchsuchen */ WorkPtr = WorkPtr->Next; } if (!fertig) { /* Es wurde in der Liste keine Stelle zum Einfuegen gefunden -> am Ende anhaengen */ NewElement->Prev = WorkPtr; NewElement->Next = NULL; WorkPtr->Next = NewElement; } } } return(1); } else return(0); } int ListeDelete(Liste *Wurzel, ListeKeyType Daten) { ListeKnoten WorkPtr, MerkPtr; int gefunden; gefunden = 0; if (*Wurzel != NULL) { /* Die Liste enthaelt Elemente */ if ((*Wurzel)->Key == Daten) { /* das erste Element ist das gesuchte */ WorkPtr = *Wurzel; *Wurzel = (*Wurzel)->Next; (*Wurzel)->Prev = NULL; free(WorkPtr); gefunden = 1; } else { /* Liste durchsuchen */ WorkPtr = *Wurzel; while ((WorkPtr->Next != NULL) && !gefunden) { /* solange kein Listenende und nicht gefunden */ if (WorkPtr->Next->Key == Daten) { /* Nachfolger des aktuellen Elements ist das gesuchte */ MerkPtr = WorkPtr->Next; MerkPtr->Next->Prev = WorkPtr; WorkPtr->Next = MerkPtr->Next; free(MerkPtr); gefunden = 1; } else /* noch nicht gefunden -> weitersuchen */ WorkPtr = WorkPtr->Next; } } } return(gefunden); } ListeKnoten ListeFinde(Liste Wurzel, ListeKeyType Key) { ListeKnoten WorkPtr; int gefunden; if (Wurzel == NULL) /* die Liste ist leer */ return(NULL); else { gefunden = 0; WorkPtr = Wurzel; while ((WorkPtr != NULL) && !gefunden) { /* solange kein Listenende und nicht gefunden */ if (WorkPtr->Key == Key) /* gefunden */ gefunden = 1; else /* noch nicht gefunden -> weitersuchen */ WorkPtr = WorkPtr->Next; } return(WorkPtr); } }
(* Da der Datentyp der Liste erst bei einer konkreten Anwendung *)
(* feststeht, ist die Liste nur als Beispiel und nicht als Modul *)
(* programmiert. *)
type
ListeKeyType = long_integer;
ListeKnoten = ^ListeElement;
ListeElement = record
Key : ListeKeyType;
Prev : ListeKnoten;
Next : ListeKnoten;
end;
Liste = ListeKnoten;
procedure ListeCreate(var Wurzel:Liste);
begin
Wurzel := nil;
end;
procedure ListeInsert(var Wurzel:Liste; Daten:ListeKeyType);
var
WorkPtr, NewElement : ListeKnoten;
fertig : boolean;
begin
(* neues Listenelement erzeugen *)
new(NewElement);
NewElement^.Key := Daten;
(* Listenelement einfuegen *)
if (Wurzel = nil) then
begin
(* Liste ist leer -> als erstes Element einfuegen *)
NewElement^.Prev := nil;
NewElement^.Next := nil;
Wurzel := NewElement;
end
else
begin
(* die einzufuegende Stelle suchen *)
if (NewElement^.Key <= Wurzel^.Key) then
begin
(* als erstes Element einfuegen, da kleinster Schluessel *)
Wurzel^.Prev := NewElement;
NewElement^.Prev := nil;
NewElement^.Next := Wurzel;
Wurzel := NewElement;
end
>els nil) and not fertig) do
begin
if (WorkPtr^.Next^.Key > NewElement^.Key) then
begin
(* Der Nachfolger der aktuellen Position hat
einen groesseren Schluessel -> einfuegen *)
NewElement^.Next := WorkPtr^.Next;
WorkPtr^.Next^.Prev := NewElement;
NewElement^.Prev := WorkPtr;
WorkPtr^.Next := NewElement;
fertig := true;
end
else
(* noch nicht gefunden -> Liste weiter durchsuchen *)
WorkPtr := WorkPtr^.Next;
end;
if (not fertig) then
begin
(* Es wurde in der Liste keine Stelle zum Einfuegen
gefunden -> am Ende anhaengen *)
NewElement^.Prev := WorkPtr;
NewElement^.Next := nil;
WorkPtr^.Next := NewElement;
end;
end;
end;
end;
procedure ListeDelete(var Wurzel:Liste; Daten:ListeKeyType);
var
WorkPtr, MerkPtr : ListeKnoten;
gefunden : boolean;
begin
if (Wurzel <> nil) then
begin
(* Die Liste enthaelt Elemente *)
if (Wurzel^.Key = Daten) then
begin
(* das erste Element ist das gesuchte *)
WorkPtr := Wurzel;
Wurzel := Wurzel^.Next;
Wurzel^.Prev := nil;
dispose(WorkPtr);
end
else
begin
(* Liste durchsuchen *)
gefunden := false;
WorkPtr := Wurzel;
while ((WorkPtr^.Next <> nil) and not gefunden) do
begin
(* solange kein Listenende und nicht gefunden *)
if (WorkPtr^.Next^.Key = Daten) then
begin
(* Nachfolger des aktuellen Elements ist das gesuchte *)
MerkPtr := WorkPtr^.Next;
MerkPtr^.Next^.Prev := WorkPtr;
WorkPtr^.Next := MerkPtr^.Next;
dispose(MerkPtr);
gefunden := true;
end
else
(* noch nicht gefunden -> weitersuchen *)
WorkPtr := WorkPtr^.Next;
end;
end;
end;
end;
function ListeFinde(Wurzel:Liste; Key:ListeKeyType):ListeKnoten;
var
WorkPtr : ListeKnoten;
gefunden : boolean;
begin
if (Wurzel = nil) then
(* die Liste ist leer *)
ListeFinde := nil
else
begin
gefunden := false;
WorkPtr := Wurzel;
while ((WorkPtr <> nil) and not gefunden) do
begin
(* solange kein Listenende und nicht gefunden *)
if (WorkPtr^.Key = Key) then
(* gefunden *)
gefunden := true
else
(* noch nicht gefunden -> weitersuchen *)
WorkPtr := WorkPtr^.Next;
end;
ListeFinde := WorkPtr;
end;
end;
(* Da der Datentyp der Liste erst bei einer konkreten Anwendung *)
(* feststeht, ist die Liste nur als Beispiel und nicht als Modul *)
(* programmiert. *)
FROM Heap IMPORT Allocate, Deallocate;
FROM SYSTEM IMPORT TSIZE;
TYPE
ListeKeyType = LONGINT;
ListeKnoten = POINTER TO ListeElement;
ListeElement = RECORD
Key : ListeKeyType;
Prev : ListeKnoten;
Next : ListeKnoten;
END;
Liste = ListeKnoten;
PROCEDURE ListeCreate(VAR Wurzel:Liste);
BEGIN
Wurzel := NIL;
END ListeCreate;
PROCEDURE ListeInsert(VAR Wurzel:Liste; Daten:ListeKeyType);
VAR
WorkPtr, NewElement : ListeKnoten;
fertig : BOOLEAN;
BEGIN
(* neues Listenelement erzeugen *)
Allocate(NewElement, TSIZE(ListeElement));
NewElement^.Key := Daten;
(* Listenelement einfuegen *)
IF (Wurzel = NIL) THEN
(* Liste ist leer -> als erstes Element einfuegen *)
NewElement^.Prev := NIL;
NewElement^.Next := NIL;
Wurzel := NewElement;
ELSE
(* die einzufuegende Stelle suchen *)
IF (NewElement^.Key <= Wurzel^.Key) THEN
(* als erstes Element einfuegen, da kleinster Schluessel *)
Wurzel^.Prev := NewElement;
NewElement^.Prev := NIL;
NewElement^.Next := Wurzel;
Wurzel := NewElement;
ELSE
(* List> du NewElement^.Key) THEN
(* Der Nachfolger der aktuellen Position hat
einen groesseren Schluessel -> einfuegen *)
NewElement^.Next := WorkPtr^.Next;
WorkPtr^.Next^.Prev := NewElement;
NewElement^.Prev := WorkPtr;
WorkPtr^.Next := NewElement;
fertig := TRUE;
ELSE
(* noch nicht gefunden -> Liste weiter durchsuchen *)
WorkPtr := WorkPtr^.Next;
END;
END;
IF (NOT fertig) THEN
(* Es wurde in der Liste keine Stelle zum Einfuegen
gefunden -> am Ende anhaengen *)
NewElement^.Prev := WorkPtr;
NewElement^.Next := NIL;
WorkPtr^.Next := NewElement;
END;
END;
END;
END ListeInsert;
PROCEDURE ListeDelete(VAR Wurzel:Liste; Daten:ListeKeyType);
VAR
WorkPtr, MerkPtr : ListeKnoten;
gefunden : BOOLEAN;
BEGIN
IF (Wurzel # NIL) THEN
(* Die Liste enthaelt Elemente *)
IF (Wurzel^.Key = Daten) THEN
(* das erste Element ist das gesuchte *)
WorkPtr := Wurzel;
Wurzel := Wurzel^.Next;
Wurzel^.Prev := NIL;
Deallocate(WorkPtr,TSIZE(ListeElement));
ELSE
(* Liste durchsuchen *)
gefunden := FALSE;
WorkPtr := Wurzel;
WHILE ((WorkPtr^.Next # NIL) AND NOT gefunden) DO
(* solange kein Listenende und nicht gefunden *)
IF (WorkPtr^.Next^.Key = Daten) THEN
(* Nachfolger des aktuellen Elements ist das gesuchte *)
MerkPtr := WorkPtr^.Next;
MerkPtr^.Next^.Prev := WorkPtr;
WorkPtr^.Next := MerkPtr^.Next;
Deallocate(MerkPtr,TSIZE(ListeElement));
gefunden := TRUE;
ELSE
(* noch nicht gefunden -> weitersuchen *)
WorkPtr := WorkPtr^.Next;
END;
END;
END;
END;
END ListeDelete;
PROCEDURE ListeFinde(Wurzel:Liste; Key:ListeKeyType):ListeKnoten;
VAR
WorkPtr : ListeKnoten;
gefunden : BOOLEAN;
BEGIN
IF (Wurzel = NIL) THEN
(* die Liste ist leer *)
RETURN NIL;
ELSE
gefunden := FALSE;
WorkPtr := Wurzel;
WHILE ((WorkPtr # NIL) AND NOT gefunden) DO
(* solange kein Listenende und nicht gefunden *)
IF (WorkPtr^.Key = Key) THEN
(* gefunden *)
gefunden := TRUE;
ELSE
(* noch nicht gefunden -> weitersuchen *)
WorkPtr := WorkPtr^.Next;
END;
END;
RETURN WorkPtr;
END;
END ListeFinde;
|
English version not yet available. |