Sunteți pe pagina 1din 6

1.

Notiuni generale
O lista circulara simplu inlantuita este o lista in care ultimul element contine campul ce
adreseaza elementul urmator, adresa primului element.
Lista fiind circular, nu mai are un prim nod i un ultim nod (de regul, dar nu neaprat, noi
hotrm cum implementm);

1.1.

Definirea unei liste circulare simplu inlantuite

Crearea unei liste circulare se realizeaza in mod asemanator cu o lista liniara simplu inlantuita,
cu deosebirea ca ultimul element adaugat in lista nu va mai avea in campul de adresa valoarea
NIL, ci adresa primului element adaugat.

Ca si la lista simplu nlantuita, principalele operatii sunt:

crearea;
void cre_ad() //functia de creare si adaugare a unui nou element
{nod *c;
if(!p)
//daca lista este vida (p==0) se aloca primul nod
{p=new nod;
cout<<"valoare primului nod ";
cin>>p->info;
u=p;
//la creare primul si ultimul nod vor fi identici
}
else
//altfel se adauga un nou element la sfarsit
{ c=new nod;
//se aloca un nou nod
cout<<"informatia utila :";
cin>>c->info;
//se completeaza campul informatie utila
u->next=c;
//se adauga dupa ultimul nod
u=c;
//se stabileste noul nod c ca fiind ultimul
}
u->next=p;
//campul adresa urmatoare a ultimului nod este I nod;
}

accesul la un nod;

Nodurile se acceseaza secvential pornind de la nodul curent (ptr_nod).


p=ptr_nod;
if(p! = 0)
/* lista nu este vida */
do
while (p! = ptr_nod);
Accesul la un nod

inserarea unui nod;

Se pun urmatoarele probleme:

inserarea inaintea unui nod de cheie

inserarea dupa un nod de cheie data.

data;

In ambele cazuri se cauta nodul de cheie data avand adresa q; daca


exista un astfel de nod ,se creeaza nodul de inserat de adresa p si se
fac legaturile corespunzatoare.
a)

Inserarea inaintea unui nod de cheie data

se cauta nodul de cheie data, tinandu-se


minte nodul anterior

daca nodul a fost gasit atunci se realizeaza


inserarea, nodul anterior va pointa catre noul nod (p), iar
nodul p va pointa catre nodul de cheie data (q)
b)

Inserarea dupa un nod de cheie data

se cauta nodul de cheie data:

daca nodul s-a gasit, se insereaza noul

nod:
p->urm=q->urm;
q->urm=p;

stergerea unui nod,

Stergerea unui nod de cheie data key se va face astfel:

se cauta nodul de cheie data:


q = ptr_nod;
do
while (q! = ptr_nod);

se sterge nodul
if (q-> info == key)
delete(q);
}

stergerea listei.

Stergerea listei circulare simplu inlantuite se va face astfel:


p = ptr_nod;
do
while (p! = ptr_nod);
ptr_nod = 0;

Exemplu de problema
Sa se creeze o lista circulara cu caracterele dintr-un fisier existent pe disc. Fiecare nod al listei va
contine un caracter. La citirea din fisier, se vor scrie in lista doar caracterele care sunt litere sau
spatii. Sa se afiseze lista obtinuta.

Analiza problemei
Date de intrare : un fisier care contine litere, spatii, semne de punctuatie, simboluri
Date de iesire : o lista circulara simplu inlantuita care contine numai literele si spatiile din fisier
Se utilizeaza urmatoarele proceduri :

procedura creare creaza o lista circulara simplu inlantuita si face legatura cu fisierul

procedura afisare afiseaza lista circulara simplu inlantuita numai cu litere si spatii

In programul principal se citeste numele fisierului, se defineste multimea caracterelor si se


apeleaza procedurile de creare si afisare.

Program Pascal
program lista_circulara;
type pnod = ^nod;
nod = record
inf : char;
adr_urm : pnod;
end;
var b,c,v,aux : pnod;
nume : string;; f : text;
car : set of char;
procedure creare (nume : string);
begin
assign (f, nume);
reset (f);
while nor eof(f) do begin

while not eoln (f) do begin


new (c);
read (f, c^.inf);
if c^.inf in car) then
if b = nil then begin
b:=c;
v:=c;
end;
else begin
v^.adr_urm := c;
v:=c;
end;
v^.adr_urm:=b;
end;
readln(f);
end;
close (f);
end;
procedure afisare (b:pnod);
begin
if b <> nil then begin
c:=b;
while c^.adr_urm <> b do begin
write (c^.inf);
c:=c^.adr_urm;
end;
write (c^.inf);
end else writeln (Fisierul este gol.);
end;

begin
write (Numele fisierului:);
readln(nume);
car := [A..Z, a..z, ];
creare(nume);
afisare(b);
readln;
end;
Exemple de executie
Daca fisierul cuprinde caracterele :
a3lex^andr^u, programul va afisa
alexandru

Daca fisierul nu cuprinde nici un


caracter, programul va afisa
Fisierul este gol.

S-ar putea să vă placă și