Permalink
Browse files

Merge branch 'master' of marvin.informatik.uni-stuttgart.de:git/ada

  • Loading branch information...
2 parents 31a1106 + 8657e86 commit f8352e9c7473fd591108af48ad8255dffbb28379 @ceemos committed Dec 24, 2011
Showing with 226 additions and 18 deletions.
  1. +160 −5 ringlist.adb
  2. +66 −13 ringlist_test.adb
View
@@ -4,30 +4,55 @@
-- @Version : 1
-- @Created : 17. 12. 2011
-- @Author : Marcel Schneider
--- Compile: gnatmake -g ringlist_test.adb
--- Run: ./ringlist_test
+-- Compile: gnatmake -g ringlist_test.adb
+-- Run: ./ringlist_test
-------------------------------------------------------------------------------
--
--
with Ada.Text_IO;
use Ada.Text_IO;
package body Ringlist is
+ -- @Procedure: New_List
+ --
+ -- Initialisiert eine Liste.
+ --
+ -- @Parameter:
+ -- + L: Die Liste
+ --
procedure New_List (L : out List) is
begin
L := new Anchor;
L.First := null;
L.Size := 0;
end New_List;
+ -- @Procedure: Insert
+ --
+ -- Fuegt ein Element in eine Liste ein. Das Element wird so eingefuegt,
+ -- dass die El. der groesse nach geordnet sind.
+ --
+ -- @Parameter:
+ -- + L: Die Liste
+ -- + E: Das neue Element
+ --
procedure Insert (L : in List; E : in Element_Type) is
Temp : Ref_Element;
+ -- @Procedure: Insert_In_Order
+ --
+ -- Geht rekursiv durch die Liste bis die Stlle zum Einsetzen gefunden
+ -- ist.
+ --
+ -- @Parameter:
+ -- + Element: Das Aktuelle Element
+ -- + Count: Anzahl der noch folgenden Elemente
+ --
procedure Insert_In_Order (Element : Ref_Element; Count : Integer) is
begin
if (Element.Content < E and E < Element.Next.Content)
or ((Element.Content < E) = (E < Element.Content)) -- istgleich
- or Count = 1
- then
+ or Count = 1
+ then
-- Einfuegen
Temp.Next := Element.Next;
Element.Next := Temp;
@@ -37,10 +62,14 @@ package body Ringlist is
L.First := Temp;
end if;
else
- Insert_In_Order(Element.Next, Count - 1);
+ Insert_In_Order (Element.Next, Count - 1);
end if;
end Insert_In_Order;
begin
+ if L = null then
+ raise Empty_List_Error;
+ end if;
+
Temp := new Listelement;
Temp.Content := E;
-- 1. Element der Liste
@@ -56,14 +85,44 @@ package body Ringlist is
end Insert;
+ -- @Procedure: Clear
+ --
+ -- Leert eine Liste
+ --
+ -- @Parameter:
+ -- + L: die zu leerende Liste
+ --
procedure Clear (L : in List) is
begin
+ if L = null then
+ raise Empty_List_Error;
+ end if;
L.First := null;
L.Size := 0;
end Clear;
+ -- @Function: Contains
+ --
+ -- Prueft, ob ein El. in einer Liste enthalten ist.
+ --
+ -- @Parameter:
+ -- + L: die Liste
+ -- + E: das Gesuchte Elemnet
+ --
+ -- @Return: True, wenn das El. gefunden wurde.
+ --
function Contains (L : in List; E : in Element_Type) return Boolean is
+ -- @Function: Find
+ --
+ -- Prueft rekursiv die folgenden Elemente
+ --
+ -- @Parameter:
+ -- + Element: das Aktuelle Element
+ -- + Count: die Anzahl noch folgender Elemente
+ --
+ -- @Return: True, wenn das El. gefunden wurde.
+ --
function Find (Element : Ref_Element; Count : Natural) return Boolean is
begin
if Element.Content = E then
@@ -72,11 +131,35 @@ package body Ringlist is
return Count > 0 and then Find (Element.Next, Count - 1);
end Find;
begin
+ if L = null then
+ raise Empty_List_Error;
+ end if;
return L.First /= null and then Find (L.First, L.Size);
end Contains;
+ -- @Function: Equals
+ --
+ -- Vergleicht zwei Listen.
+ --
+ -- @Parameter:
+ -- + L1: die eine Liste
+ -- + L2: die Andere Liste.
+ --
+ -- @Return: True, wenn die Listen den selben Inhalt haben.
+ --
function Equals (L1, L2 : in List) return Boolean is
+ -- @Function: Compare
+ --
+ -- vergleicht rekursiv die noch folgenden Elemente
+ --
+ -- @Parameter:
+ -- + Element_Left: das aktuelle El. der einen Liste
+ -- + Element_Right: das aktuelle El. der anderen Liste
+ -- + Count: die Anzahl noch folgender Elemente
+ --
+ -- @Return: True, wenn die Listen ab dem aktuellen El. gleich sind.
+ --
function Compare (Element_Left, Element_Right : Ref_Element;
Count : Integer) return Boolean is
begin
@@ -89,19 +172,47 @@ package body Ringlist is
end Compare;
begin
+ if L1 = null or L2 = null then
+ raise Empty_List_Error;
+ end if;
if L1.Size /= L2.Size then
return False;
end if;
return Compare (L1.First, L2.First, L1.Size);
end Equals;
+ -- @Function: Is_Empty
+ --
+ -- Prueft, ob eine Liste Leer ist.
+ --
+ -- @Parameter:
+ -- + L: die Liste
+ --
+ -- @Return: True, wenn die Liste 0 Elemente enthaelt.
+ --
function Is_Empty (L : in List) return Boolean is
begin
return L.First = null;
end Is_Empty;
+ -- @Procedure: Remove
+ --
+ -- Entfernt das 1. El. das gleich dem gesuchten ist.
+ --
+ -- @Parameter:
+ -- + L: die Liste
+ -- + E: das gesuchte Element
+ --
procedure Remove (L : in List; E : in Element_Type) is
+ -- @Procedure: Find_And_Remove
+ --
+ -- Sucht rekursiv nach dem Element und entfert es.
+ --
+ -- @Parameter:
+ -- + Element: das Aktuelle Element der Liste
+ -- + Count: die Anzahl noch folgender Elemente
+ --
procedure Find_And_Remove (Element : Ref_Element; Count : Integer) is
begin
if Element.Next.Content = E then
@@ -118,6 +229,9 @@ package body Ringlist is
end if;
end Find_And_Remove;
begin
+ if L = null then
+ raise Empty_List_Error;
+ end if;
if L.Size /= 0 then
Find_And_Remove (L.First, L.Size);
if L.Size = 0 then
@@ -126,7 +240,23 @@ package body Ringlist is
end if;
end Remove;
+ -- @Procedure: Remove_All
+ --
+ -- Entfernt alle Elmente aus der Liste, die gleich dem ges. Element sind.
+ --
+ -- @Parameter:
+ -- + L: die Liste
+ -- + E: das gesuchte Element
+ --
procedure Remove_All (L : in List; E : in Element_Type) is
+ -- @Procedure: Find_And_Remove
+ --
+ -- Sucht rekursiv nach dem Element und entfert es.
+ --
+ -- @Parameter:
+ -- + Element: das Aktuelle Element der Liste
+ -- + Count: die Anzahl noch folgender Elemente
+ --
procedure Find_And_Remove (Element : Ref_Element; Count : Integer) is
begin
-- Leere Liste erkennen
@@ -148,6 +278,9 @@ package body Ringlist is
end if;
end Find_And_Remove;
begin
+ if L = null then
+ raise Empty_List_Error;
+ end if;
if L.Size /= 0 then
Find_And_Remove (L.First, L.Size);
if L.Size = 0 then
@@ -156,14 +289,36 @@ package body Ringlist is
end if;
end Remove_All;
+ -- @Function: Size
+ --
+ -- Gibt die Anzahl Elemente in der Lsite zurueck.
+ --
+ -- @Parameter:
+ -- + L: die Liste
+ --
+ -- @Return: die Anzahl Elemente
+ --
function Size (L : in List) return Natural is
begin
+ if L = null then
+ raise Empty_List_Error;
+ end if;
return L.Size;
end Size;
+ -- @Procedure: Put
+ --
+ -- Gibt den Inhalt der Liste aus.
+ --
+ -- @Parameter:
+ -- + L: die Liste
+ --
procedure Put (L : in List) is
Current : Ref_Element;
begin
+ if L = null then
+ raise Empty_List_Error;
+ end if;
Current := L.First;
while Current /= null and then Current.Next /= L.First loop
Put (Current.Content);
Oops, something went wrong.

0 comments on commit f8352e9

Please sign in to comment.