Sunteți pe pagina 1din 27

a.

Inserarea unui nod la inceput ( capul listei)

typedef … t_date;
struct nod{
t_date date;
struct nod* urm;
}*p,*,q, *r, *f;/* p- primul nod, f- ultimul nod*/

r=(struct nod*)malloc(sizeof(struct nod));


r->urm=p;
p=r;

Constructie lista (varianta): inserari succesive in capul listei, rezultand o


lista in ordine inversa inserarii nodurilor

SDA curs 11 I INFO 2019/2020 1


b. Inserarea unui nod la sfarsit (coada listei)

 Necesita parcurgerea listei pana la sfarsit


 Varianta listei accesata prin p:
for (q=p;q->urm !=NULL; q=q->urm)
;
r=(struct nod*)malloc(sizeof(struct nod));
r->urm=NULL;
q->urm=r;/* nu functioneaza in cazul listei vide*/
 Varianta listei accesata prin p si f:
r=(struct nod*)malloc(sizeof(struct nod));
r->urm=NULL;
if(f==NULL)
p=f=r;
else{
f->urm=r;
f=r;
}
SDA curs 11 I INFO 2019/2020 2
c.Inserarea unui nod in interiorul listei

 dupa un anumit nod (*q) ( se cunoaste predecesorul)

r=(struct nod*)malloc(sizeof(struct nod));


r->urm=q->urm; /* 1*/
q->urm=r; /*2*/

 inaintea unui anumit nod (*q)( se cunoaste succesorul)

r=(struct nod*)malloc(sizeof(struct nod));


*r=*q; /* inclusiv campul de inlantuire*/
q->urm=r;/* se va completa nodul q cu informatia dorita*/

Ex. Inserarea unui nod inaintea unui nod precizat prin cheie

SDA curs 11 I INFO 2019/2020 3


Inserare nod inaintea unui nod precizat prin cheie
typedef struct{
declaratii /*int cheie;*/
struct nod* urm;
}NOD;
NOD * prim, *ultim;
elibnod( NOD* )--.elibereaza zona pt.nodul curent care nu a fost incarcat cu date
prin incnod()
incnod(NOD* ) returneaza -1 pentru sfarsit date, 0 pentru eroare, 1 pentru
incarcat date
NOD* inserarea_inainte( int c) /*returneaza pointer la nodul inserat sau NULL*/
{
extern NOD* prim;
NOD *p,*p1,*q;
int n;
n=sizeof (NOD);
SDA curs 11 I INFO 2019/2020 4
if (((q=(NOD*)malloc(n))!=NULL)&&(incnod(q)==1))
if( prim==NULL){
printf(“Lista vida\n”);
elibnod(q);
return(NULL);
}
else {
p=prim;
p1=NULL;
while (p!=NULL && p->cheie !=c){
p1=p;
p=p->urm;
}

SDA curs 11 I INFO 2019/2020 5


if(p==NULL){
printf(“nu exista nod de cheie %d”,c);
elibnod(q);
return(NULL);
}
else{
if( p==prim){
q->urm=prim;
prim=q;
}
else {
p1->urm=q;
q->urm=p;
}
return q;
}
SDA curs 11 I INFO 2019/2020 6
}
if (q==NULL){
printf (“ Memorie insuficienta inserare nod \n”);
return (NULL);
}
elibnod(q);
return (NULL);
}

SDA curs 11 I INFO 2019/2020 7


d.Constructia unei liste simplu inlantuite

 prin inserari repetate la inceput sau la sfarsit


