Sunteți pe pagina 1din 23

-- 4.

1 --

E.Kalisz - Structuri de date

Tipul lista simplu inlantuita


/*-- tlista.h --- LISTA SIMPLU INLANTUITA
cu elemente de tip intreg ---*/
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "random.h"
#ifndef _LISTA_SIMPLU_INLANTUITA_
#define _LISTA_SIMPLU_INLANTUITA_
typedef int TEL, *AEL;
/* Element si Adr_Element */
typedef struct cellista
{ TEL info;
struct cellista * urm;
} TCel, *TLista, **ALista;
typedef int (*TFPrelEL)(AEL e,...);

-- 4. 2 --

E.Kalisz - Structuri de date

Tipul lista simplu inlantuita


/*-- operatii elementare --*/
TLista AlocCel(AEL);
/* adresa celulei create sau NULL */
int
InsInc (ALista, AEL);
/* inserare la inceput reusita sau nu (1/0) */
ALista InsSfL (ALista, AEL);
/* adresa legatura la celula inserata sau NULL */
int
ElimPL (ALista); /* elimina primul */
void
DistrL (ALista); /* elimina toate celulele */
size_t LungL (ALista); /* nr.elemente din lista */
ALista CautaL (ALista aL, TFPrelEL f, int Gasit);
/* daca exista celula pt.care f(adr.element)
intoarce Gasit atunci intoarce adresa leg.
catre celula respectiva, altfel intoarce
adr.campului urm din ultima celula */

-- 4. 3 --

E.Kalisz - Structuri de date

Tipul lista simplu inlantuita


/*-- operatii de afisare si creare;
incep prin afisarea unui antet --*/
void AfisareL(ALista aL, char *antet,
char *format, char *sf);
/* Afiseaza valorile elementelor din lista,
cu formatul specificat, urmate de sirul sf.
Exemplu de apel:
Afisare(&L1,"Prima lista: [", " %i", " ]\n"); */
TLista GenerL (size_t N, int v1, int v2, char *antet);
/* genereaza lista cu cel mult N elemente,
cu valori intre v1 si v2 */
#endif

E.Kalisz - Structuri de date

Prelucrari liste: test ordonare

-- 4. 4 --

Conditia de ordonare: perechile de elemente respecta o


relatie de ordine.
Algoritm TestOrd
{ daca lista vida sau cu o singura celula
atunci intoarce neconcludent;
cat timp exista doua celule de analizat
{ daca relatia de ordine nu este indeplinita
atunci intoarce neordonat;
altfel avans in lista;
}
intoarce neordonat;
}

E.Kalisz - Structuri de date

Prelucrari liste: test multime

-- 4. 5 --

Conditia de multime: elementele din lista nu se repeta.


Algoritm TestMultime
{ daca lista vida
atunci intoarce succes;
cat timp exista doua celule de analizat
{ daca info din celula curenta apare in
lista care urmeaza
atunci intoarce esec;
altfel avans in lista;
}
intoarce succes;
}

-- 4. 6 --

E.Kalisz - Structuri de date

Copiere lista

e1

e2

e1

....

e3

c
aL

e1

e2

e1

e2

e3

E.Kalisz - Structuri de date

Copiere lista
Algoritm Copiere
{ initializari;
cat timp exista celula de copiat
{ daca nu reuseste alocare celula copie
atunci
{ distruge copia partiala;
intoarce NULL;
}
altfel
{ avans la sfarsit copie partiala;
avans in lista sursa;
}
}
intoarce adresa copie;
}

-- 4. 7 --

-- 4. 8 --

E.Kalisz - Structuri de date

Distruge lista
a

e1

aux

...

e1

...

aux

void DistrL(ALista a)
/* elimina toate cel.din lista
{ TLista aux; /*
while ( *a != NULL)
/* cat timp mai exista celule
{ aux = *a; /* pregateste eliminarea celulei curente
*a = aux->urm;
/* avans la celula urmatoare
free (aux);
/* elibereaza spatiu */
}
}

*/
*/
*/
*/

-- 4. 9 --

E.Kalisz - Structuri de date

Mutare celula
as

(2)

(2)

as
.....

.....

(1)
aux

(3)

(1)
aux
(4)

.....

ar

ar
as

(2)
.....
(3)

(4)

ar

.....

.....

-- 4. 10 --

E.Kalisz - Structuri de date

Separarea celulelor unei liste


a

e1

e2

e3

e4

e5

e6

e7

r
......
a

e1

e3

e2

e5

e4

e7

e6

-- 4. 11 --

E.Kalisz - Structuri de date

