@Porto_b

Не могу дописать нормально программу?

Алгоритм хеш таблицы методом цепочек, после выполнение следующих команд:
...
Init;
ADD('abc');
ADD('abs');
ADD('bcd');
ADD('cde');
...

Должно получиться нечто этого:5de28ef758e9d764727658.jpeg
Сам код, у меня где то ошибка в функции ADD() добавления или поиска S(), не могу понять. Кто сможет помочь?
Ошибку предполагаю в результате функции S() когда она должна возвращать пустую ссылку на следующий элемент списка (Result := b) . Если вместо w := b; записать z.n := b; то данные заполняется, но если еще добавить данные то во втором элементе списка перезаписываются уничтожая предыдущий, значит я не правильно получаю ссылку на следующий элемент из функции поиска S()
program Project2;

{$APPTYPE CONSOLE}

uses
  SysUtils;

const
    m = 3;

type
    l = ^p;
    p = record
          k : string;
          n : l;
        end;
var
    a : array [1..m-1] of l;
    j : integer;
    t : integer;
    q : l;


procedure Init;
var i : integer;
begin for i := 0 to m-1 do a[i] := nil; end;


function H(s : string) : integer; begin Result := ord(s[1]) mod 97;  end;

function S(k : string) : l;
var b : l; i : integer;
begin
    i := H(k);
    b := a[i];
      while (b <> nil) do
                      if b.k = k then break
                                 else b := b.n;
    Result := b;
end;

function ADD(k : string) : l;
var  w, b, z : l; i : integer;
begin
     i := H(k);
     w := S(k);
     z := a[i];

     if w = nil then
                 begin
                      new(b);
                      b^.k := k;
                      b^.n := nil;
                     if z = nil
                                then a[i] := b
                                else w := b;
                end;
     Result := b;
end;


begin
    Init;
    ADD('abc');
    ADD('abs');
    ADD('bcd');
    ADD('cde');
   if S('abs') <> nil then writeln('find') else writeln('not find');
   for j := 0 to m-1 do
      begin
        q := a[j];
        writeln(q.k);
      end;
    readln;

end.
  • Вопрос задан
  • 151 просмотр
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы