Académique Documents
Professionnel Documents
Culture Documents
03 Structures PDF
03 Structures PDF
Algorithmique
Structures de donnes
Florent Hivert
Ml : Florent.Hivert@lri.fr
Page personnelle : http://www.lri.fr/hivert
2 de 52
Structures
squentielles : les
tableaux
Structures squentielles : les tableaux 4 de 52
Dfinition
Un tableau est une structure de donne T qui permet de stocker
un certain nombre dlments T [i] reprs par un index i. Les
tableaux vrifient gnralement les proprits suivantes :
tous les lments ont le mme type de base ;
le nombre dlments stocks est fix ;
laccs et la modification de llment numro i est en temps
constant (1), indpendant de i et du nombre dlments
dans le tableau.
Structures squentielles : les tableaux 5 de 52
Tableau en C
Oprations de base
Hypothses :
tableau de taille max_taille allou
lments 0 i < taille max_taille initialiss
taille = max_taille
Comportements possibles :
Erreur (arrt du programme, exception)
R-allocation du tableau avec recopie, cot : (taille)
Structures squentielles : les tableaux 8 de 52
R-allocation (2)
k
X k(k + 1)
bi = b (n2 )
2
i=1
Quelques valeurs :
Interprtation :
Si lon augmente la taille de 10% chaque tape, chaque nombre
sera recopi en moyenne 11 fois.
Si lon double la taille chaque tape, chaque nombre sera en
moyenne recopi deux fois.
Structures squentielles : les tableaux 11 de 52
Bilan
Compromis Espace/Temps
Retenir
Cest une situation trs classique : dans de nombreux problmes, il
est possible daller plus vite en utilisant plus de mmoire.
En pratique . . .
Variables Dynamiques
et pointeurs
Variables Dynamiques et pointeurs 15 de 52
Retenir
Une variable dynamique est anonyme :
(adresse, type, valeur) .
On y accde grce un pointeur.
adresse type
les quatre proprits dune variable usuelle nom valeur
x T
schma pour le pointeur p qui repre la VD p a
a T
dadresse a, de type T et de valeur v
v
x T
le lien dynamique entre le pointeur p et la VD p
T
quil repre est illustr par une flche
v
Variables Dynamiques et pointeurs 17 de 52
Retenir
Un pointeur p peut valoir NULL : il ne repre aucune VD.
T
schma pour le pointeur p de type T qui ne p NULL
repre aucune VD
T
laccs aucune VD pour le pointeur p de p
type T est illustr par une croix
NULL est une valeur commune tous les pointeurs, ceux du type
T comme ceux des autres types.
Variables Dynamiques et pointeurs 18 de 52
T T
p ? allouer(p) p
====== T
?
Variables Dynamiques et pointeurs 20 de 52
Utilisations
Retenir
Si p repre une VD, cette variable est note p.
T
la VD de type T et de valeur v repre par p p
T
est note p
p v
Retenir
Si le pointeur p repre une VD, laction de dsallocation
explicite
dsallouer(p)
met fin lexistence de la VD p et rend disponible lespace
mmoire quelle occupait.
T T
p dsallouer(p) p ?
T ========
v
Variables Dynamiques et pointeurs 22 de 52
T T
p p
T T
allouer(p)
? ====== ?
T
?
Variable dynamique en C
Retenir
Dclaration dun pointeur p de type T : T *p;
Allocation dune VD pointe par p :
p = (T *) malloc(sizeof(T)) ;
note : en cas dchec de lallocation malloc retourne NULL.
Accs la VD et sa valeur :
*p = ...; ... = (*p) + 1;
Dsallocation de la VD pointe par p :
free(p);
Variables Dynamiques et pointeurs 25 de 52
Les pointeurs en C
Retenir
Tout type de pointeur
supporte lopration daffectation =
peux tre utilis comme type de retour dune fonction
Note : ajout dun pointeur un entier (en cas de variable
dynamique multiple ; tableau)
Pour deux pointeurs de mme type :
test dgalit ==, de diffrence !=
Note : comparaison <,<=,>,>= (en cas de variable dynamique
multiple ; tableau)
Variables Dynamiques et pointeurs 26 de 52
Le programme :
char *p, *q
p = (char *) malloc(sizeof(char));
*p = A;
q = (char *) malloc(sizeof(char));
*q = B;
*p = *q;
printf("%i, %i\n", p == q, *p == *q);
affiche :
0, 1
Variables structures, enregistrements 27 de 52
Variables structures,
enregistrements
Variables structures, enregistrements 28 de 52
type structur
Syntaxe
Dclaration de type structur :
nom_de_type = structure:
nom_du_champ_1 : type_du_champ_1;
nom_du_champ_2 : type_du_champ_2;
...
v: nom_de_type;
Variables structures, enregistrements 30 de 52
Syntaxe
Dclaration de type structur :
struct nom_de_struct {
nom_du_champ_1 : type_du_champ_1;
nom_du_champ_2 : type_du_champ_2;
...
};
struct nom_de_struct v;
struct s_date {
char nom_jour[9]; // lundi, mardi, ..., dimanche
int num_jour; // 1, 2, ..., 31
int mois; // 1, 2, ..., 12
int annee;
}
Retenir
Toute opration valide sur une variable de type type_du_champ_i
est valide sur v.nom_du_champ_i.
Structures linaires :
les listes chanes
Structures linaires : les listes chanes 34 de 52
Ide
Chanages dynamiques
Retenir
Une liste chane est obtenue partir du type cellule dfinie par
cellule = structure:
val: element
next : ^cellule
liste = ^cellule
En C :
struct s_cell
{
element val;
struct s_cell * next;
};
typedef struct s_cell cell; // Cellule
typedef struct s_cell *list; // Liste Chane
Structures linaires : les listes chanes 37 de 52
Pointeur et structure
Syntaxe
Accs aux donnes dune liste chane :
VD pointe par lst : *lst
champ val de cell : cell.val
champ val de la VD pointe par lst :
Les notions sur les suites finies passent aux listes dynamiques
quelles implantent : longueur, concatnation, position...
Calcul itratif :
int longueur(list lst) {
int k = 0;
list q = lst;
while (q != NULL) {
q = q->next; k++;
}
return k;
}
Calcul rcursif :
int longueur(list lst) {
if (lst == NULL) return 0;
else return 1 + longueur(lst->next);
}
Structures linaires : les listes chanes 41 de 52
lst a1 a2 an
la fin
res x
plst lst a1 a2 an
la fin
tmp x
lst a1 a2 an
la fin
res a1 a2 an x
plst lst a1 a2 an x
la fin cur
tmp
le pointeur p repre la
lst a1 a2 an
LDSC avec une fausse
tte qui implante la suite
?
ha1 , a2 , . . . , an i
Intrts :
en mode avec mutation ;
vite davoir distinguer les cas de llment de tte ou de la
liste vide dans les oprations dinsertion et de suppression.
Structures linaires : les listes chanes 46 de 52
pointeurs reprant
respectivement la tte et la
a1 a2 an
queue de la LDSC qui implante
la suite ha1 , a2 , . . . , an i
Intrts :
en mode avec mutation ;
ajout en queue sans parcours de la LDSC ;
concatnation sans parcours des LDSC.
a1
an
Intrts :
en mode avec mutation ;
ajout en queue et suppression en tte sans parcours de la
LDSC ;
concatnation sans parcours des LDSC.
Structures linaires : les listes chanes 48 de 52
pointeurs reprant
respectivement la
tte et la queue de a1
a2 an
la LDDC qui
implante la suite
ha1 , a2 , . . . , an i
Intrts :
en mode avec mutation ;
marches avant et arrire ;
ajout en queue et suppression en tte sans parcours de la
LDDC ;
concatnation sans parcours des LDDC.
Structures linaires : les listes chanes 49 de 52
struct s_cell
{
element val;
struct s_cell * next;
struct s_cell * prev;
};
struct s_lddc
{
struct s_cell * first;
struct s_cell * last;
};
Structures linaires : les listes chanes 50 de 52
Applications
Liste des a b c
candidats ;
slection de b choix
choix->next->prev = choix->prev;
choix->prev->next = choix->next;
Suppression de a b c
b de la liste
choix