program cykliczna_lista;
{$apptype CONSOLE}
type
wskKolejka=^kolej;
kolej = record
cyfra : integer;
nastepny:wskKolejka;
end;
wskLista=^Lista;
Lista = record
nazwa: string;
liczba: real;
kolejka : wskKolejka;
nastepny:wskLista;
end;
var poczatek:wskLista;
nazwa:string;
liczba:real;
pierwszy,ostatni :wskKolejka;
//----------------------------------------------------------------------------
procedure inicjuj_liste(var poczatek:wskLista); // inicjacja lsity
begin
poczatek:=nil;
end;
//----------------------------------------------------------------------------
procedure inicjuj_kolejke(var pierwszy,ostatni: wskKolejka); // inicjacja kolejki
begin
pierwszy:= nil;
ostatni:=nil;
end;
//----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
{procedura odpowiedzialna za dodanie kolejnego elementu do listy,
jezeli nie ma zadnego to tworzy pierwszy element}
procedure dodaj_do_listy( liczba:real; nazwa:string; var poczatek: wskLista);
var
pomocniczy_wsk: wskLista;
begin
pomocniczy_wsk := poczatek;
new(poczatek); // utworzenie nowego elementu listy
begin
poczatek^.liczba := liczba; // przypisanie watosci w rekordzie
poczatek^.nazwa:= nazwa; // przypisanie nazwy w rek.
poczatek^.nastepny := pomocniczy_wsk;
end;
end;
//-----------------------------------------------------------------------------
{wyswietlenie listy w oknie konsoli}
procedure wyswietl_liste(poczatek : wskLista);
var pomocniczy_wsk : wskLista;
begin
write(' ');
if poczatek <> nil then
begin
pomocniczy_wsk := poczatek;
repeat
write(pomocniczy_wsk.liczba3,' ', pomocniczy_wsk.nazwa);
write(' '); // wyswietlenie nazwy i wartosci elementu
repeat
if pomocniczy_wsk.kolejka <> nil then
begin
write(pomocniczy_wsk.kolejka.cyfra, ' '); // wyswietlenie kolejki w danym elemencie
pomocniczy_wsk.kolejka:=pomocniczy_wsk.kolejka^.nastepny; // przejscie o jeden element
end;
until pomocniczy_wsk^.kolejka = nil;
pomocniczy_wsk :=pomocniczy_wsk^.nastepny; // przejscie o jeden element
if pomocniczy_wsk <> nil then
write(', ');
until (pomocniczy_wsk =poczatek) or (pomocniczy_wsk = nil);
end;
write(' ');
readln;
end;
//-----------------------------------------------------------------------------
procedure znajdz_element_po_nazwie(poczatek : wskLista; nazwa:string);
var
pomocnik,pom :wskLista;
begin
pomocnik:= poczatek;
while poczatek^.nastepny <> pomocnik do // analogiznie do szukanie po wartosci
if poczatek^.nazwa=nazwa then
break
else
poczatek:=poczatek^.nastepny;
pom:=poczatek;
writeln('ten element to : ');
writeln(pom.nazwa, ' ', pom.liczba3);
readln;
end;
//----------------------------------------------------------------------------
procedure znajdz_element_po_wartosci(poczatek :wskLista; liczba:real);
var
pomocnik,pom : wskLista; // zmienne pomocnicze
begin
pomocnik:= poczatek;
while poczatek^.nastepny <> pomocnik do // dopoki nastepny jest rozny od peirwszego elementu
if poczatek^.liczba=liczba then
break
else
poczatek:=poczatek^.nastepny;
pom:=poczatek; // przpisanie zmiennej pomocniczej danego elementu
writeln('ten element to : ');
writeln(pom.nazwa, ' ',pom.liczba3); // wyswietlenie
readln;
end;
//-----------------------------------------------------------------------------
{usuniecie calej listy}
procedure usun_liste(var poczatek: wskLista);
var
pom:wskLista; // zmienna pomocnicza
begin
while poczatek<> nil do
begin
pom:=poczatek; // przypisanie zmiennej pomocniczej danego elementu
poczatek:=poczatek^.nastepny; // przejscie do nastepnego elementu
dispose(pom); // usuniecie
end;
end;
//----------------------------------------------------------------------------
procedure dodawanie_kol(pom: wskLista); // dodaje element kolejki przy danym elemencie listy
var
cyfra,decyzja: integer;
ostatni:wskKolejka;
blad:byte;
begin
repeat //powtarzamy
repeat
writeln('kolejny element? 1- tak,2-nie'); // pytanie czy dodac nastepny element do kolejki
{$I-}ReadLn(decyzja);{$I+}
blad:=IOResult;
if blad <> 0 then writeln('podales ciag znakow a nie liczbe/wlasciwa liczbe');
Until (blad=0);
if decyzja=1 then
begin
repeat
writeln('Podaj liczbe');
{$I-}ReadLn(cyfra);{$I+} // pobranie cyfry
blad:=IOResult;
if blad <> 0 then writeln('podales ciag znakow a nie liczbe/wlasciwa liczbe');
Until (blad=0);
// pobranie wartosci elementu kolejki, zabezpiecznie
if pom^.kolejka = nil then
begin
new(pom^.kolejka); // utworzenie nowego elementu kolejki
pom^.kolejka.cyfra:=cyfra; // przypisanie wartosci do rekordu
pom^.kolejka.nastepny:=nil; // nastepny element=nil
end
else
begin
ostatni:=pom^.kolejka;
while ostatni^.nastepny <> nil do //przechodzimy na koniec kolejki
ostatni:=ostatni^.nastepny;
new(ostatni^.nastepny); // utworzenie nowego elemntu
ostatni.nastepny.cyfra :=cyfra; // przypisanie wartosci
ostatni.nastepny.nastepny :=nil;
end;
end;
until decyzja=2; // dopoki nie zostanie podany klawisz '2'
end;
//-----------------------------------------------------------------------------
procedure znajdz_element_do_dod_kol(poczatek :wskLista; nazwa:string); // znajduje element listy do ktorego chcemy dopisac element kolejki
var
pomocnik,pom : wskLista;
begin
pomocnik:= poczatek; // przypisanie zmiennej pomocniczej wartosci poczatek
while poczatek^.nastepny <> pomocnik do
if poczatek^.nazwa=nazwa then
break
else
poczatek:=poczatek^.nastepny;
pom:=poczatek;
dodawanie_kol(pom); // przejscie do procedury dodawania elementu kolejki
end;
//------------------------------------------------------------------------------
procedure dodawanie_kolejki_pytanie; // pobiera nazwe elementu do wyszukania
begin
writeln('Musisz podac nazwe elementu, do ktorego chcesz dodac kolejke');
write('podaj nazwe elementu : ');
readln(nazwa);
znajdz_element_do_dod_kol(poczatek,nazwa); // przejscie do procedury znajdywania elementu do ktorego ma byc dopisana kolejka
end;
//-----------------------------------------------------------------------------
procedure zwracanie_pierwszego_el_kol(pom:wskLista);
begin
writeln('pierwszy element w kolejce to: ', pom^.kolejka.cyfra);
end;
//----------------------------------------------------------------------------
procedure znajdz_element_do_zwrotu(poczatek : wskLista; nazwa:string);
var
pomocnik,pom : wskLista;
begin
pomocnik:= poczatek; // przypisanie zmiennej pomocniczej wartosci poczatek
while poczatek^.nastepny <> pomocnik do
if poczatek^.nazwa=nazwa then
break
else
poczatek:=poczatek^.nastepny;
pom:=poczatek;
zwracanie_pierwszego_el_kol(pom);
// przejscie do procedury 'zwracania' elementu
end;
//----------------------------------------------------------------------------
procedure pobierz_nazwe_do_zwrotu(poczatek:wskLista); // pobiera nazwe elementu do wyszukania
var
nazwa:string;
begin
writeln('Musisz podac nazwe elementu, z ktorego chcesz znac 1 el. kolejki');
write('podaj nazwe elementu : ');
readln(nazwa);
znajdz_element_do_zwrotu(poczatek,nazwa); // przejscie do procedury znajdywania elementu
end;
procedure usun_ostatni(var poczatek : wskLista);
var pomocniczy_wsk :wskLista;
begin
if poczatek <> nil then
begin
pomocniczy_wsk := poczatek^.nastepny;
dispose(poczatek);
poczatek := pomocniczy_wsk;
end;
end;
//-----------------------------------------------------------------------------
{procedura 'menu'}
procedure menu;
begin
writeln;
writeln (' MENU');
writeln('------------------');
writeln('1. dodaj el. listy(na poczatek)');
writeln('2. wyszukaj element po wartosci');
writeln('3. dodaj el. kolejki');
writeln('4. usun ostatni dodany/ostatni w chwili obecnej element z listy');
writeln('5. zwroc pierwszy element kolejki');
writeln('6. wyszukaj element po nazwie');
writeln('7. wyswietl liste');
writeln('8. usun liste');
end;
//-------------------------------------------------------------------------------
var
wybor: integer;
blad:byte;
begin
inicjuj_liste(poczatek);
inicjuj_kolejke(pierwszy,ostatni);
menu;
repeat
repeat
writeln;
write('nr. opcji : ');
{$I-}ReadLn(wybor);{$I+} // idiotoodpornosc ;-)
blad:=IOResult;
if blad <> 0 then writeln('podales ciag znakow a nie liczbe/wlasciwa liczbe');
until (blad=0);
case wybor of
1 : begin
repeat
write('podaj liczbe : ');
{$I-}ReadLn(liczba);{$I+} //idiotoodpornosc
blad:=IOResult;
if blad <> 0 then writeln('podales ciag znakow a nie liczbe/wlasciwa liczbe');
until (blad=0);
write('podaj nazwe : ');
readln(nazwa);
dodaj_do_listy(liczba,nazwa,poczatek);
end;
2 : begin
repeat
write('podaj liczbe : ');
{$I-}ReadLn(liczba);{$I+} //idiotoodpornosc
blad:=IOResult;
if blad <> 0 then writeln('podales ciag znakow a nie liczbe/wlasciwa liczbe');
until (blad=0);
znajdz_element_po_wartosci(poczatek,liczba)
end;
3 : begin
dodawanie_kolejki_pytanie;
end;
4 : begin
usun_ostatni(poczatek) ;
end;
5 : begin
pobierz_nazwe_do_zwrotu(poczatek);
end;
6 : begin
write('podaj nazwe : ');
readln(nazwa);
znajdz_element_po_nazwie(poczatek,nazwa)
end;
7 : begin
writeln;
writeln('lista : ');
wyswietl_liste(poczatek);
end;
8 : begin
usun_liste(poczatek) ;
end;
9 :;
else
end;
until (wybor =9);
usun_liste(poczatek); // 'sprzatanie' ;-)
end.
jezeli dwa razy wyswietlam liste to w drugim wyswietleniu nie pojawia sie kolejka:( co jest zle? dzieki za pomoc:)