23
E.Kalisz - Structuri de date -- 4. 1 -- 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,...);

Structuri de Date - Cursdwd 4

Embed Size (px)

DESCRIPTION

adasddw

Citation preview

Structuri de Date - Curs 4#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "random.h"
#ifndef _LISTA_SIMPLU_INLANTUITA_
#define _LISTA_SIMPLU_INLANTUITA_
typedef struct cellista
int InsInc (ALista, AEL);
ALista InsSfL (ALista, AEL);
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 */
E.Kalisz - Structuri de date
char *format, char *sf);
cu formatul specificat, urmate de sirul sf.
Exemplu de apel:
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
Prelucrari liste: test ordonare
Conditia de ordonare: perechile de elemente respecta o relatie de ordine.
Algoritm TestOrd
atunci intoarce “neconcludent”;
atunci intoarce “neordonat”;
Algoritm TestMultime
lista care urmeaza
atunci intoarce esec;
atunci
avans in lista sursa;
{ TLista aux; /*
{ aux = *a; /* pregateste eliminarea celulei curente */
*a = aux->urm; /* avans la celula urmatoare */
free (aux); /* elibereaza spatiu */
{ extrage a doua celula din pereche;
ataseaza la sfarsitul listei rezultat;
}
}
A. Se creeaza o lista noua
a3
a2
b1
b2
a
a1
b
b5
b1
a1
r
b5
b3
b4
b4
a3
b3
a2
b2
cat timp exista pereche de celule a, b
{ aloca spatiu pentru doua celule
la sfarsit r;
daca esec alocare
atunci { distruge r;
cele doua noi celule din r;
avans in a si b;
avans la sfarsit r;
daca aux != NULL
daca esec copiere
atunci distruge r;
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
E.Kalisz - Structuri de date
 - daca a se termina inaintea lui b
atunci restul listei b se ataseaza la ultima celula din a
 - daca b se termina inaintea lui a
atunci nu trebuie efectuata nici o prelucrare speciala
a3
a2
b1
b2
a
a1
b
b5
b3
b4
a3
a2
b1
b2
a
a1
b
a5
b3
a4
nu este necesara nici o prelucrare
a3
a2
a4
a3
a1
a1
a2
a4
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)
a3
a2
(i2)
a
a1
(i1)
p
a4
a2
(2)
Cazuri particulare:
lista vida
- 5
13
- 5
7
22
11
11
13
22
10
7
10
daca ordine corecta
ataseaza inaintea succesorului;
I. Exista celula succesor
3
9
- 2
5
a
5
7
e
3
9
- 2
12
a
5
7
e
- parametri:
rezultat:
Algoritm
atunci intoarce adresa legaturii;
altfel avans in lista;