Witam
Pisze program przeszukujacy graf w glab, ale ma problem - gdzies w tej procedurze:
procedure szukaj(var stos: wsk; var kolor: tabkol; lista: tab; licz: integer);
var
a,j,i: integer;
pom: wsk;
begin
writeln('Podaj szukany wierzcholek: ');
readln(a);
j:=1;
for i:=1 to licz do
kolor[i]:='b';
new(stos);
stos^.dane:=1;
stos^.nast:=nil;
kolor[1]:='s';
writeln('Lista sasiedztwa: ');
writeln;
wypiszl(lista,licz);
writeln('Stany stosu i tabeli kolorow po kolejnych operacjach: ');
writeln;
wypiszstos(stos);
wypiszkolor(kolor);
writeln('==============================');
while stos^.dane <> a do
begin
if kolor[lista[j]^.dane] = 'b' then
begin
new(pom);
pom^.dane:=lista[j]^.dane;
pom^.nast:=stos;
stos:=pom;
j:=lista[j]^.dane;
kolor[j]:='s';
end
else if kolor[lista[j]^.dane] = 's' then
begin
while (kolor[lista[j]^.dane] <> 'b') or (lista[j] <> nil) do
lista[j]:=lista[j]^.nast;
if lista[j] = nil then
begin
kolor[j]:='c';
new(pom);
pom:=stos^.nast;
dispose(stos);
stos:=pom;
j:=stos^.dane;
end
else if kolor[lista[j]^.dane] = 'b' then
begin
new(pom);
pom^.dane:=lista[j]^.dane;
pom^.nast:=stos;
stos:=pom;
j:=lista[j]^.dane;
kolor[j]:='s';
end;
end
else if kolor[lista[j]^.dane] = 'c' then
begin
new(pom);
pom:=stos^.nast;
dispose(stos);
stos:=pom;
j:=stos^.dane;
end;
wypiszstos(stos);
wypiszkolor(kolor);
writeln('==============================');
end;
writeln;
writeln('Droga do szukanego wierzcholka: ');
wypiszdroge(stos);
readln;
end;
jest blad, ktorego nie moge zlokalizowac.
Konkretnie wywala sie gdzies w tym fragmencie:
else if kolor[lista[j]^.dane] = 's' then
begin
while (kolor[lista[j]^.dane] <> 'b') or (lista[j] <> nil) do
lista[j]:=lista[j]^.nast;
if lista[j] = nil then
begin
kolor[j]:='c';
new(pom);
pom:=stos^.nast;
dispose(stos);
stos:=pom;
j:=stos^.dane;
end
else if kolor[lista[j]^.dane] = 'b' then
begin
new(pom);
pom^.dane:=lista[j]^.dane;
pom^.nast:=stos;
stos:=pom;
j:=lista[j]^.dane;
kolor[j]:='s';
end;
Czy moge liczyc na podpowiedz co jest nie tak? ;)
b,s,c to kolory wierzcholkow - biale to nieodwiedzone, szare to odwiedzone, ale majace jeszcze nieodwiedzonych sasiadow, a czarne to odwiedzone bez nieodwiedzonych sasiadow.
przykladowy plik do wczytania:
1 2
1 5
1 6
2 3
2 4
3 4
5 6
Na wszelki wypadek caly program (kompiluje sie normalnie):
program przeszukiwanie_w_glab;
uses crt;
const
max = 50;
type
wsk = ^twsk;
twsk = record
dane: integer;
nast: wsk;
end;
tab = array[1..max] of wsk;
tabkol = array[1..max] of char;
var
lista: tab;
t1,t2,licz: integer;
k: boolean;
stos: wsk;
kolor: tabkol;
procedure zamien(var t1,t2: integer);
var
a: integer;
begin
a:=t1;
t1:=t2;
t2:=a;
end;
procedure dodaj(var lista: tab; var licz: integer; t1,t2: integer);
var
pom: wsk;
begin
if lista[t1] = nil then
begin
new(lista[t1]);
lista[t1]^.dane:=t2;
lista[t1]^.nast:=nil;
end
else
begin
new(pom);
pom^.dane:=t2;
pom^.nast:=lista[t1];
lista[t1]:=pom;
end;
if t1 > licz then
licz:=t1;
end;
procedure wczytaj(var lista: tab; var t1,t2: integer);
var
plik: text;
t: string;
begin
writeln('Podaj nazwe pliku: ');
readln(t);
assign(plik,t);
reset(plik);
while not eof(plik) do
begin
readln(plik,t1,t2);
dodaj(lista,licz,t1,t2);
zamien(t1,t2);
dodaj(lista,licz,t1,t2);
end;
close(plik);
end;
procedure usun(var lista: tab; licz: integer);
var
i: integer;
pom: wsk;
begin
for i:=1 to licz do
begin
while lista[i] <> nil do
begin
pom:=lista[i]^.nast;
dispose(lista[i]);
lista[i]:=pom;
end;
end;
licz:=0;
end;
procedure wypiszl(lista: tab; licz: integer);
var
i: integer;
begin
for i:=1 to licz do
begin
writeln('Sasiedzi wierzcholka ',i,': ');
while lista[i] <> nil do
begin
write('->',lista[i]^.dane);
lista[i]:=lista[i]^.nast;
end;
writeln;
end;
readln;
end;
procedure wypiszstos(stos: wsk);
begin
while stos <> nil do
begin
write(stos^.dane,'->');
stos:=stos^.nast;
end;
write('nil');
writeln;
end;
procedure wypiszdroge(stos: wsk);
var
tmp: array[1..max] of integer;
i,j: integer;
begin
i:=1;
while stos <> nil do
begin
tmp[i]:=stos^.dane;
stos:=stos^.nast;
i:=i+1;
end;
writeln;
write('START>>');
for j:=i-1 downto 1 do
write(tmp[j],'>>');
writeln('KONIEC');
end;
procedure wypiszkolor(kolor: tabkol);
var
i,j,k: integer;
begin
for i:=1 to licz do
write(i,'|');
writeln;
for j:=1 to licz do
write('--');
writeln;
for k:=1 to licz do
write(kolor[k],'|');
writeln;
end;
procedure szukaj(var stos: wsk; var kolor: tabkol; lista: tab; licz: integer);
var
a,j,i: integer;
pom: wsk;
begin
writeln('Podaj szukany wierzcholek: ');
readln(a);
j:=1;
for i:=1 to licz do
kolor[i]:='b';
new(stos);
stos^.dane:=1;
stos^.nast:=nil;
kolor[1]:='s';
writeln('Lista sasiedztwa: ');
writeln;
wypiszl(lista,licz);
writeln('Stany stosu i tabeli kolorow po kolejnych operacjach: ');
writeln;
wypiszstos(stos);
wypiszkolor(kolor);
writeln('==============================');
while stos^.dane <> a do
begin
if kolor[lista[j]^.dane] = 'b' then
begin
new(pom);
pom^.dane:=lista[j]^.dane;
pom^.nast:=stos;
stos:=pom;
j:=lista[j]^.dane;
kolor[j]:='s';
end
else if kolor[lista[j]^.dane] = 's' then
begin
while (kolor[lista[j]^.dane] <> 'b') or (lista[j] <> nil) do
lista[j]:=lista[j]^.nast;
if lista[j] = nil then
begin
kolor[j]:='c';
new(pom);
pom:=stos^.nast;
dispose(stos);
stos:=pom;
j:=stos^.dane;
end
else if kolor[lista[j]^.dane] = 'b' then
begin
new(pom);
pom^.dane:=lista[j]^.dane;
pom^.nast:=stos;
stos:=pom;
j:=lista[j]^.dane;
kolor[j]:='s';
end;
end
else if kolor[lista[j]^.dane] = 'c' then
begin
new(pom);
pom:=stos^.nast;
dispose(stos);
stos:=pom;
j:=stos^.dane;
end;
wypiszstos(stos);
wypiszkolor(kolor);
writeln('==============================');
end;
writeln;
writeln('Droga do szukanego wierzcholka: ');
wypiszdroge(stos);
readln;
end;
procedure usunstos(var stos: wsk);
var
pom: wsk;
begin
while stos <> nil do
begin
pom:=stos^.nast;
dispose(stos);
stos:=pom;
end;
end;
procedure czysc(var licz: integer);
begin
usun(lista,licz);
usunstos(stos);
licz:=0;
end;
begin
k:=false;
licz:=0;
repeat
clrscr;
writeln('MENU');
writeln('1 - Wczytaj liste krawedzi z pliku');
writeln('2 - Wypisz liste sasiedztwa');
writeln('3 - Przeszukaj graf');
writeln('4 - Oczysc pamiec');
writeln('5 - Zakoncz');
writeln;
case readkey of
'1': wczytaj(lista,t1,t2);
'2': wypiszl(lista,licz);
'3': szukaj(stos,kolor,lista,licz);
'4': czysc(licz);
'5': k:=true;
end;
until k;
czysc(licz);
end.