Операции над бинарным деревом AVL
Язык: Borland Pascal 7.0
Курс: Линейные динамические структуры данных
В данной статье рассматривается:
- Задать граф
- Просмотреть граф
- Выполнить топологическую сортировку
- Графическое описание массива А
- Поиск изолированных вершин
Program Topolog_Sortirovka; { Make 06.11.1998 } Uses { All rights reserved } Crt; Const max = 26; { КОЛИЧЕСТВО ЭЛЕМЕНТОВ ГРАФА } Type T_elem = Char; ref = ^elem; elem = record n : 0..max; next : ref end; t = array [1..max+1] of record name : t_elem; data : elem end; Var a,b : t; key : char; stop,sig : Boolean; cur,q : ref; c : integer; count : integer; cp : array [1..4] of byte; {--------------------------------------------------------------------------} procedure ramka; var i : integer; begin textcolor(13); for i:=1 to 47 do begin gotoxy(15+i,9); write('Н'); gotoxy(15+i,16); write('Н') end; for i:=1 to 6 do begin gotoxy(16,9+i); write('є'); gotoxy(62,9+i); write('є') end; gotoxy(62,9); write('>'); gotoxy(16,9); write('Й'); gotoxy(62,16); write('_'); gotoxy(16,16); write('И') end; {--------------------------------------------------------------------------} procedure clear; var i : integer; begin for i:=1 to max+1 do begin cur:=a[i].data.next; if cur <> nil then begin q:=cur; cur:=cur^.next; while cur <> nil do begin q^.next:=cur^.next; dispose(cur); cur:=q^.next end end end; for i:=1 to max+1 do begin cur:=b[i].data.next; if cur <> nil then begin q:=cur; cur:=cur^.next; while cur <> nil do begin q^.next:=cur^.next; dispose(cur); cur:=q^.next end end end; end; {--------------------------------------------------------------------------} procedure Konstructor_Graph; var i,j,k : integer; name1,name2 : string[10]; stop2 : boolean; key : char; begin textcolor(1); clrscr; textcolor(15); clear; sig:=false; for i:=1 to max+1 do begin a[i].name:=upcase(chr(i+96)); a[i].data.next:=nil; a[i].data.n:=0 end; stop2:=false; writeln('Сколько вершин в графе ?'); write('[N] : '); readln(count); if (count > max) or (count<1) then begin writeln('Ошибка ! В графе должно быть не более ',max, ' и не менее одной вершины.'); readkey; textcolor(1); cp[2]:=7; cp[3]:=7; sig:=false; clrscr; exit end; if count > 1 then begin writeln('Введите данные для графа ( вершины графа : ', a[1].name,'..',a[count].name,' ).'); writeln('ЕNTER - завершение ввода.') end; if count = 1 then stop2:=true; while not stop2 do begin key:=readkey; if key = #13 then begin stop2:=true; name1:='' end else name1:=UpCase(key); if not stop2 then write(name1,' -',#26,' '); if not stop2 then begin key:=readkey; if key = #13 then begin stop2:=true; name2:='' end else name2:=UpCase(key); end ; if (name1<>'') or (name2<>'') then begin if not stop2 then writeln(name2); for i:=1 to max do if a[i].name = name2 then for j:=1 to max do if a[j].name = name1 then begin cur:=a[j].data.next; if cur <> nil then begin while cur <> nil do begin q:=cur; cur:=cur^.next end; new(cur); q^.next:=cur end else begin new(cur); a[j].data.next:=cur end; cur^.n:=i; cur^.next:=nil end end else stop2:=not stop2 end; for i:=1 to count do begin k:=0; for j:=1 to max do begin cur:=a[j].data.next; while cur <> nil do begin if cur^.n = i then k:=k+1; cur:=cur^.next end end; a[i].data.n:=k end; j:=0; for i:=1 to count do if (a[i].data.n = 0) and (a[i].data.next = nil) then j:=j+1; if j = 0 then write('Изолированных вершин нет.') else begin write('Изолированные вершины : '); for i:=1 to count do if (a[i].data.n = 0) and (a[i].data.next = nil) then write(a[i].name,' ') end; b:=a; sig:=true; cp[2]:=15; cp[3]:=15; readkey; textcolor(1); clrscr end; {--------------------------------------------------------------------------} procedure Go_sort; var r,i,j,k,l : integer; ok : boolean; begin textcolor(1); clrscr; textcolor(15); i:=1; r:=0; {-------------------- Основной цикл ----------------------} while i <> 0 do begin i:=0; for j:=1 to count do if a[j].data.n = 0 then begin k:=0; cur:=a[max+1].data.next; while cur <> nil do begin if cur^.n = j then k:=k+1; cur:=cur^.next end; if k = 0 then begin r:=r+1; i:=i+1; cur:=a[max+1].data.next; if cur = nil then begin new(a[max+1].data.next); cur:=a[max+1].data.next end else begin while cur <> nil do begin q:=cur; cur:=cur^.next end; new(cur); q^.next:=cur end; cur^.next:=nil; cur^.n:=j; cur:=a[j].data.next; while cur <> nil do begin if a[cur^.n].data.n > 0 then dec(a[cur^.n].data.n); cur:=cur^.next end end end end; {-------------- Завершение основного цикла ---------------} cur:=a[max+1].data.next; while cur <> nil do begin write(a[cur^.n].name,' '); cur:=cur^.next end; writeln; textcolor(11); if r <> count then ok:=false else ok:=true; if not ok then write('Полное решение не существует...') else write('Полное решение существует...'); a:=b; readkey; textcolor(1); clrscr end; {--------------------------------------------------------------------------} procedure Look_to_Graph; var i,j : integer; begin textcolor(1); clrscr; textcolor(11); b:=a; writeln(' ':17,'Графическое описание массива А :'); writeln; textcolor(15); for i:=1 to count do begin write('A[',i:2,'] : ',a[i].name:3,' | ',a[i].data.n); cur:=a[i].data.next; while cur<>nil do begin write(' -',#26,' ',a[cur^.n].name); cur:=cur^.next end; writeln(' -',#26,' nil') end; for i:=1 to count do if (a[i].data.n = 0) and (a[i].data.next = nil) then j:=j+1; if j = 0 then write('Изолированных вершин нет.') else begin write('Изолированные вершины : '); for i:=1 to count do if (a[i].data.n = 0) and (a[i].data.next = nil) then write(a[i].name,' ') end; a:=b; readkey; textcolor(1); clrscr end; {--------------------------------------------------------------------------} BEGIN textcolor(1); textbackground(1); clrscr; cp[1]:=15; cp[2]:=7; cp[3]:=7; cp[4]:=15; stop:=false; sig:=false; while not stop do begin textcolor(11); gotoxy(17,2); writeln('Программа студента гр. ПА-97 Шарова Евгения'); gotoxy(30,23); writeln('All rights reserved.'); textcolor(10); gotoxy(20,7); writeln('Линейные динамические структуры данных.'); writeln(' ':25,'Топологическая сортировка.'); ramka; textcolor(15); gotoxy(20,11); textcolor(cp[1]); write('Задать граф...........................1'); gotoxy(20,12); textcolor(cp[2]); write('Просмотреть граф......................2'); gotoxy(20,13); textcolor(cp[3]); write('Выполнить топологическую сортировку...3'); gotoxy(20,14); textcolor(cp[4]); write('Выход в ДОС...........................4'); key:=readkey; case key of '1' : Konstructor_Graph; '2' : if sig then Look_to_Graph; '3' : if sig then Go_sort; '4' : stop:= not stop; else begin Sound(35+random(160)); Delay(37); NoSound end end end; clear; textmode(3) END.
Delphi — это объектно-ориентированный язык программирования со строгой типизацией переменных. Он используется в основном для написания прикладных, пользовательских программ. Простота использования позволяет рекомендовать его в качестве языка для начального обучения программированию. Хотя, если смотреть на перспективу, работодатели мало интересуются работниками, программирующими на Delphi. |
Интересные материалы на сайте:
|