3.liste

7
Liste 1.Conţinutul lucrării În lucrare sunt prezentate operaţiile importante asupra listelor simplu înlănţuite si listelor circulare simplu înlănţuite. 2. Consideraţii teoretice Lista este o mulţime finită şi ordonată de elemente de acelaşi tip. Elementele listei se numesc noduri. Listele pot fi organizate sub formă statică, de tablou, caz în care ordinea este implicit dată de tipul tablou unidimensional, sau cel mai des, sub formă de liste dinamice, în care ordinea nodurilor este stabilită prin pointeri. Nodurile listelor dinamice sunt alocate în memoria heap. Listele dinamice se numesc liste înlănţuite, putând fi simplu sau dublu înlănţuite. În continuare se vor prezenta principalele operaţii asupra listelor simplu înlănţuite. Structura unui nod este următoarea: typedef struct tip_nod { int cheie; /* câmp neobligatoriu */ alte câmpuri de date utile; struct tip_nod urm; /* legătura spre următorul nod */ } TIP_NOD; Modelul listei simplu înlănţuite este prezentat în fig. 2.1. Fig. 2.1. Model de listă simplu înlănţuită Pointerii prim şi ultim vor fi declaraţi astfel: TIP_NOD *prim, *ultim; 2.1 Crearea unei liste simplu înlănţuite Crearea unei liste simplu înlănţuite se va face astfel: a) Iniţial lista este vidă:

Upload: valentina

Post on 16-Dec-2015

212 views

Category:

Documents


0 download

DESCRIPTION

sda

TRANSCRIPT

Lucrarea de laborator nr

Liste1. Coninutul lucrriin lucrare sunt prezentate operaiile importante asupra listelor simplu nlnuite si listelor circulare simplu nlnuite.2. Consideraii teoreticeLista este o mulime finit i ordonat de elemente de acelai tip. Elementele listei se numesc noduri.

Listele pot fi organizate sub form static, de tablou, caz n care ordinea este implicit dat de tipul tablou unidimensional, sau cel mai des, sub form de liste dinamice, n care ordinea nodurilor este stabilit prin pointeri. Nodurile listelor dinamice sunt alocate n memoria heap. Listele dinamice se numesc liste nlnuite, putnd fi simplu sau dublu nlnuite.

n continuare se vor prezenta principalele operaii asupra listelor simplu nlnuite.

Structura unui nod este urmtoarea:

typedef struct tip_nod {

int cheie; /* cmp neobligatoriu */

alte cmpuri de date utile;

struct tip_nod urm;/* legtura spre urmtorul nod */

} TIP_NOD;

Modelul listei simplu nlnuite este prezentat n fig. 2.1.

Fig. 2.1. Model de list simplu nlnuit

Pointerii prim i ultim vor fi declarai astfel:

TIP_NOD *prim, *ultim;

2.1 Crearea unei liste simplu nlnuite

Crearea unei liste simplu nlnuite se va face astfel:

a) Iniial lista este vid:

prim = 0; ultim = 0;

b) Se genereaz nodul de introdus:

n=sizeof(TIP_NOD);

p=(TIP_NOD *)malloc(n);/* rezervare spaiu de memorie n heap*/

citire date n nodul de adres p;c) Se fac legturile corespunztoare:

p->urm = 0; /*nodul este ultimul n list */

if(ultim != 0) ultim->urm = p; /* lista nu este vid */

else prim = p; /* nodul p este primul introdus n list */

ultim=p;

2.2 Accesul la un nod al unei liste simplu nlnuite

n funcie de cerine, nodurile listei pot fi accesate secvenial, extrgnd informaia util din ele. O problem mai deosebit este gsirea unui nod de o cheie dat i apoi extragerea informaiei din nodul respectiv. Cutarea nodului dup cheie se face liniar, el putnd fi prezent sau nu n list.

O funcie de cutare a unui nod de cheie key va conine secvena de program de mai jos; ea returneaz adresa nodului respectiv n caz de gsire sau pointerul NULL n caz contrar:

TIP_NOD *p;

p=prim;

while( p != 0 ) if (p->cheie == key)

{

/* s-a gsit nodul de cheie dat */

/* el are adresa p */

return p;

}

else p=p->urm;

return 0;/* nu exist nod de cheie = key */

2.3 Inserarea unui nod ntr-o list simplu nlnuit

Nodul de inserat va fi generat ca la paragraful 2.1; se presupune c are pointerul p.

Dac lista este vid, acest nod va fi singur n list:

if (prim == 0) {

prim=p; ultim=p; p->urm=0;

}

Dac lista nu este vid, inserarea se poate face astfel:

a) naintea primului nod

if(prim != 0) {

p->urm = prim; prim = p;

}

b) dup ultimul nod:

