Sunteți pe pagina 1din 14

http://www-sop.inria.fr/oasis/personnel/Carine.

Courbis/c

6) Allocation Dynamique de Mmoire


&

Listes Chanes
IUT GTR Sophia-Antipolis
Carine.Courbis@sophia.inria.fr
Oct-Dec 2000

http://www-sop.inria.fr/oasis/personnel/Carine.Courbis/c

Plan
1] Introduction 2] Les Fonctions d'Allocation Dynamique de Mmoire 3] Les Listes Chanes
3.1] Insertion en Tte 3.2] Insertion en Queue 3.3] Insertion en Ordre

http://www-sop.inria.fr/oasis/personnel/Carine.Courbis/c

1] Introduction
Possible dallouer de la mmoire l'excution
(normalement la mmoire est alloue statiquement la compilation).

Intrts :
Gestion Optimale de la mmoire
Rservation d'une taille prcise de mmoire qd on en a besoin Libration de la mmoire qd on ne sen sert plus

Possibilit de dfinir des listes dlments de taille variable ( des tableaux qui sont de taille fixe)

Problme :
Les Pointeurs !!!

2] Les Fonctions d'Allocation 1/3


Bibliothque <stdlib.h>
Allocation de Mmoire
void * malloc(size_t size);
Fonction retournant un pointeur sur un espace mmoire rserv un lment de taille size ou bien NULL si lallocation est impossible. La mmoire alloue nest pas initialise. Rservation de Mmoire pour une chane : char * nom = (char *) malloc(sizeof(char)*(strlen(tabMaChaine) + 1); /* longueur de la chane contenue dans le tableau tabMaChaine, plus un pour le caractre de fin de chane, multiplie par la taille en mmoire dun caractre */ Rservation de Mmoire pour un Elve : Eleve * pEleve = (Eleve *) malloc(sizeof(Eleve));

http://www-sop.inria.fr/oasis/personnel/Carine.Courbis/c

2] Les Fonctions d'Allocation 2/3


Bibliothque <stdlib.h>
Allocation de Mmoire (suite)
void * calloc(size_t nbElem, size_t tailleElem);
Fonction retournant un pointeur sur un espace mmoire rserv un tableau de nbElem lments (chaque lment ayant tailleElem comme taille) ou bien NULL si lallocation est impossible. La mmoire alloue est initialise avec des zros.

http://www-sop.inria.fr/oasis/personnel/Carine.Courbis/c

void * realloc(void * p, size_t newTaille);


Change en newTaille la taille de l'lment point par p (le contenu est conserv). Retourne un pointeur sur le nouvel espace allou ou bien NULL si la rallocation est impossible (dans ce cas *p nest pas modifi).

2] Les Fonctions d'Allocation 3/3


Bibliothque <stdlib.h>
Libration de Mmoire
void free(void * p);
Libre lespace mmoire point par p; elle ne fait rien si p vaut NULL. p doit tre un pointeur sur un espace mmoire allou par malloc, calloc ou realloc. Il est conseill de dallouer la mmoire dont on ne se sert plus. free(nom); free(pEleve);

http://www-sop.inria.fr/oasis/personnel/Carine.Courbis/c

3] Listes Chanes 1/2


tete Simple Chanage

http://www-sop.inria.fr/oasis/personnel/Carine.Courbis/c

Chanage d'lments
Chaque lment possde l'Adresse de son Suivant (pointeur) Structure de donnes de Taille Variable Insertions/Suppressions d'lments se font par des Modifications de Chanage ( des dcalages en mmoire contigu comme dans les tableaux) Le Dernier Elment de la liste pointe sur une valeur particulire appele nil (en C, nil est reprsent par la constante NULL de la bibliothque <stdio.h>) not graphiquement
tete Double Chanage queue

http://www-sop.inria.fr/oasis/personnel/Carine.Courbis/c

3] Listes Chanes 2/2


Dfinition du Type des Elments
typedef struct _Eleve { char * nom; int id; struct _Eleve *suiv; } Eleve; Structure nomme pour permettre la dfinition rcursive du champ suiv

Dfinition d'un Elment de la Liste


Eleve * p = (Eleve *)malloc(sizeof(Eleve)); p 1 p->id = 1; p 1 p p->suiv = NULL; p 1 p->nom = (char*)malloc(sizeof(char)*(strlen(chaine) +1); strcpy(p->nom, chaine); p "Tournesol"

Il faut maintenant l'Insrer dans la Liste

http://www-sop.inria.fr/oasis/personnel/Carine.Courbis/c

3.1] Insertion en Tte 1/2


tete

Liste LIFO (Last In, First Out)


"Tournesol"
1

tete

tete

"Haddock"
2 1

"Tournesol"

tete

"Tintin"
3 2

"Haddock"
1

"Tournesol"

3.1] Insertion en Tte 2/2


Etat de la liste chane tete "Haddock"
2 1

http://www-sop.inria.fr/oasis/personnel/Carine.Courbis/c

Elment insrer "Tournesol" p "Tintin"


3

1] Fait pointer le champ suiv de l'lment insrer sur l'lment point par tte i.e. p->suiv = tete;

p tete

"Tintin"
3

"Haddock"
2 1

"Tournesol"

2] Fait pointer tete sur l'lment insrer i.e. tete = p;

p tete

"Tintin"
3

"Haddock"
2 1

"Tournesol"

http://www-sop.inria.fr/oasis/personnel/Carine.Courbis/c

3.2] Insertion en Queue 1/2


tete

Liste FIFO (First In, First Out)


"Tournesol"
1

tete

tete

"Tournesol"
1 2

"Haddock"

tete

"Tournesol" "Haddock"
1 2 3

"Tintin"

3.2] Insertion en Queue 2/2


if (tete == NULL) /* cas particulier si la tte est nil */ tete tete = p; else { /* 1] Recherche le dernier lment de la liste */ ptr = tete; ptr while (ptr->suiv != NULL) tete ptr = ptr->suiv; /* 2] Fait pointer le champ suiv du dernier lment sur l'lment insrer */ ptr->suiv = p; } ptr "Tournesol"
1 2

http://www-sop.inria.fr/oasis/personnel/Carine.Courbis/c

"Haddock"

"Tournesol"
1 2

"Haddock"

"Tintin"
3

3.3] Insertion en Ordre 1/2


(ici ordre alphabtique)
tete

http://www-sop.inria.fr/oasis/personnel/Carine.Courbis/c

tete

"Tournesol"
1

tete

"Haddock"
2 1

"Tournesol"

tete

"Haddock"
2 3

"Tintin"
1

"Tournesol"

if (tete == NULL) ptr /* cas particulier si la tte est nil */ tete = p; "Haddock" "Tournesol" else { /*Recherche o insrer selon l'ordre*/ tete 2 1 if (strcmp(tete->nom, p->nom) >0){ /* insertion en tte */ p->suiv = tete; tete = p; "Haddock" ptr } else { "Tournesol" tete /* 1] Recherche le prcdent */ ptr = tete->suiv; 2 1 while ((ptr->suiv != NULL) && p 3 (strcmp(ptr->suiv->nom, p->nom)<0)) "Tintin" ptr = ptr->suiv; "Haddock" /* 2] Fait pointer suiv de l'lment insrer sur ptr lment point par le prcdent */ tete "Tournesol" p->suiv = ptr->suiv; 2 1 /* 3] Chane le suivant du prcdent avec l'lment insrer */ p 3 ptr->suiv = p; "Tintin" }}

3.3] Insertion en Ordre 2/2

http://www-sop.inria.fr/oasis/personnel/Carine.Courbis/c

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