| 
 | Hauptseite - Welches System? - Hardware - Software - Emulatoren - | Internet MausNet Programmieren Verweise Über | 
Die folgenden Beispiele zeigen eine Queue.
| Sprache | C | Pascal | Modula | 
|---|---|---|---|
| Beispiel | queue.c | queue.pas | queue.mod | 
/* Da der Datentyp der Queue erst bei einer konkreten Anwendung */ /* feststeht, ist die Queue nur als Beispiel und nicht als Modul */ /* programmiert. Mit mehr Aufwand knnte man auch Zeiger auf die */ /* Daten (in Pascal ber variante Records als long_integer) ab- */ /* speichern und damit eine universelle Queue implementieren. */ #include#include #include typedef long QueueDataType; typedef struct queue_element { QueueDataType Daten; struct queue_element *Next; } QueueElement, *QueueKnoten; typedef struct { QueueKnoten First, Last; } Queue; void QueueCreate(Queue *MyQueue) { MyQueue->First = NULL; MyQueue->Last = NULL; } int QueueIsEmpty(Queue *MyQueue) { return(MyQueue->First == NULL); } void QueueAdd(Queue *MyQueue, QueueDataType Daten) { QueueKnoten NewElement; NewElement = malloc(sizeof(QueueElement)); NewElement->Daten = Daten; NewElement->Next = NULL; if (QueueIsEmpty(MyQueue)) { MyQueue->First = NewElement; MyQueue->Last = NewElement; } else { (MyQueue->Last)->Next = NewElement; MyQueue->Last = NewElement; } } void QueueGet(Queue *MyQueue, QueueDataType *Daten) { if (!QueueIsEmpty(MyQueue)) *Daten = MyQueue->First->Daten; } void QueueRemove(Queue *MyQueue) { QueueKnoten OldElement; if (!QueueIsEmpty(MyQueue)) { OldElement = MyQueue->First; if (MyQueue->First == MyQueue->Last) { MyQueue->First = NULL; MyQueue->Last = NULL; } else MyQueue->First = MyQueue->First->Next; free(OldElement); } } 
(* Da der Datentyp der Queue erst bei einer konkreten Anwendung  *)
(* feststeht, ist die Queue nur als Beispiel und nicht als Modul *)
(* programmiert. Mit mehr Aufwand knnte man auch Zeiger auf die *)
(* Daten (in Pascal ber variante Records als long_integer) ab-  *)
(* speichern und damit eine universelle Queue implementieren.    *)
type
   QueueDataType = long_integer;
   QueueKnoten = ^QueueElement;
   QueueElement = record
      Daten : QueueDataType;
      Next : QueueKnoten;
   end;
   Queue = record
      First, Last : QueueKnoten;
   end;
procedure QueueCreate(var MyQueue:Queue);
begin
   MyQueue.First := nil;
   MyQueue.Last := nil;
end;
function QueueIsEmpty(MyQueue:Queue):boolean;
begin
   QueueIsEmpty := MyQueue.First=nil;
end;
procedure QueueAdd(var MyQueue:Queue; Daten:QueueDataType);
var
   NewElement : QueueKnoten;
begin
   new(NewElement);
   NewElement^.Daten := Daten;
   NewElement^.Next := nil;
   if QueueIsEmpty(MyQueue) then
   begin
      MyQueue.First := NewElement;
      MyQueue.Last := NewElement;
   end
   else
   begin
      MyQueue.Last^.Next := NewElement;
      MyQueue.Last := NewElement;
   end;
end;
procedure QueueGet(MyQueue:Queue; var Daten:QueueDataType);
begin
   if not QueueIsEmpty(MyQueue) then
      Daten := MyQueue.First^.Daten;
end;
procedure QueueRemove(var MyQueue:Queue);
var
   OldElement : QueueKnoten;
begin
   if not QueueIsEmpty(MyQueue) then
   begin
      OldElement := MyQueue.First;
      if MyQueue.First = MyQueue.Last then
      begin
         MyQueue.First := nil;
         MyQueue.Last := nil;
      end
      else
         MyQueue.First := MyQueue.First^.Next;
      dispose(OldElement);
   end;
end;
MODULE Queue;
(* Da der Datentyp der Queue erst bei einer konkreten Anwendung  *)
(* feststeht, ist die Queue nur als Beispiel und nicht als Modul *)
(* programmiert. Mit mehr Aufwand knnte man auch Zeiger auf die *)
(* Daten (in Pascal ber variante Records als long_integer) ab-  *)
(* speichern und damit eine universelle Queue implementieren.    *)
FROM Heap IMPORT Allocate, Deallocate;
FROM SYSTEM IMPORT TSIZE;
TYPE
   QueueDataType = LONGINT;
   QueueKnoten = POINTER TO QueueElement;
   QueueElement = RECORD
      Daten : QueueDataType;
      Next : QueueKnoten;
   END;
   Queue = RECORD
      First, Last : QueueKnoten;
   END;
PROCEDURE QueueCreate(VAR MyQueue:Queue);
BEGIN
   MyQueue.First := NIL;
   MyQueue.Last := NIL;
END QueueCreate;
PROCEDURE QueueIsEmpty(MyQueue:Queue) : BOOLEAN;
BEGIN
   RETURN MyQueue.First=NIL;
END QueueIsEmpty;
PROCEDURE QueueAdd(VAR MyQueue:Queue; Daten:QueueDataType);
VAR
   NewElement:QueueKnoten;
BEGIN
   Allocate(NewElement, TSIZE(QueueElement));
   NewElement^.Daten := Daten;
   NewElement^.Next := NIL;
   IF QueueIsEmpty(MyQueue) THEN
      MyQueue.First := NewElement;
      MyQueue.Last := NewElement;
   ELSE
      MyQueue.Last^.Next := NewElement;
      MyQueue.Last := NewElement;
   END;
END QueueAdd;
PROCEDURE QueueGet(MyQueue:Queue; VAR Daten:QueueDataType);
BEGIN
   IF NOT QueueIsEmpty(MyQueue) THEN
      Daten := MyQueue.First^.Daten;
   END;
END QueueGet;
PROCEDURE QueueRemove(VAR MyQueue:Queue);
VAR
   OldElement : QueueKnoten;
BEGIN
   IF NOT QueueIsEmpty(MyQueue) THEN
      OldElement := MyQueue.First;
      IF MyQueue.First = MyQueue.Last THEN
         MyQueue.First := NIL;
         MyQueue.Last := NIL;
      ELSE
         MyQueue.First := MyQueue.First^.Next;
      END;
      Deallocate(OldElement, TSIZE(QueueElement));
   END;
END QueueRemove;
|   | English version not yet available. |