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