![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Создание связного списка [D7, Win2k]
polar © (2005-09-09 10:40:00)Добрый день.
есть такой код:
PCollisionList = ^TCell;
TCollisionList = PCollisionList;
TCell = record
Key, Data: string;
Next: PCollisionList;
end;
THashTable = array of TCollisionList;
TDataList = array of string;
procedure CreateHashTable(aHashSize: longint; var aHashTable: THashTable);
procedure ClearHashTable(var aHashTable: THashTable);
function HashFunction(aKey: string; var aHashTable: THashTable): longint;
procedure HashInsert(aKey, aData: string; var aHashTable: THashTable);
function HashSearch(aKey: string; var aDataList: TDataList; var aHashTable: THashTable): boolean;
procedure CreateHashTable(aHashSize: longint; var aHashTable: THashTable);
begin
try
SetLength(aHashTable, 0);
SetLength(aHashTable, aHashSize);
except on e: Exception do begin
SetLength(aHashTable, 0);
e.Message := 'CreateHashTable: ' + e.Message;
raise;
end; end;
end;
procedure ClearHashTable(var aHashTable: THashTable);
var tmpI: integer;
begin
try
for tmpI := 0 to Length(aHashTable)-1 do begin
if assigned(aHashTable[tmpI]) then begin
Dispose(aHashTable[tmpI]);
end;
end;
SetLength(aHashTable, 0);
except on e: Exception do begin
SetLength(aHashTable, 0);
e.Message := 'ClearHashTable: ' + e.Message;
raise;
end; end;
end;
function HashFunction(aKey: string; var aHashTable: THashTable): longint;
var tmpI: integer;
begin
try
result := 0;
for tmpI := 1 to Length(aKey) do result := result + Integer(aKey[tmpI]);
result := result mod Length(aHashTable);
except on e: Exception do begin
e.Message := 'HashFunction: ' + e.Message;
raise;
end; end;
end;
procedure HashInsert(aKey, aData: string; var aHashTable: THashTable);
var tmpIndex: longint;
tmpPCollisionList: PCollisionList;
begin
tmpIndex := HashFunction(aKey, aHashTable);
New(tmpPCollisionList);
try
tmpPCollisionList^.Key := aKey;
tmpPCollisionList^.Data := aData;
tmpPCollisionList^.Next := aHashTable[tmpIndex];
aHashTable[tmpIndex] := tmpPCollisionList;
except on e: Exception do begin
Dispose(tmpPCollisionList);
e.Message := 'HashFunction: ' + e.Message;
raise;
end; end;
end;
function HashSearch(aKey: string; var aDataList: TDataList; var aHashTable: THashTable): boolean;
var tmpPCollisionList: PCollisionList;
tmpExpectedIndex: longint;
begin
tmpExpectedIndex := HashFunction(aKey, aHashTable);
tmpPCollisionList := aHashTable[tmpExpectedIndex];
SetLength(aDataList, 0);
result := false;
while (tmpPCollisionList <> nil) do begin
if tmpPCollisionList^.Key = aKey then begin
result := true;
SetLength(aDataList, Length(aDataList) + 1);
aDataList[High(aDataList)] := tmpPCollisionList^.Data;
end;
tmpPCollisionList := tmpPCollisionList^.Next;
end
end;
При этом всё хорошо, но процедура ClearHashTable не чистит память. Не понимаю почему.
Спасибо, если кто-то откликнется.
polar (2005-09-09 11:24:00) [21]Дело не использовании отладчика. Я что-то не освобождаю в ClearHashTable. Не вижу что. В отладчике этого не видно.
Digitman (2005-09-09 11:10:00) [22]как думаешь - отладчик встроенный зачем существует в Делфи ?