Advertisement
Guest User

Untitled

a guest
Mar 30th, 2020
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pascal 4.18 KB | None | 0 0
  1. program HashTable;
  2. type
  3.   link = ^node;
  4.   node = record
  5.       key: integer;
  6.       str: string;
  7.       next: link;
  8.       prev: link;
  9.     end;
  10.  
  11.   var Table : array of link;
  12.   Gcommand : string;
  13.   Gsize : integer;
  14.   Gkey : integer;
  15.   Gdata : string;
  16.   Gi : integer;
  17.   GRfind : link;
  18.   GRinsert : boolean;
  19.   GRdelete : boolean;
  20.   Gview : link;
  21. function Hash(key : integer): integer;
  22. begin
  23.   Hash := key mod Gsize;
  24. end;
  25.  
  26. function Find(key : integer) : link;
  27. var hk : integer;
  28. begin
  29.    hk := Hash(key);
  30.    Find := Table[hk];
  31.    while Find <> nil do
  32.    begin
  33.       if Find^.key = key then
  34.          exit;
  35.       Find := Find^.next;
  36.    end;
  37. end;
  38.  
  39. function Insert(key : integer; data :string) : boolean;
  40. var newData : link;
  41. var hk : integer;
  42. begin
  43.      if Find(key) = nil then
  44.         begin
  45.              hk := Hash(key);
  46.              new(newData);
  47.              newData^.key := key;
  48.              newData^.str := data;
  49.              newData^.next := nil;
  50.              newdata^.prev := nil;
  51.              if Table[hk] <> nil then
  52.                 begin
  53.                      newData^.next := Table[hk];
  54.                      newData^.next^.prev := newData;
  55.                 end;
  56.              Table[hk] := newData;
  57.              Insert := true;
  58.         end
  59.      else
  60.          Insert := false;
  61. end;
  62.  
  63. function Delete(key : integer) : boolean;
  64. var hk : integer;
  65. var data : link;
  66. begin
  67.    hk := Hash(key);
  68.    Delete := false;
  69.    if Table[hk] <> nil then
  70.          begin
  71.            if Table[hk]^.key = key then
  72.               begin
  73.                    Table[hk] := Table[hk]^.next;
  74.                    Delete := true;
  75.               end
  76.            else
  77.                begin
  78.                  data := Find(key);
  79.                  if data <> nil then
  80.                     begin
  81.  
  82.                        if data^.prev <> nil then
  83.                           data^.prev^.next := data^.next;
  84.                        if data^.next <> nil then
  85.                           data^.next^.prev := data^.prev;
  86.                        Delete := true;
  87.                     end;
  88.                end;
  89.          end;
  90. end;
  91.  
  92.  
  93. begin
  94.     WriteLn('Enter size of table:');
  95.     ReadLn(Gsize);
  96.     SetLength(Table, Gsize);
  97.     for Gi := 0 to Gsize - 1 do
  98.         Table[Gi] := nil;
  99.     while true do
  100.     begin
  101.        WriteLn();
  102.        WriteLn('Enter command (insert, find, delete, view, exit):');
  103.        ReadLn(Gcommand);
  104.        if Gcommand = 'exit' then
  105.           break;
  106.        if Gcommand = 'insert' then
  107.           begin
  108.             WriteLn('Enter key:');
  109.             ReadLn(Gkey);
  110.             WriteLn('Enter string data:');
  111.             ReadLn(Gdata);
  112.             GRinsert := Insert(Gkey, Gdata);
  113.             if GRinsert then
  114.                WriteLn('Successful insert data')
  115.             else
  116.                WriteLn('Error insert, key already exist')
  117.           end;
  118.        if Gcommand = 'find' then
  119.           begin
  120.             WriteLn('Enter key:');
  121.             ReadLn(Gkey);
  122.             GRfind := Find(Gkey);
  123.             if GRfind = nil then
  124.                WriteLn('Not found')
  125.             else
  126.                WriteLn(GRfind^.str);
  127.           end;
  128.        if Gcommand = 'delete' then
  129.           begin
  130.             WriteLn('Enter key:');
  131.             ReadLn(Gkey);
  132.             GRdelete := Delete(Gkey);
  133.             if GRdelete then
  134.                WriteLn('Successful delete data')
  135.             else
  136.                WriteLn('Not exist');
  137.           end;
  138.        if Gcommand = 'view' then
  139.           begin
  140.           WriteLn('key: value');
  141.           WriteLn('----------');
  142.             for Gi := 0 to Gsize-1 do
  143.                 begin
  144.                      if Table[Gi] = nil then
  145.                         WriteLn('null')
  146.                      else
  147.                         begin
  148.                           Gview := Table[Gi];
  149.                              while Gview <> nil do
  150.                                begin
  151.                                   Write(Gview^.key, ': ', Gview^.str, ' -> ');
  152.                                   Gview := Gview^.next;
  153.                                end;
  154.                                WriteLn('null')
  155.                         end;
  156.                 end;
  157.           end;
  158.     end;
  159. end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement