Dynamiczne struktury danych
Procedury służące do dynamicznego przydzielania i zwalniania pamięci, zmienne typów wskaźnikowych są wykorzystywane do programowania dynamicznych struktur danych, którym pamięć jest przydzielana i zwalniana w trakcie wykonywania programu. Ze względu na organizację oraz sposoby dołączania, wstawiania
i usuwania składników można wyróżnić między innymi następujące metody:
Program wpisujący nazwiska do kolejki.
Program Kolejka1;
Type Wskaznik_Kolejki=^Element_Kolejki;
Element_Kolejki=Record
Nazwisko:String[30];
Wsk:Wskaznik_Kolejki;
End;
Var Kolejka,Biezacy,Nowy:Wskaznik_Kolejki;
Begin
Repeat
New(Nowy);
Write('Podaj nazwisko : ');
ReadLn(Nowy^.Nazwisko);
If Nowy^.Nazwisko <> '' Then
Begin
Nowy^.Wsk:=Nil;
If Kolejka=Nil Then
Begin
Kolejka:=Nowy;
Biezacy:=Nowy;
End
Else
Begin
Biezacy^.Wsk:=Nowy;
Biezacy:=Nowy;
End;
End;
Until Nowy^.Nazwisko='';
Biezacy:=Kolejka;
While Biezacy<>Nil Do
Begin
WriteLn('Nazwisko : ',Biezacy^.Nazwisko);
Biezacy:=Biezacy^.Wsk;
End;
End.
na koniec programuProgram wpisujący nazwiska na listę i usuwanie tych samych nazwisk z listy.
Program lista;
Uses Crt;
Type litery=set of 'A'..'Z';
wskaznik_listy=^skladnik_listy;
skladnik_listy=Record
dane:string;
wsk:Wskaznik_listy;
End;
Var pierwszy,biezacy:Wskaznik_listy;
tekst:string;
koniec:Boolean;
i,k:integer;
Procedure DoListy(var element :string;
Var biezacy:Wskaznik_listy );
Var poprzedni,nastepny:Wskaznik_listy;
Begin
If biezacy<> Nil Then
Begin
poprzedni:=biezacy;
nastepny:=biezacy^.wsk
End
Else Begin
poprzedni:=Nil;
nastepny:=Nil;
End;
New(biezacy);
With biezacy^ do
Begin
dane:=element;
wsk:=nastepny;
End;
If poprzedni<> Nil
Then poprzedni^.wsk:=biezacy
End;
Procedure miejsce(Var k:Integer;
Var pierwszy,biezacy:Wskaznik_listy);
Var nastepny:Wskaznik_listy;
i:Integer;
Begin
If pierwszy<>Nil Then
If k=1 Then biezacy:=pierwszy
Else If(k=2) and(pierwszy^.wsk=nil)
Then k:=0
Else
Begin
nastepny:=pierwszy;
i:=1;
Repeat
i:=i+1;
If nastepny^.wsk<>Nil Then
nastepny:=nastepny^.wsk
Until(nastepny^.wsk=nil) or (i=k);
If(nastepny^.wsk=nil) and(i<k) Then
k:=0
Else biezacy:=nastepny
End
End;
Procedure ZListy (Var element:string;
Var biezacy:Wskaznik_listy;
Var pierwszy:Wskaznik_listy);
Var poprzedni,nastepny:Wskaznik_listy;
Begin
If (pierwszy<>Nil) and(biezacy<>Nil) Then
If pierwszy<>biezacy Then
Begin
Poprzedni:=pierwszy;
nastepny:=poprzedni^.wsk;
If nastepny<>biezacy Then
Repeat
poprzedni:=nastepny;
nastepny:=poprzedni^.wsk;
Until nastepny=biezacy;
With biezacy^ do
Begin
element:=dane;
poprzedni^.wsk:=wsk;
End;
dispose(biezacy);
biezacy:=poprzedni;
End
Else
Begin
With pierwszy^ do
Begin
element:=dane;
pierwszy:=wsk;
End;
dispose(biezacy); {usunięcie składnika}
biezacy:=pierwszy;
End
End;
Begin
ClrScr;
Textcolor (14);
GotoXY(35,1);
Writeln('LISTA');
Writeln;
Textcolor(11);
WriteLn;
Writeln(' WPROWADŹ NAZWISKA : ');
WriteLn;
biezacy:=Nil;
i:=0;
koniec:=false;
Repeat
i:=i+1;
Textcolor(14);
Write(' Nazwisko ',i,': ');
Readln(tekst);
If tekst= '' Then
koniec:=True
Else
Begin
DoListy(tekst,biezacy);
If i=1 Then
pierwszy:=biezacy
End
Until tekst='';
If i>1 Then
Begin
ClrScr;
Textcolor(14);
GotoXy(30,1);
Writeln('LISTA UTWORZONA');
i:=i-1;
Textcolor(10);
GotoXY(28,3);
Writeln('LISTA SKŁADA SIĘ : ',i);
koniec:=false;
Repeat
Textcolor(12);
WriteLn;
Write('Ile usunąć ','');
Write('z listy (0-koniec) : ');
Readln(k);
If k < 1 Then
koniec:=true
Else
Begin
Miejsce(k,pierwszy,biezacy);
If k=0 then
Writeln(' największy nr : ',i)
Else
Begin
ZListy(tekst,pierwszy,biezacy);
i:=i-1;
Begin
Textcolor(9);
Writeln(' Nazwiska pozostałe w liście : ');
End;
If biezacy=Nil Then
Begin
Textcolor(12);
Writeln (' BRAK NAZWISK');
koniec:=true
End
Else for k:=1 to i do
Begin
Miejsce(k,pierwszy,biezacy);
Textcolor(10);
WriteLn;
Write(' Nazwisko ',k,' : ');
Writeln(biezacy^.dane)
End
End
End
Until koniec;
For k:=1 to i do
Begin
Miejsce(k,pierwszy,biezacy);
ZListy(tekst,pierwszy,biezacy);
End;
Textcolor(128+12);
WriteLn;
Writeln(' KONIEC!!! LISTA JEST JUŻ PUSTA');
Delay(4000);
End
End.