| 
 | 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. |