Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Bilety_po_AiP.docx
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
2.1 Mб
Скачать
  1. Операции над графами: поиск вершины, удаление вершины, удаление дуги, текстовый вывод графа.

Поиск вершины

Функция SearchNode в качестве входных параметров получает указатель на первую вершину графа и значение информационного поля для поиска. А на выходе выдает ссылку на искомую вершину.

function (head:refnode; x:integer);

begin

while (head<>nil) and (head^.infnode<>x) do

head:=head^.next;

if head=nil then

writeln('Вершины с таким информационным полем нет');

else

SearchNode:=head;

end;

Удаление дуги

Для удаления дуги указываются две ссылки на вершины, которые эта дуга соединяет. Приведенная ниже процедура удаляет элемент из списка дуг, выходящих из вершины u, если в нем записана ссылка на вершину v. Если таких элементов несколько, то удаляется первый встретившийся.

Procedure DeleteArc(u,v:refnode);

Var a,before:refarc;

Run:boolean;

Begin

If u<>nil then Begin

a:=u^.arclist;

run:=true;

while a<>nil and run do

if a^.adj=v then run:=false

else begin

before:=a;

a:=a^.next

end;

if a<>nil then begin

if a=u^.arclist then

u^.arclist:=a^.next

else

before^.next:=a^.next;

dispose(a)

end

end

end;

Удаление вершины

Процедура удаления вершины более сложная, так как кроме удаления дескриптора вершины и подцепленного к ней списка выходящих дуг, необходимо просмотреть всю оставшуюся часть графа в поисках висячих ссылок. Эти ссылки удаляются с помощью процедуры DeleteArc.

Procedure DeleteNode(Var graph:refnode; v:refnode);

Var before,p,q:refnode;

a,after:refarc;

begin

p:=graph;

while p<>nil do {цикл по всем вершинам графа}

begin

q:=p^.next;

if p<>v then begin

DeleteArc(p,v) {удаление дуг, направленных удаляемой

вершине}

before:=p;

end

else Begin {удаление вершины v и всех дуг, исходящих из

нее}

if p=graph then graph:=q; {если это первая вершина}

a:=p^.arclist;

{удаление списка дуг вершины v}

while a<>nil do

begin

after:=a^.next;

dispose(a);

a:=after

end;

if p=graph then graph:=q

else before^.next:=q;

dispose(p);

end;

p:=q;

end

end;

Просмотр графа

Просмотр графа заключается в посещении всех вершин и дуг графа и

выводе в стандартный файл всей информации о графе. Для непустого графа

информация группируется по вершинам (списки смежности).

Procedure BrowseGraph(graph:refnode);

Var a:refarc;

Nn,na: integer; {счетчики количества вершин и дуг}

Begin

Nn:=0; na:=0;

while graph<>nil do begin

writeln(‘Вершина ’, graph^.id,’ с весом ’ ,graph^.infnode);

writeln(‘Список дуг:’);

a:=graph^.arclist;

if a=nil then writeln(‘пуст’);

while a<>nil do begin

writeln(‘Дуга к вершине ’, (a^.adj)^.id,’, вес дуги ’,a^.infarc);

na:=na+1;

a:=a^.next;

end;

nn:=nn+1;

graph:=graph^.next;

end;

writeln(‘В графе ’, nn, ‘вершин и ‘, na,’ дуг’)

end;

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]