All pastes #886831 Raw Edit

oink

public text v1 · immutable
#886831 ·published 2008-01-31 23:22 UTC
rendered paste body
with Ada.Text_IO;
use Ada.Text_IO;

package body Search_Trees is

   procedure Create (Anchor : in out Ref_Cell)
   is
   
   begin
      Anchor := null;
   end Create;

--  Suchen ob es das gleiche Element schon gibt Ergebnis gibt aus ob es etwas
--  gefunden hat;
   function Search (Anchor : Ref_Cell; Eingabe : Ref_Cell) return Boolean
   is
      Zeiger1 : Ref_Cell;
      Gefunden : Boolean := False;
      NGefunden : Boolean := False;
      Ergebnis : Boolean := False;
      Vergleich : Integer := 0;
   begin
      Zeiger1 := Anchor;
      if Zeiger1 /= null then
         while Gefunden = False or NGefunden = False loop
            if Zeiger1.Inhalt < Eingabe.Inhalt then
               if Zeiger1.Right /= null then
                  Zeiger1 := Zeiger1.Right;
               else
                  NGefunden := True;
               end if;
               Vergleich := Vergleich + 1;
            else
               if Zeiger1.Left /= null then
                  Zeiger1 := Zeiger1.Left;
               else
                  NGefunden := True;
               end if;
               Vergleich := Vergleich + 1;
            end if;
            if Zeiger1.Inhalt = Eingabe.Inhalt then
               Gefunden := True;
            end if;
         end loop;
      end if;
      NGefunden := True;
      if Gefunden = True then
         Ergebnis := True;
      end if;
      Put ("Anzahl der benoetigten Vergleiche : " & Vergleich'Img);
      return Ergebnis;
   end Search;
   
--  Sucht nach der Stelle wo man das Zusaetzliche Element einfuegen kann und
--  fuegt es ein wenn es das Element noch nicht gibt;
   procedure Insert (Anchor : in out Ref_Cell; Eingabe : Ref_Cell)
   is
      Eingesetzt : Boolean := False;
      Ergebnis : Boolean := False;
      Zeiger1 : Ref_Cell;
      Vergleich : Integer := 0;
   begin
      Zeiger1 := Anchor;
      if Zeiger1 /= null then
         Ergebnis := Search (Anchor, Eingabe);
         if Ergebnis = False then
            while Eingesetzt = False loop
               if Zeiger1.Inhalt < Eingabe.Inhalt then
                  if Zeiger1.Right /= null then
                     Zeiger1 := Zeiger1.Right;
                  else
                     Zeiger1.Right := Eingabe;
                     Eingesetzt := True;
                  end if;
                  Vergleich := Vergleich + 1;
               else
                  if Zeiger1.Left /= null then
                     Zeiger1 := Zeiger1.Left;
                  else
                     Zeiger1.Left := Eingabe;
                     Eingesetzt := True;
                  end if;
                  Vergleich := Vergleich + 1;
               end if;
            end loop;
         end if;
      else
         Zeiger1 := Eingabe;
      end if;
      Anchor := Zeiger1;
      Put ("Anzahl der Vergleiche zum Einfuegen: " & Vergleich'Img);
   end Insert;

   procedure BaumH (Anchor : Ref_Cell)
   is
      Zeiger1 : Ref_Cell;
      ZeigerPrev : Ref_Cell;
   begin
      Zeiger1 := Anchor;
      while Zeiger1.Left /= null loop
         ZeigerPrev := Zeiger1;
         Zeiger1 := Zeiger1.Left;
         Hoehe1 := HoeheH + 1;
      end loop;
      Zeiger1 := ZeigerPrev;
      Hoehe2 := Hoehe1;
      if Zeiger1.Right /= null then
         Zeiger1 := Zeiger1.Right;
         while Zeiger1 /= null loop
            ZeigerPrev := Zeiger1;
            Zeiger1 := Zeiger1.Left;
            Hoehe2 := Hoehe2 + 1;
         end loop;
      else
--  noch nicht fertig... überlegung wie man den baum absucht..das nach der while schleife verbessern!!
         null;
      end if;
end Search_Trees;