Przykład programu wykorzystującego struktury listowe do gromadzenie danych studentów. Program ma umożliwiać tworzenie listy studentów (czytanie danych z klawiatury) oraz wyprowadzenie tej listy na ekran.
Definicje typów dla listy studentów:
type
SpisStudentow=^student;
student=rekord
imie,nazw :string[15];
wsk :SpisStudentow;
end;
Dla tak zdefiniowanego typu wskaźnikowego lista studentów jest reprezentowana przez zmienną spis
var
spis:SpisStudentow;
w następujący sposób:
jeżeli lista jest pusta, to zmiennej spis nadajemy wartość NIL,
jeżeli lista jest niepusta, to wartością zmiennej spis jest wskaźnik do pierwszego elementu listy.
Wskaźniki do następnych elementów są umieszczone w polach wsk kolejnych rekordów. W ostatnim elemencie listy polu wsk nadajemy wartość NIL, aby ułatwić rozpoznanie końca listy. Struktura listy jest przedstawiona na rys. 4.
Rys. 4
Algorytm tworzenia listy studentów
Dane: Informacje o studentach wprowadzane z klawiatury.
Wynik: Wskaźnik do początku listy studentów.
Na początku lista jest pusta, więc wskaźnikowi sp przypisz wartość NIL.
Czytaj imię i nazwisko studenta. Jeśli przeczytany napis jest pusty, to zakończ działanie algorytmu, w przeciwnym przypadku przejdź do następnego kroku.
Zarezerwuj obszar pamięci dla nowego elementu, używając pomocniczego wskaźnika Nowy.
Umieść dane o uczniu w odpowiednich polach rekordu Nowy^ (polu wsk nadaj wartość NIL, gdyż nowy element jest umieszczony na końcu listy).
Dopisz nowy element do końca listy
Powtarzaj kroki od 2 do 6.
Objaśnić należy sposób wykonania kroku 5. Jeżeli dopisujemy nowy element do końca pustej listy, to wskaźnikowi sp przypisujemy wartość wskaźnika Nowy. Jeśli lista nie jest pusta, to musimy znać wskaźnik sp do początku listy i dodatkowo wskaźnik Biezacy do ostatniego elementu listy, po którym należy dołączyć nowy element. Wówczas wykonujemy dwie operacje:
w polu wsk ostatniego elementu umieszczamy wskaźnik do nowego elementu (tj. wykonujemy Biezacy^.wsk:=Nowy,
zmieniamy wartość wskaźnika Biezacy tak, aby wskazywał na aktualnie ostatni element listy (tj. Biezacy:=Nowy).
Rys. 4
Powyższy algorytm realizujemy w procedurze CzytajImNazw.
Procedure CzytajImNazw(var sp:SpisStudentow);
var
i :integer;
dane :string[15];
nowy,biezacy :SpisStudentow;
begin
writeln('Podaj dane kolejnych studentow');
write('(na koncu danych nacisnij ENTER zamiast');
writeln(' podawac imie)');
sp:=nil; {na poczatku lista jest pusta}
i:=1;
repeat
writeln;
write(i:2,'Imie: ':12);
readln(dane);
if dane<>'' then
begin
new(nowy); {rezerwacja pamieci dla nowego rekordu}
nowy^.imie:=dane; {wypelnienie pol nowego rekordu}
write('Nazwisko: ':14);
readln(nowy^.nazw);
nowy^.wsk:=nil;
if sp=nil then
begin
sp:=nowy; {tworzenie pierwszego elementu listy}
biezacy:=sp;
end
else
begin
biezacy^.wsk:=nowy;{dolaczenie kolejnego elementu
do listy}
biezacy:=nowy;
end;
i:=i+1;
end
until dane=''
end;
W procedurze drukowania listy studentów stosujemy następujący algorytm:
Wskaźnikowi sp przypisz wartość wskaźnika do początku listy
Dopóki lista nie jest pusta (tj. sp<>NIL), wykonuj kroki 3 i 4
Wykonaj operacje związane z elementem wskazywanym przez wskaźnik sp
Przesuń wskaźnik do następnego elementu (tj. wykonaj sp:=sp^.wsk)
Procedure DrukujListe(sp:SpisStudentow);
var
i:integer;
begin
i:=1;
writeln;
writeln('Lista studentow':20);
writeln;
while sp<>nil do
begin
with sp^ do
writeln(i:2,imie:15,nazw:15);
sp:=sp^.wsk;
i:=i+1;
end;
end;
Zwróćmy uwagę na sposób tworzenia i drukowania listy studentów. Nowy element jest dopisywany zawsze do końca listy, a przeglądając listę wyprowadzamy elementy w kolejności ich dołączania, tzn. element dopisany do listy jako ostatni zostanie wydrukowany tez jako ostatni. Tak zorganizowaną listę nazywamy kolejką - zasady posługiwania się nią przypominają reguły rządzące kolejką znaną z życia.
Program ListaStudentow;
uses Crt;
type
SpisStudentow=^student;
student=record
imie,nazw :string[15];
wsk :SpisStudentow;
end;
var
spis:SpisStudentow;
procedure start(tytul:string);
begin
clrscr;
writeln(tytul);
writeln;
end;
procedure CzytajImNazw(var sp:SpisStudentow);
var
i :integer;
dane :string[15];
nowy,biezacy :SpisStudentow;
begin
writeln('Podaj dane kolejnych studentow');
write('(na koncu danych nacisnij ENTER zamiast');
writeln(' podawac imie)');
sp:=nil; {na poczatku lista jest pusta}
i:=1;
repeat
writeln;
write(i:2,'Imie: ':12);
readln(dane);
if dane<>'' then
begin
new(nowy); {rezerwacja pamieci dla nowego rekordu}
nowy^.imie:=dane; {wypelnienie pol nowego rekordu}
write('Nazwisko: ':14);
readln(nowy^.nazw);
nowy^.wsk:=nil;
if sp=nil then
begin
sp:=nowy; {tworzenie pierwszego elementu listy}
biezacy:=sp;
end
else
begin
biezacy^.wsk:=nowy;{dolaczenie kolejnego elementu
do listy}
biezacy:=nowy;
end;
i:=i+1;
end
until dane=''
end;
procedure DrukujListe(sp:SpisStudentow);
var
i:integer;
begin
i:=1;
writeln;
writeln('Lista studentow':20);
writeln;
while sp<>nil do
begin
with sp^ do
writeln(i:2,imie:15,nazw:15);
sp:=sp^.wsk;
i:=i+1;
end;
end;
procedure koniec;
begin
writeln;
writeln('Nacisnij klawisz ENTER');
readln
end;
begin
start('Tworzenie i drukowanie listy studentow');
CzytajImNazw(spis);
DrukujListe(spis);
koniec;
end.