typedef struct{
declaratii
struct nod* urm;
}NOD;
NOD * prim, *ultim;
int constructie_lista( )
{
extern NOD* prim, * ultim;
int n,i;
NOD *p;
n=sizeof(NOD);
prim=ultim=NULL;

SDA curs 11 I INFO 2019/2020 8


while (((p=(NOD*)malloc(n))!=NULL)&&((i=incnod(p))==1)
if(prim==NULL){
prim=ultim=p;
prim->urm=NULL;
}
else{
ultim->urm=p;
ultim=p;
ultim->urm=NULL;
}
if (p==NULL){
printf(“mem insuficienta\n”);
return (0);
}
elibnod(p);
return(i);
} SDA curs 11 I INFO 2019/2020 9
e.Stergerea unui nod

 cand se cunoaste predecesorul nodului ( *q)

r=q->urm;
q->urm=r->urm;
free( r);

 stergerea nodului curent (*q)

r=q->urm;
*q=*r; /*inclusiv campul de inlantuire*/
free ( r);
Obs. q->urm !=NULL
Ex: sterge primul nod dintr-o lista; sterge un nod de cheie data

SDA curs 11 I INFO 2019/2020 10


sterge_primul_nod()
{
extern NOD* prim, *ultim;
NOD* p;
if( prim== NULL)
printf (“Lista vida”);
else{
p=prim;
prim=prim->urm;
elibnod(p);
if(prim==NULL)
ultim=NULL;
}
}

SDA curs 11 I INFO 2019/2020 11


Sterge un nod de cheie data
sterge_cheie(int c)
{
extern NOD* prim, *ultim;
NOD* p, *p1;
if(prim==NULL){
printf(“lista vida\n”);
return;
}
p=prim;
p1=NULL;
while(p!=NULL && p->cheie!=c){
p1=p;
p=p->urm;
}

SDA curs 11 I INFO 2019/2020 12


if(p==NULL){
printf(“ Nu exista nod de cheie %d\n”,c);
return;;
}
if(p1==NULL){ /*primul nod, incusiv cazul unui singur nod in lista*/
p1=prim;
prim=prim->urm;
if(prim==NULL)
ultim=NULL;
elibnod(p);
return;
}
p1->urm=p->urm;
elibnod(p);
if((p1-urm>==NULL) /* ultimul nod in lista*/
ultim=p1;
}
SDA curs 11 I INFO 2019/2020 13
f.Traversarea listei

void procesare ( struct nod *…)


{

}

for(q=p;q!=NULL; q=q->urm)
procesare(q);

SDA curs 11 I INFO 2019/2020 14


g.Cautarea unui nod in lista cu metoda fanionului

cauta ( int x, ref inceput)


{
ref q;
q=inceput;
fanion->cheie=x;
while(q->cheie!=x) q=q->urm;
if(q== fanion)
{
q=inceput;
nou(inceput);
inceput->cheie=x;
inceput->numar=1;
inceput->urm=q;
}
else
q->numar=q->numar+1;
}
SDA curs 11 I INFO 2019/2020 15
h.Tehnica celor doi pointeri

 Crearea unei liste ordonate prin tehnica celor doi pointeri si metoda
fanionului; q2 il precede pe q1
 Cei doi pointeri avanseaza simultan pana cand cheia lui q1 devine mai
mare sau egala cu x – nodul care se insereaza; aplicand metoda
fanionului acest lucru se intampla cel mai tarziu cand q1 devine egal
cu fanionul

SDA curs 11 I INFO 2019/2020 16


6.4 Alte tipuri de liste

1. Liste simplu inlantuite ordonate

2. Liste circulare

3. Liste dublu inlantuite


typedef … TipElement;
typedef struct nod{
TipElement elem;
struct nod * prec;
struct nod *urm;
}TipNod;

SDA curs 11 I INFO 2019/2020 17


4. Liste multiplu inlantuite
- structura nodului contine mai multe campuri de inlantuire, asociate
unor criterii diferite de ordonare
- acestui tip de lista i se asociaza un numar de pointeri de inceput egal
cu numarul campurilor de inlantuire
- toate opreatiile de inserare si stergere trebuie sa refaca valoarea
campurilor de inlantuire dupa toate criteriile
5. Liste generalizate . Liste cu subliste.
- uzual se identifica o lista principala si subliste asociate nodurilor
acesteia
- uzual tipul nodurilor din lista principala difera de tipul nodurilor din
subliste

SDA curs 11 I INFO 2019/2020 18


6.5 Structuri derivate din tipul lista
6.5.1 Structura de date stiva
TDA stiva
I MM - tip special de lista, la care inserarile si stergerile se fac intr-un singur
capat, numit uzual varful stivei; se aplica principiul “ultimul intrat - primul
iesit” (LIFO)
II Notatii TipStiva s;
TipNod x;
boolean b;
III Operatori Initilaizare (s);
TipNod VarfStiva(s); TipNod pop(s);
pop(s);
push(s,x);
boolean StivaVida(s);
Implementare: tablouri; pointeri

SDA curs 11 I INFO 2019/2020 19


6.5.2 Structura de date coada

TDA coada
I MM - tip special de lista; elementele sunt inserate la un capat numit
spatele cozii si sunt suprimate la celalalt capat numit fata cozii (FIFO)
II Notatii TipCoada c;
TipElement x;
boolean b;
III Operatori Initilaizare (TipCoada c);
TipElement Fata(TipCoada c);
adauga (TipCoada c, TipElement x);
scoate( TipCoada c);
boolean CoadaVida(TipCoada c);
boolean CoadaPlina(TipCoada c);

SDA curs 11 I INFO 2019/2020 20


Implementare coada

a.Pointeri – doi pointeri ( fata, spate) + un nod fictiv


typedef … TipElement;
typedef struct nod {
TipElement element;
struct nod *urm;
}TipNod;
typedef TipNod* TipPointerNod;
typedef TipPointerNod {
TipPointerNod fata, spate;
}TipCoada;

SDA curs 11 I INFO 2019/2020 21


b. Tablouri
 Liniare- adaugarea se face in O(1), iar stergerea in O(n)
 Circulare – adaugarea si stergerea se realizeaza in O(1)
- inserarea presupune avansul indicatorului “spate”, iar stergerea avansul
indicatorului “fata”;coada se roteste in sensul acelor de ceasornic dupa cum se
adauga sau se scot elemente din ea
- In cazul in care tabloul se umple la dimensiunea maxima N, testul de coada
plina va coincide cu cel de coada goala ( spate precede fata); prin utilizarea
unui nod fictiv, lipsit de informatie, coada va fi plina pentru N-1 elemente utile.
In acest caz testul de “coada plina” conduce la valoarea adevarat daca “spate”
devine “fata” dupa doua incrementari succesive, iar testul de “coada goala”
devine adevarat daca spate devine fata dupa o singura incrementare.
- Ex. Pentru conversia “infix-postfix” se considera o expresie in forma infix
memorata intr-o lista inlantuita. Forma postfix se va memora intr-o coada
CoadaPost. Se va utiliza o stiva StivaOp care va memora operatorii pentru care
inca nu s-au determinat ambii operanzi.
SDA curs 11 I INFO 2019/2020 22
 Fiecarui operator i se asociaza o prioritate : I - *,/,**; II - +,-;
III –(,)
 Se va utiliza si o functie Transfer care va realiza o trecere din
varful stivei in spatele cozii
 a+(b*c/d**e)*f -abc*de**/f*+

void Transfer ( TipStiva s, TipCoada q)


{
adauga( varf(s), q);
pop(s);
}

SDA curs 11 I INFO 2019/2020 23


void ConversieInPostfix(TipLista Infix, TipCoada CoadaPost)
{ TipStiva StivaOp;
initializare(StivaOp); initializare(CoadaPost);
while( mai exista noduri in lista Infix)
{
*se ia nodul urmator t din lista Infix;
if ( t este numar)
adauga (t, CoadaPost);
else if (stiva_vida(StivaOp))
push (t, StivaOp);
else if ( t este “(“)
push ( t, StivaOp);

SDA curs 11 I INFO 2019/2020 24


else if ( t este “)”)
{ while (varf_stiva(StivaOp)!=“(“)
Transfer(StivaOp, CoadaPost);
pop(StivaOp);//descarca prima paranteza stanga
}
else
{ while ( precedenta lui t <=precedenta varf_Stiva(StivaOp))
Transfer (StivaOp, Coada Post);
push(t, StivaOp);
}
}
while (!stiva_vida(StivaOp))
Transfer (StivaOp, CoadaPost);//descarcare stiva
}

SDA curs 11 I INFO 2019/2020 25


Cozi bazate pe prioritate

 Tip special de coada, la care elementelor din structura li se asociaza o


prioritate, iar la extragere va fi extras ( sters) de fiecare data elementul cu
prioritatea cea mai mare
Operatori:inserare;
generare;
extragere ( elem cu prioritatea cea mai mare);
schimba_prioritate;
suprima ( sterge) un element oarecare;
reuneste doua cozi;
inlocuire- inserare urmata de extragerea “celui mai mare”

SDA curs 11 I INFO 2019/2020 26


Implementare

a.Liste neordonate ( cu pointeri, cu tablouri)

b. Liste ordonate ( cu pointeri, cu tablouri)

c. Ansamblu- arbore binar, partial ordonat, implementat cu tabou


a i>=a 2i
a i>=a 2i+1
i=1…N/2

Obs. Operatiile implementate pe structura de tip coada cu prioritate pot fi


utilizate pentru implementarea unor algoritmi de sortare; spre
exemplu utilizarea repetata a operatiei de inserare urmata de
extragere conduce la obtinerea unei secvente sortate

SDA curs 11 I INFO 2019/2020 27

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