Separarea celulelor unei liste

Algoritm SeparaIterativ:
{ initializari;
cat timp in sursa exista pereche de celule
{ extrage a doua celula din pereche;
ataseaza la sfarsitul listei rezultat;
}
}

-- 4. 12 --

E.Kalisz - Structuri de date

Intercalarea celulelor din doua liste


A. Se creeaza o lista noua
a

a1

a2

a3

b1

b2

b3

b4

b5

a1

b1

a2

b2

a3

b3

b4

b5

-- 4. 13 --

E.Kalisz - Structuri de date

Algoritm IntercalareA
{ initializari lista rezultat (r) si aux;
cat timp exista pereche de celule a, b
{ aloca spatiu pentru doua celule
la sfarsit r;
daca esec alocare
atunci { distruge r;
intoarce NULL;
}
altfel { copiaza info din a si b in
cele doua noi celule din r;
avans in a si b;
avans la sfarsit r;
}
}

E.Kalisz - Structuri de date

-- 4. 14 --

Algoritm IntercalareA - continuare


daca mai exista celule in a
atunci aux = adresa celula din a;
altfel aux = adresa celula din b;
daca aux != NULL
{ ataseaza la sfarsitul lui r copie aux;
daca esec copiere
atunci distruge r;
intoarce NULL;
}
intoarce r;
}

E.Kalisz - Structuri de date

-- 4. 15 --

Intercalarea celulelor din doua liste (B)


B. Se muta in prima lista celulele din cealalta
Cazuri particulare:
- lista b este vida nu este necesara nici o prelucrare
- lista a este vida b se ataseaza direct la a
Cazul listelor nevide
- lista b se transforma in lista vida
- modificarile se produc in campul urm al perechilor de
celule din liste, informatiile strict necesare fiind:
adresa campului urm al celulei din a
adresa celulei din b

-- 4. 16 --

E.Kalisz - Structuri de date

Finalizare intercalare (B)


- daca a se termina inaintea lui b
atunci restul listei b se ataseaza la ultima celula din a
a
b

a1

a2

a3

b1

b2

b3

b4

b5

- daca b se termina inaintea lui a


atunci nu trebuie efectuata nici o prelucrare speciala
a

a1

a2

a3

b1

b2

b3

a4

a5

-- 4. 17 --

E.Kalisz - Structuri de date

Inversarea unei liste


a1

a2

a3

a4

a4

a3

a2

a1

Cazuri particulare:
- lista vida
- lista cu o singura celula
nu este necesara nici o prelucrare

E.Kalisz - Structuri de date

Inversarea unei liste


a

a1

a2

(i2)
p

a3

-- 4. 18 --

a4

(i1)

separa prima celula, care va deveni ultima;


cat timp mai exista celule de mutat
muta celula de la adresa p (cu indice i in
lista initiala) in fata celulei de la adresa *a
(cu indice i-1 in lista initiala)

a
(4)
aux
ai
(1)

ai-1

(3)

p (2)

....

....

a2

a1

-- 4. 19 --

E.Kalisz - Structuri de date

Ordonarea unei liste


11

13

-5

22

10

-5

10

11

13

22

Parametri:
- adresa listei
- functia de verificare a relatiei de ordine
Cazuri particulare:
- lista vida
- lista cu o singura celula

-- 4. 20 --

E.Kalisz - Structuri de date

Etapele ordonarii unei liste


11

13

-5

22

20

-5

11

13

22

20

-5

11

13

22

20

-5

11

13

22

20

-5

11

13

20

22

-- 4. 21 --

E.Kalisz - Structuri de date

Ordonarea unei liste


Algoritm Ordonare
{ cat timp exista pereche de celule
daca ordine corecta
atunci avans in lista;
altfel
{ desprinde a doua celula;
cauta legatura la celula succesor;
ataseaza inaintea succesorului;
}
}

-- 4. 22 --

E.Kalisz - Structuri de date

Cautarea legaturii la prima celula succesor


I. Exista celula succesor
-2

a
e

II. Nu exista celula succesor


-2

a
e

12

E.Kalisz - Structuri de date

-- 4. 23 --

Cautarea legaturii la prima celula succesor


- parametri:
adresa listei (a)
adresa elementului referinta (e)
functia de verificare a relatiei de ordine
- rezultat:
adresa legaturii la celula succesor (I) sau
adresa campului urm din ultima celula (II)
Algoritm
{ cat timp exista celula
daca info este succesorul referintei
atunci intoarce adresa legaturii;
altfel avans in lista;
intoarce adresa legaturii;
}

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