Алгоритм хеш таблицы методом цепочек, после выполнение следующих команд:
...
Init;
ADD('abc');
ADD('abs');
ADD('bcd');
ADD('cde');
...
Должно получиться нечто этого:
Сам код, у меня где то ошибка в функции 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.