mLink : PNode; { указатель на смежный узел }
mNext : PLink; { указатель на следующую запись в списке }
end;
TNode = record { Тип запись для хранения страны (узла графа) }
mName : Char; { Название страны (одна буква) }
mLinks: PLink; { список связей с соседями (смежными узлами) }
mNext : PNode; { указатель на следующую запись в списке }
end;
var List : PNode; { список всех стран континента (узлов графа) }
{ Функция поиска страны (узла графа) по имени страны }
function GetPtr(aName : char): PNode;
var p : PNode;
begin
p:= List; { поиск начинается с головы списка }
{ проходим по элементам списка }
while Assigned(p) do begin
if p^.mName= aName
then break { нашли! }
else p:= p^.mNext; { а иначе следующий }
end;
GetPtr:= p;
end;
{ Функция создает новую страну (узел), вставляет в глобальный список List
и возвращает указатель на новый узел }
function MakeNode(aName : Char): PNode;
var p : PNode;
begin
New(p); { создаем переменную }
p^.mName:= aName; { копируем имя }
p^.mLinks:=nil; { список связей пока пуст }
p^.mNext:= List; { указатель на следующий берем из заголовка }
List:= p; { заголовок указывает на новый узел }
MakeNode:= p; { результат выполнения функции }
end;
{ Процедура установки связи узла p1 с узлом p2 }
procedure Link(p1, p2 : PNode);
var p : PLink;
begin
New(p); { создаем переменную–связь }
p^.mLink:= p2; { поле mLink должно указывать на p2 }
p^.mNext:= p1^.mLinks; { указатель на следующий берем из заголовка }
p1^.mLinks:= p; { заголовок указывает на новый узел }
end;
{ Процедура чтения графа из текстового файла }
procedure ReadData(var F: Text);
var C : Char;
p, q : PNode;
begin
Reset(F);
while not Eof(F) do begin
if not Eoln(F) then begin { если строка не пуста }
Read(F, C); { читаем имя страны }
C:=UpCase(C); { перевод в верхний регистр }
p:= GetPtr(C); { а может эта страна уже существует? }
if not Assigned(p)
then p:= MakeNode(C); { если нет, – создаем }
while not Eoln(F) do begin { чтение стран-соседей до конца строки }
Read(F, C);
C:= UpCase(C);
if C in ['A'..'Z'] then begin { если это имя страны, а не пробел }
q:= GetPtr(C); { проверяем существование страны }
if not Assigned(q) { если не существует, – создаем }
then q:= MakeNode(C);
Link(p, q); { связываем страну p с q }
end
end
end;
Readln(F); { переход на следующую строку файла }
end;
Close(F);
end;
{ Процедура распечатки графа }
procedure ExpoData(var F: Text);
var p : PNode;
q : PLink;
begin
Rewrite(F);
p:= List; { начало просмотра списка стран (узлов) }
while Assigned(p) do begin