if (ultim != 0) {

p -> urm = 0; ultim -> urm = p; ultim = p;

}

c) naintea unui nod precizat printr-o cheie key:

-se caut nodul de cheie key:

TIP_NOD *q, *q1;

q1=0; q=prim;

while(q!=0)

{

if(q->cheie==key) break;

q1=q; q=q->urm;

}-se insereaz nodul de pointer p, fcnd legturile corespunztoare:

if(q!=0) { /*nodul de cheie key are adresa q */

if (q==prim) {

p->urm=prim; prim=p;

}

else {

q1->urm=p; p->urm=q;

}

}

d) dup un nod precizat printr-o cheie key:

-se caut nodul avnd cheia key:

TIP_NOD *q;

q=prim;

while(q!=0) {

if(q->cheie==key) break;

q=q->urm;

}

-se insereaz nodul de adres p, fcnd legturile corespunztoare:

if (q !=)0) { /* nodul de cheie key are adresa q */

p -> urm = q -> urm;

q -> urm=p;

if (q == ultim) ultim = p;

}

2.4 tergerea unui nod dintr-o list simplu nlnuit

La tergerea unui nod se vor avea n vedere urmtoarele probleme: lista poate fi vid, lista poate conine un singur nod sau lista poate conine mai multe noduri.

De asemenea se poate cere tergerea primului nod, a ultimului nod sau a unui nod dat printr-o cheie key.

a) tergerea primului nod

TIP_NOD *p;

if(prim!=0) {/* lista nu este vid */

p=prim; prim=prim->urm;

elib_nod(p); /*eliberarea spaiului de memorie */

if(prim==0) ultim=0; /* lista a devenit vid */

}

b) tergerea ultimului nod

TIP_NOD *q, *q1;

q1=0; q=prim;

if(q!=0) { /* lista nu este vid */

while(q!=ultim)

{

q1=q; q=q->urm;

}

if(q==prim) {

prim=0; ultim=0;

}

else {

q1->urm=0; ultim=q1;

}

elib_nod(q);

}

c) tergerea unui nod de cheie key

TIP_NOD *q, *q1;

/* cutare nod */

q1=0; q=prim;

while (q!=0)

{

if(q->cheie == key) break; /* s-a gsit nodul */

q1=q; q=q->urm;

}

if(q != 0) { /* exist un nod de cheie key */

if (q == prim) {

prim=prim_>urm;

elib_nod(q); /*eliberare spaiu */

if( prim==0) ultim=0;

}

else {

q1->urm=q->urm;

if(q==ultim) ultim=q1;

elib_nod(q); /* eliberare spaiu */

}

2.5 tergerea unei liste simplu nlnuite

n acest caz, se terge n mod secvenial fiecare nod:

TIP_NOD *p;

while( prim != 0) {

p=prim; prim=prim->ultim;

elib_nod(p); /*eliberare spaiu de memorie */

}

ultim=0;

2.6. Liste circulare simplu nlnuiteLista circular simplu nlnuit este lista simplu nlnuit a crei ultim element este legat de primul element; adic ultim -> urm = prim.

n cadrul listei circulare simplu nlnuite nu exist capete. Pentru gestionarea ei se va folosi un pointer ptr_nod, care adreseaz un nod oarecare al listei, mai precis ultimul introdus (fig.2.6.1.).

Ca i la lista simplu nlnuit, principalele operaii sunt:

crearea;

accesul la un nod;

inserarea unui nod;

tergerea unui nod,

tergerea listei.

Structura unui nod este urmtoarea:

typedef struct tip_nod {

int cheie; /* nu este obligatoriu acest cmp */

cmpuri;

struct tip_nod *urm;

} TIP_NOD;3. Mersul lucrrii

3.1. De la tastatur se citesc cuvinte. S se creeze o list simplu nlnuit ordonat alfabetic, care conine n noduri cuvintele distincte i frecvena lor de apariie. Se va afia coninutul listei n ordine alfabetic.

3.2. S se conceap o structur dinamic eficient pentru reprezentarea n memorie a polinoamelor. Se vor scrie funcii de calcul a sumei, diferenei, produsului i mpririi a dou polinoame.

3.3. S se conceap o structur dinamic eficient pentru reprezentarea matricelor rare. S se scrie operaii de calcul a sumei i produsului a dou matrici rare. Afiarea se va face n form natural.

3.4. De la tastatur se citete numrul n i numele a n copii. S se simuleze urmtorul joc: cei n copii stau ntr-un cerc. ncepnd cu un anumit copil, se numr copiii n sensul acelor de ceasornic. Fiecare al n-lea copil iese din cerc .Ctig ultimul copil rmas n joc.

EMBED PBrush

EMBED PBrush

EMBED Word.Picture.8

_1486802130.doc

simplu nlnuite

Fig. 2.6.1 Modelul listei circulare