Задание следующее:
Разработать структуру данных для построения предметного указателя.
Осуществить поиск, сортировку, редактирование.
Итак, предметный указатель, как я понимаю, - это то, что мы, зачастую, имеем в концах книг и имеет структуру:
{СЛОВО} {СТРАНИЦЫ, ГДЕ ЭТО СЛОВО ВСТЕРЧАЕТСЯ}
Реализацию я вижу такую:
(я знаю, это задание уже можно найти почти готовым, но я хочу написать принципиально свое, потому как очень интересно разобраться в принципах динамических структур данных).
Есть объявления типа:
type
page_mas = array [1..10] of word; {массив слов, одно и то же слово}
{может встречаться на 10 страницах}
LINK_REC = ^REC; {указатель на запись со словом}
REC = record
SLOVO: string[15]; {Слово}
PAGE: page_mas; {страницы на которых слово встречается}
NEXT: LINK_REC; {указатель на следующую запись со слово}
end;
LET = record
CAPITAL: char; {Буква, на которую слово начинается}
FIRST: LINK_REC; {указатель на первое слово на эту букву}
end;
lett_mas = array [1..27] of LET; {массив из записей с буквами алфавита}
Что я делаю дальше.
Заполняю массив за записей с буквами собственно теми самыми буквами:
for x:=65 to 90 do
begin
letters[x-64].capital:=chr(x); letters[x-64].first:=nil;
end;
После этого он представляет собой следующее:
letters: (('A', nil), ('B', nil), ('C', nil)...('Z', nil).
После этого я перехожу к непосредственно заполнению и вот тут у меня возникает проблема.
Выглядит начало примерно так:
clrscr;
writeln('MENU:');
writeln;
writeln('1 - ADD');
writeln('2 - SEARCH');
readln(menu);
case menu of
1:begin
clrscr;
{считываю новое слово в запись z}
write('new word: ');
read(z.slovo);
{вычисляю номер буквы алфавита и в будущем ячейки массива букв}
let_num:=ord(z.slovo[1])-64;
{заполняю массив страниц}
write('How many pages contain this word: ');
readln (pag_num);
for i:=1 to pag_num do
begin
write('Page number: ');
readln(page);
z.page[i]:= page;
end;
z.next:=nil;
Add(LR,z); {вызываю функцию добавления записи к списку}
end;
end;
until menu=3;
Подскажите как примерно должна выглядеть процедура Add, чтобы:
( как я это вижу, может все гораздо проще )
* Найти по let_num в массиве lett_mas ячейку с буквой, на которую начинается слово.
* Если ячейка^.first = nil, то создать новую ссылку на запись, положить туда значение z и сделать чтобы ячейка^.first теперь сслылалась на это место.
* Если же ячейка^.first <> nil, то идти по этому списку до тех пор пока не дойдем до конца и вставить наше z там.
Конечное видение примерно как на приложенной картинке.
Заранее спасибо.