Lista kolejek

0

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:)

0

prześledź kod linijka po linijce debugerem i sam zobacz, co się dzieje... podpowiem: pomocniczy_wsk.kolejka:=pomocniczy_wsk.kolejka^.nastepny (przecież nie operujesz na kopii danych, tylko na kopii adresu).
naucz się formatować kod, bo tego powyżej aż się nie chce czytać. do tego zapoznaj się z funkcjami (wczytywanie liczb) i z pętlą while (czasem dużo bardziej sensowna od repeat).

0
ŁF napisał(a)

podpowiem: pomocniczy_wsk.kolejka:=pomocniczy_wsk.kolejka^.nastepny (przecież nie operujesz na kopii danych, tylko na kopii adresu).

moglbys mi to lepiej opisac?:)

0

nie rozumiesz swojego własnego kodu? napisałem: użyj debugera, zobaczysz jak ładnie twój własny kod niszczy swoje własne dane.

dla jednej iteracji, np. dla pierwszej pozycji:
wykonujesz w pętli

pomocniczy_wsk.kolejka:=pomocniczy_wsk.kolejka^.nastepny

pomocniczy_wsk to nie kopia elementu listy, tylko sam element (bo to przecież wskaźnik). w efekcie w pierwszej iteracji wewnętrznej pętli przypisujesz drugi element kolejki (pomocniczy_wsk.kolejka^.nastepny) jej pierwszemu elementowi (pomocniczy_wsk.kolejka), potem trzeci pierwszemu itp, aż na końcu przypisujesz nil, gubiąc całą kolejkę i trochę pamięci. i to samo dla kolejnych elementów głównej listy.
musisz utworzyć oddzielny wskaźnik na "kolejkę" (w cudzysłowie, bo ta kolejka to też lista), tak samo jak robisz to ze wskaźnikiem na listę.

0

<ort>rozumie </ort>swoj kod ale <ort>po prostu </ort>nie do konca zrozumialem o co Ci chodzi:) tak czy owak sprobuje:) dzieki za pomoc w razie czego wrzuce tu jeszcze cos:) mam nadzieje, ze cierpliwosci nie straciles:)

0

Jeszcze jedno pytanie. Mam stworzyć coś żeby zapisywało "historię" wybieranych opcji przez użytkownika do pliku:| jak się coś takiego robi?

0
rupiku napisał(a)

Jeszcze jedno pytanie. Mam stworzyć coś żeby zapisywało "historię" wybieranych opcji przez użytkownika do pliku:| jak się coś takiego robi?

Po wybraniu opcji wrzucasz numer pozycji menu do pliku.

0

dzieki:) koles wspominal cos o jakims "log" ale nie zajarzylem:|

0

chcialem jeszcze zrobic cos takiego, zeby nie wysypywalo sie przy podaniu niewlasciwej nazwy:|

procedure znajdz_element_po_nazwie(poczatek : wskLista; nazwa:string);
var
pomocnik,pom :wskLista;
pomoc:wskKolejka;
jest: boolean;
begin
pomocnik:= poczatek;
jest:= false;
while poczatek^.nastepny <> pomocnik do // analogiznie do szukanie po wartosci
if poczatek^.nazwa=nazwa then
begin
jest:=true;
break
end
else
poczatek:=poczatek^.nastepny;
if jest=false then
begin
writeln('nie ma takiego elementu');
znajdz_element_po_nazwie(poczatek,nazwa);
end;
pom:=poczatek; // przypisanie zmiennej pomocniczej danego elementu
writeln('ten element to : ');
write(pom.nazwa, ' ',pom.liczba3, ' ');

       pomoc:=pomocnik^.kolejka;
       repeat
       if pomoc <> nil then
       begin

       write(pomoc^.cyfra, ' ');               // wyswietlenie kolejki w danym elemencie
       pomoc:=pomoc.nastepny;   // przejscie o jeden element
       end;
       until pomoc = nil;          // wyswietlenie

readln;
end;

co jest nie tak?:|

0

po pierwsze formatuj kod i umieszczaj w tagach code=delphi, po drugie zrobiłeś jedną rzecz źle i jedną wręcz bezmyślnie:

procedure znajdz_element_po_nazwie(poczatek : wskLista; nazwa:string);
var
  element : wskLista;
  jest : boolean;
begin
  element := poczatek;
  jest := false;
  while element <> nil do // poczatek^.nastepny <> pomocnik <- to nie lista cykliczna, ma koniec i początek, końcem nie jest element równy początkowi, tylko nil. a przynajmniej powinien być.
  if element^.nazwa = nazwa then
  begin
    jest:=true;
    break
  end else element := element^.nastepny;

  if not jest then
  begin
    writeln('nie ma takiego elementu');
    exit;  //    znajdz_element_po_nazwie(poczatek,nazwa); <- WTF? przecież w ten sposób robisz nieskończoną rekurencję, jeśli raz element się nie znalazł, to kolejny milion razy też się nie znajdzie; bezmyślne
  end;
// ...

1 użytkowników online, w tym zalogowanych: 0, gości: 1