Advertisement
Guest User

Untitled

a guest
Feb 24th, 2017
102
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Ada 6.87 KB | None | 0 0
  1. ---------------------------------------bst ads------------------------------------------------
  2.  
  3. generic
  4.  
  5.    type Element_Type is private;       -- The type of element in the list
  6.    type Key_Type is limited private;   -- The type of key in the element
  7.    with function Key_Of (Element: Element_Type) return Key_Type;
  8.    with function "=" (Left, Right: Key_Type) return Boolean;
  9.    with function "<" (Left, Right: Key_Type) return Boolean;
  10.  
  11. package Binary_Search_Tree is
  12.  
  13.    type Tree_Type is limited private;
  14.  
  15.    type Traversal_Order is (Inorder, Preorder, Postorder);
  16.  
  17.    No_Key : exception;
  18.  
  19.    procedure Insert (Tree : in out Tree_Type;
  20.                      Item : in     Element_Type);
  21.  
  22.    function Retrieve (Tree: Tree_Type;
  23.                        Key: Key_Type) return Element_Type;
  24.  
  25.    generic
  26.  
  27.       with procedure Process (Element : in out Element_Type);
  28.  
  29.    procedure Traverse (Tree  : in out Tree_Type;
  30.                        Order : in Traversal_Order);
  31.  
  32. private
  33.  
  34.    type Node_Type;                       -- Incomplete type declaration
  35.  
  36.    type Tree_Type is access Node_Type;   -- Access to a node
  37.    subtype Node_Ptr is Tree_Type;        -- A synonym for our access type
  38.  
  39.    type Node_Type is                     -- Complete type declaration
  40.       record
  41.          Info  : Element_Type;    -- One element
  42.          Left  : Node_Ptr;        -- Link to left child
  43.          Right : Node_Ptr;        -- Link to right child
  44.       end record;
  45.  
  46. end Binary_Search_Tree;
  47.  
  48.  
  49. ----------------------------------bst adb---------------------------------------------
  50.  
  51.  
  52. with Ada.Text_IO;
  53. use Ada.Text_IO;
  54. package body Binary_Search_Tree is
  55.  
  56.  
  57.    procedure Insert (Tree: in out Tree_Type; Item: in Element_Type) is
  58.    begin
  59.       if Tree = null then
  60.          Tree := new Node_Type'(Info=>Item, Left=>null, Right=>null);
  61.       elsif Key_Of (Item) = Key_Of (Tree.Info) then
  62.          Put("That number is already in the tree!");
  63.       elsif Key_of (Item) < Key_Of (Tree.Info) then
  64.          Insert (Tree => Tree.Left, Item => Item);
  65.       else
  66.          Insert (Tree => Tree.Right, Item => Item);
  67.       end if;
  68.    end Insert;
  69.  
  70.  
  71.  
  72.    function Retrieve (Tree: Tree_Type;
  73.                       Key :  Key_Type) return Element_Type is
  74.    begin
  75.       if Tree = null then
  76.          Put("No value found!");
  77.          raise No_Key;
  78.       elsif Key = Key_Of (Tree.Info) then
  79.          return (Tree.Info);
  80.       elsif Key < Key_Of (Tree.Info) then
  81.          return (Retrieve (Tree => Tree.Left, Key => Key));
  82.       else
  83.          return (Retrieve (Tree => Tree.Right, Key => Key));
  84.       end if;
  85.    end Retrieve;
  86.  
  87.  
  88.  
  89.    procedure Traverse (Tree  : in out Tree_Type;
  90.                        Order : in Traversal_Order) is
  91.  
  92.  
  93.       procedure Checked_Process (Element: in out Element_Type) is
  94.          New_Element: Element_Type := Element;
  95.       begin
  96.          Process (New_Element);
  97.          if Key_Of (Element) /= Key_Of (New_Element) then
  98.             Put("No value found!");
  99.             raise No_Key;
  100.          else
  101.             Element := New_Element;
  102.          end if;
  103.       end Checked_Process;
  104.  
  105.  
  106.       procedure Inorder (Tree : in Tree_Type) is
  107.       begin
  108.          if Tree /= null then
  109.             --Put_Line(Retrieve(Tree, Integer));
  110.             Inorder (Tree => Tree.Left);    -- Traverse Left subtree
  111.             Checked_Process (Tree.Info);
  112.             Inorder (Tree => Tree.Right);   -- Traverse Right subtree
  113.          end if;
  114.       end Inorder;
  115.  
  116.       procedure Preorder (Tree : in Tree_Type) is
  117.       begin
  118.          if Tree /= null then
  119.             Inorder (Tree => Tree.Left);    -- Traverse Left subtree
  120.             Checked_Process (Tree.Info);
  121.             Inorder (Tree => Tree.Right);   -- Traverse Right subtree
  122.          end if;
  123.       end Preorder;
  124.  
  125.       procedure Postorder (Tree : in Tree_Type) is
  126.  
  127.  
  128.       begin
  129.          if Tree /= null then
  130.             Inorder (Tree => Tree.Right);  -- Traverse Left subtree
  131.             Inorder (Tree => Tree.Right); -- Traverse Right subtree
  132.             Checked_Process (Tree.Info);
  133.          end if;
  134.       end Postorder;
  135.  
  136.    begin -- Traverse
  137.       case Order is
  138.          when Inorder   => Inorder (Tree);
  139.          when Preorder  => Preorder (Tree);
  140.          when Postorder => Postorder (Tree);
  141.       end case;
  142.    end Traverse;
  143.  
  144. end Binary_Search_Tree;
  145.  
  146. --------------------------------------------------main adb-------------------------------------------
  147.  
  148. with Binary_Search_Tree;
  149.  
  150.  
  151. -- this package contains our basic IO functions such as Put, Get and New_Line
  152. with Ada.Text_IO;
  153. use Ada.Text_IO;
  154. with Ada.Integer_text_io;
  155. use Ada.Integer_text_io;
  156. with Ada.Exceptions;
  157. use Ada.Exceptions;
  158.  
  159.  
  160. procedure Main is
  161.   -- signals that we are ready to begin coding.
  162.   -- we use the space between the procedure declaration and the begin keyword
  163.   -- to specify any local variables we will need for the procedure as they
  164.   -- are not allowed to be declarated after the keyword begin
  165.  
  166.  
  167.    function My_Key_Of (A: Integer) return Integer
  168.    is begin
  169.       return A;
  170.    end My_Key_Of;
  171.  
  172.    procedure My_Process (B: in out Integer)
  173.    is begin
  174.       put(Integer'Image(B));
  175.    end My_Process;
  176.  
  177.    MAX_Switch : Integer:=1;
  178.  
  179.    procedure My_Process_MAX (C: in out Integer)
  180.    is begin
  181.       if MAX_Switch = 1 then
  182.          put(Integer'Image(C));
  183.          MAX_Switch:=0;
  184.       end if;
  185.    end My_Process_MAX;
  186.  
  187.    MIN_Switch : Integer:=1;
  188.  
  189.    procedure My_Process_MIN (D: in out Integer)
  190.    is begin
  191.       if MIN_Switch = 1 then
  192.          put(Integer'Image(D));
  193.          MIN_Switch:=0;
  194.       end if;
  195.    end My_Process_MIN;
  196.  
  197.  
  198. package My_Tree is new Binary_Search_Tree(Integer, Integer, My_Key_of, Standard."=", Standard."<");
  199.  
  200.  i: Integer;
  201.  mytree : My_Tree.Tree_Type;
  202.  order : My_Tree.Traversal_Order;
  203.  
  204.    procedure My_Traverse is new My_Tree.Traverse (My_Process);
  205.    procedure My_Traverse_MAX is new My_Tree.Traverse (My_Process_MAX);
  206.    procedure My_Traverse_MIN is new My_Tree.Traverse (My_Process_MIN);
  207. --procedure mytraverse is new My_Tree.Traverse(mytree, order);
  208.  
  209.  
  210.  
  211.  
  212. begin
  213.  
  214.    Put("Please enter a single digit number, ranging from 1-9, and press enter. Entering 0 will stop the input.");
  215.  
  216. loop
  217.  
  218.       Get(i);
  219.       exit  when i = 0;
  220.       if i > 10 then
  221.          Put("Please, PLEASE make sure your number is a single digit.");
  222.       elsif i < 0 then
  223.          Put("Please, PLEASE make sure your number is a positive digit.");
  224.       else
  225.          My_Tree.Insert(mytree, i);
  226.          Ada.Text_IO.New_Line;
  227.       end if;
  228.  
  229.  
  230. end loop;
  231.  
  232.    --My_Tree.Inorder(mytree);
  233.    My_Traverse(mytree, My_Tree.Inorder);
  234.             Ada.Text_IO.New_Line;
  235.    My_Traverse_MIN(mytree, My_Tree.Preorder);
  236.             Ada.Text_IO.New_Line;
  237.  
  238.    My_Traverse_MAX(mytree, My_Tree.Postorder);
  239.    --My_Traverse(mytree, My_Tree.Preorder);
  240.  
  241.  
  242.  
  243.  
  244.  
  245.  
  246.    Ada.Text_IO.New_Line;
  247.  
  248.  
  249.  
  250. -- end our Main procedure
  251. end Main;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement