Бор
Бор - структура данных, предназначенная для хранения строк.
Поддерживает операции добавления строки, удаление строки и поиск строки в боре.
Листинг Delphi
const
maxEl=1000;
type
PEl = ^TEl;
TEl = record
f : boolean; // Содержится ли в множестве данная строка
key : integer; // Ключ - дополнительная информация о строке
Link : array ['a' .. 'z'] of PEl; // Указатели на "детей"
end;
var
bor : array [0 .. maxEl] of TEl;
uk : integer;
root : PEl;
procedure Init;
begin
fillchar(bor, sizeof(bor), 0);
uk := 0;
root := @bor[0];
end;
procedure Insert(const s:string, _key:integer); // Добавление строки в бор
var
cur : PEl;
i : integer;
begin
cur:=root;
for i := 1 to length(s) do
begin
if cur^.Link[s[i]] = nil then
begin
inc(uk);
cur^.Link[s[i]] := @bor[uk];
end;
cur:=cur^.Link[s[i]];
end;
cur^.f := true;
cur^.key := _key;
end;
procedure Delete(const s:string); // Удаление строки из бора
var
cur : PEl;
i : integer;
begin
cur:=root;
for i := 1 to length(s) do
begin
if cur^.Link[s[i]] = nil then
begin
Writeln('No such string');
exit;
end;
cur:=cur^.Link[s[i]];
end;
cur^.f := false;
end;
function Search(const s:string) : integer; // Поиск строки в боре, результат - ключ
var
cur : PEl;
i : integer;
begin
cur:=root;
for i := 1 to length(s) do
begin
if cur^.Link[s[i]] = nil then
begin
result := - 1;
exit;
end;
cur:=cur^.Link[s[i]];
end;
if not cur^.f result := - 1
else result := key;
end;
Листинг C++
const int MaxChar = 256;
class bor
{
public :
int key; // Ключ - информация о строке.
int is;
bor *e[MaxChar];
bor();
void insert(const char *s, int _key);// Добавление строки в бор
bool erase(const char *s); // Удаление строки из бора
int find(const char *s); // Поиск строки в боре
};
bor :: bor()
{
int i;
is = 0;
key = 0;
for (i = 0; i < MaxChar; ++ i)
e[i] = NULL;
}
void bor :: insert(const char *s, int _key)
{
bor *cur = this;
int i;
for (i = 0; i < strlen(s); ++ i)
if (cur->e[s[i]] == NULL)
{
cur->e[s[i]] = new bor();
cur = cur->e[s[i]];
cur->is = 0;
}
else
cur = cur->e[s[i]];
if (! cur->is)
{
cur->is = 1;
cur->key = _key;
}
}
bool bor :: erase(const char *s)
{
bor *cur = this;
int i;
for (i = 0; i < strlen(s); ++ i)
if (cur->e[s[i]] == NULL)
return 0;
else
cur = cur->e[s[i]];
if (! cur->is) return 0;
cur->is = 0;
return 1;
}
int bor :: find(const char *s)
{
bor *cur = this;
int i;
for (i = 0; i < strlen(s); ++ i)
if (cur->e[s[i]] == NULL)
return - 1;
else
cur = cur->e[s[i]];
if (! cur->is) return - 1;
return cur->key;
}
09.12.2007, 16:25
По всем вопросам обращаться: rumterg@gmail.com