Pointeurs : gestion dynamique de la memoire´

138
Pointeurs : gestion dynamique de la m´ emoire 1 Salem BENFERHAT Centre de Recherche en Informatique de Lens (CRIL-CNRS) email : [email protected] 1 Version pr´ eliminaire du cours. Tout retour sur la forme comme sur le fond est le bienvenu. 1 / 111

Transcript of Pointeurs : gestion dynamique de la memoire´

Page 1: Pointeurs : gestion dynamique de la memoire´

Pointeurs : gestion dynamique de la memoire1

Salem BENFERHAT

Centre de Recherche en Informatique de Lens (CRIL-CNRS)email : [email protected]

1Version preliminaire du cours. Tout retour sur la forme comme sur le fond est le bienvenu.

1 / 111

Page 2: Pointeurs : gestion dynamique de la memoire´

Variables, typesespaces memoire et adresses

2 / 111

Page 3: Pointeurs : gestion dynamique de la memoire´

Les variables ...

Types• Les langages de programmation permettent de decrire des

donnees de natures et complexites differentes en utilisant lanotion de type

• Des exemples de type de base en langage C sont :

CharIntunsigned intShortLongunsigned longfloatdoublelong double

3 / 111

Page 4: Pointeurs : gestion dynamique de la memoire´

Les variables ...

Les variables• A chaque fois qu’une variable de type T (de base ou complexe)

est declaree un espace memoire lui est reserve.• En langage C, la commande sizeof permet de connaıtre l’espace

memoire associe a chaque type.

4 / 111

Page 5: Pointeurs : gestion dynamique de la memoire´

Taille des donnees

1 void taille_des_types ()2 {3 printf ("char = %lu byte\n", sizeof(char));4 printf ("short = %lu bytes\n", sizeof(short));5 printf ("int = %lu bytes\n", sizeof(int));6 printf ("unsigned int = %lu bytes\n",sizeof(unsigned int));7 printf ("long = %lu bytes\n", sizeof(long));8 printf ("unsigned long = %lu bytes\n",sizeof(unsigned long));9 printf ("float = %lu bytes \n", sizeof(float));

10 printf ("double = %lu bytes\n", sizeof(double));11 printf ("long double = %lu bytes\n", sizeof(long double));12 }

5 / 111

Page 6: Pointeurs : gestion dynamique de la memoire´

Espace memoire pour les variables

Espace memoireL’execution du programme donne l’espace memoire qui sera reservepour chaque type :

char = 1 byteshort = 2 bytesint = 4 bytesunsigned int = 4 byteslong = 8 bytesunsigned long = 8 bytesfloat = 4 bytesdouble = 8 byteslong double = 16 bytes

6 / 111

Page 7: Pointeurs : gestion dynamique de la memoire´

Adresse

Emplacement des donnees• Les programmes, les fonctions, les variables et les donnees sont

stockes en memoire.• La memoire peut-etre vue comme un grand tableau ou chaque

case contient generalement un mot memoire.• Les indices de ce tableau sont appeles des adresses.• On accede aux informations grace a ces adresses.

L’operateur &L’operateur &, applique a une variable ou a une fonction, permet derecuperer l’adresse de la variable ou de la fonction.

7 / 111

Page 8: Pointeurs : gestion dynamique de la memoire´

Exemple sur l’operateur &

Adresse des variablesGrace a l’operateur &, on peut recuperer les adresses des variableslocales et parametres utilises dans la fonction Estpremiernaif.

12 int Estpremiernaif( int n)3 {4 int i;5 if( n <= 1) return 0;6 printf ("Dans la fonction Estpremiernaif :\n");7 printf ("la variable n se trouve a l’adresse %p :\n", &n);8 printf ("la variable local i se trouve a l’adresse %p :\n", &i);9 for(i = 2; i <= n; ++i)

10 {11 if(n % i == 0) return 0;12 }13 return 1;14 }

8 / 111

Page 9: Pointeurs : gestion dynamique de la memoire´

Exemple sur l’operateur &

Adresse• L’execution de la fonction donne :

Dans la fonction Estpremiernaif :

la variable n se trouve a l’adresse : 0x7fff61f5cb2cla variable local i se trouve a l’adresse : 0x7fff61f5cb20

• Les adresses sont donnees en hexadecimal

9 / 111

Page 10: Pointeurs : gestion dynamique de la memoire´

Exemple sur l’operateur & (suite)

Adresse des variablesGrace a l’operateur &, on peut egalement recuperer les adresses desfonctions.

123 int main ()4 {5 int nombre;6 printf ("Introduire un nombre : ");7 scanf ("%d", &nombre);8 printf ("l\’adresse de la variable nombre est : %p \n", &nombre);9 printf ("l\’adresse de la fonction Estpremiernaif est : %p \n",

10 &Estpremiernaif);11 printf ("l\’adresse de la fonction main est : %p \n", &main);12 if (Estpremiernaif(nombre)==1)13 printf ("Le nombre %d est premier : ", nombre);14 else printf ("Le nombre %d n est pas premier : ", nombre);15 return(0);16 }

10 / 111

Page 11: Pointeurs : gestion dynamique de la memoire´

Exemple sur l’operateur & (suite)

L’adresse• L’execution de la fonction donne :

l’adresse de la variable nombre est : 0x7fff6d03db44l’adresse de la fonction Estpremiernaif est : 0x10d43eba0l’adresse de la fonction main est : 0x10d43ec50

Remarque• La variable nombre utilisee dans le programme principal et le

parametre n de la fonction Estpremiernaif n’ont pas la memeadresse.

• De ce fait, toute modification sur n n’affectera pas la variablenombre.

11 / 111

Page 12: Pointeurs : gestion dynamique de la memoire´

Exemple sur l’operateur & (suite)

L’adresse• L’execution de la fonction donne :

l’adresse de la variable nombre est : 0x7fff6d03db44l’adresse de la fonction Estpremiernaif est : 0x10d43eba0l’adresse de la fonction main est : 0x10d43ec50

Remarque• La variable nombre utilisee dans le programme principal et le

parametre n de la fonction Estpremiernaif n’ont pas la memeadresse.

• De ce fait, toute modification sur n n’affectera pas la variablenombre.

11 / 111

Page 13: Pointeurs : gestion dynamique de la memoire´

Gestion dynamique de la memoire

Pointeur• Pour manipuler les adresses memoire nous avons besoin de

variables particulieres appelees pointeurs.

• Un pointeur est donc une variable qui contient l’adresse d’unedonnee contenue en memoire.

• Un pointeur aura une valeur entiere (qui represente une adressememoire).

• Grace aux pointeurs, on separe le contenu (une valeur) ducontenant (une adresse).

12 / 111

Page 14: Pointeurs : gestion dynamique de la memoire´

Gestion dynamique de la memoire

Pointeur• Pour manipuler les adresses memoire nous avons besoin de

variables particulieres appelees pointeurs.

• Un pointeur est donc une variable qui contient l’adresse d’unedonnee contenue en memoire.

• Un pointeur aura une valeur entiere (qui represente une adressememoire).

• Grace aux pointeurs, on separe le contenu (une valeur) ducontenant (une adresse).

12 / 111

Page 15: Pointeurs : gestion dynamique de la memoire´

Gestion dynamique de la memoire

Pointeur• Pour manipuler les adresses memoire nous avons besoin de

variables particulieres appelees pointeurs.

• Un pointeur est donc une variable qui contient l’adresse d’unedonnee contenue en memoire.

• Un pointeur aura une valeur entiere (qui represente une adressememoire).

• Grace aux pointeurs, on separe le contenu (une valeur) ducontenant (une adresse).

12 / 111

Page 16: Pointeurs : gestion dynamique de la memoire´

Gestion dynamique de la memoire

Pointeur• Pour manipuler les adresses memoire nous avons besoin de

variables particulieres appelees pointeurs.

• Un pointeur est donc une variable qui contient l’adresse d’unedonnee contenue en memoire.

• Un pointeur aura une valeur entiere (qui represente une adressememoire).

• Grace aux pointeurs, on separe le contenu (une valeur) ducontenant (une adresse).

12 / 111

Page 17: Pointeurs : gestion dynamique de la memoire´

Organisation de la memoire

3 partiesPour faire simple, la memoire est divisee en 3 parties :

• Une partie statique contenant principalement le code desfonctions.

• Une Pile (Stack) qui contient principalement les variables creesstatiquement (au niveau de la compilation).

• Un Tas (Heap) qui contient les variables creees dynamiquement.

13 / 111

Page 18: Pointeurs : gestion dynamique de la memoire´

Organisation de la memoire

3 partiesPour faire simple, la memoire est divisee en 3 parties :

• Une partie statique contenant principalement le code desfonctions.

• Une Pile (Stack) qui contient principalement les variables creesstatiquement (au niveau de la compilation).

• Un Tas (Heap) qui contient les variables creees dynamiquement.

13 / 111

Page 19: Pointeurs : gestion dynamique de la memoire´

Organisation de la memoire

3 partiesPour faire simple, la memoire est divisee en 3 parties :

• Une partie statique contenant principalement le code desfonctions.

• Une Pile (Stack) qui contient principalement les variables creesstatiquement (au niveau de la compilation).

• Un Tas (Heap) qui contient les variables creees dynamiquement.

13 / 111

Page 20: Pointeurs : gestion dynamique de la memoire´

Organisation de la memoire

3 partiesPour faire simple, la memoire est divisee en 3 parties :

• Une partie statique contenant principalement le code desfonctions.

• Une Pile (Stack) qui contient principalement les variables creesstatiquement (au niveau de la compilation).

• Un Tas (Heap) qui contient les variables creees dynamiquement.

13 / 111

Page 21: Pointeurs : gestion dynamique de la memoire´

Gestion dynamique de la memoire

DeclarationType *Nom de la variable;

• Le type peut-etre de type simple (entier, reel, ...) ou complexe.

• La presence de ”*” indique que l’on ne travaille plus sur unevariable normale, mais sur un pointeur.

• Au niveau de la compilation (allocation statique) :

seul l’espace dedie au pointeur est reserve.La taille de cet espace est fixe etelle est completement independante du type de donnees ”pointe”par la variable pointeur.

14 / 111

Page 22: Pointeurs : gestion dynamique de la memoire´

Gestion dynamique de la memoire

DeclarationType *Nom de la variable;

• Le type peut-etre de type simple (entier, reel, ...) ou complexe.

• La presence de ”*” indique que l’on ne travaille plus sur unevariable normale, mais sur un pointeur.

• Au niveau de la compilation (allocation statique) :

seul l’espace dedie au pointeur est reserve.La taille de cet espace est fixe etelle est completement independante du type de donnees ”pointe”par la variable pointeur.

14 / 111

Page 23: Pointeurs : gestion dynamique de la memoire´

Gestion dynamique de la memoire

DeclarationType *Nom de la variable;

• Le type peut-etre de type simple (entier, reel, ...) ou complexe.

• La presence de ”*” indique que l’on ne travaille plus sur unevariable normale, mais sur un pointeur.

• Au niveau de la compilation (allocation statique) :

seul l’espace dedie au pointeur est reserve.La taille de cet espace est fixe etelle est completement independante du type de donnees ”pointe”par la variable pointeur.

14 / 111

Page 24: Pointeurs : gestion dynamique de la memoire´

Gestion dynamique de la memoire

DeclarationType *Nom de la variable;

• Le type peut-etre de type simple (entier, reel, ...) ou complexe.

• La presence de ”*” indique que l’on ne travaille plus sur unevariable normale, mais sur un pointeur.

• Au niveau de la compilation (allocation statique) :

seul l’espace dedie au pointeur est reserve.La taille de cet espace est fixe etelle est completement independante du type de donnees ”pointe”par la variable pointeur.

14 / 111

Page 25: Pointeurs : gestion dynamique de la memoire´

Taille d’une variable de type pointeur

123 void taille_pointeurs()4 {5 int *pointeur1;6 long double *pointeur2;7 printf ("la taille d’un pointeur sur un type \n");8 printf ("entier est de : %lu Bytes \n", sizeof(pointeur1));9 printf ("long double est de : %lu Bytes \n", sizeof(pointeur2));

10 }

15 / 111

Page 26: Pointeurs : gestion dynamique de la memoire´

Taille d’une variable de type pointeur

Exemple• L’execution du programme donne : la taille d’un pointeur

sur un type entier est de : 8 Bytessur un type long double est de : 8 Bytes

• La taille reservee a une variable de type pointeur est la meme.

16 / 111

Page 27: Pointeurs : gestion dynamique de la memoire´

Taille d’une variable de type pointeur

Exemple• L’execution du programme donne : la taille d’un pointeur

sur un type entier est de : 8 Bytessur un type long double est de : 8 Bytes

• La taille reservee a une variable de type pointeur est la meme.

16 / 111

Page 28: Pointeurs : gestion dynamique de la memoire´

Adresse et valeur

• Nous avons deja vu que si A est une variable de type T, alors&T

donne l’adresse de l’emplacement de T dans la memoire.

• Si p est une variable de type pointeur vers une donnee de type T,alors

*pdonne le contenu de l’emplacement memoire dont l’adresse est p.

• Il est possible des operations sur les pointeurs.

17 / 111

Page 29: Pointeurs : gestion dynamique de la memoire´

Adresse et valeur

• Nous avons deja vu que si A est une variable de type T, alors&T

donne l’adresse de l’emplacement de T dans la memoire.

• Si p est une variable de type pointeur vers une donnee de type T,alors

*pdonne le contenu de l’emplacement memoire dont l’adresse est p.

• Il est possible des operations sur les pointeurs.

17 / 111

Page 30: Pointeurs : gestion dynamique de la memoire´

Adresse et valeur

• Nous avons deja vu que si A est une variable de type T, alors&T

donne l’adresse de l’emplacement de T dans la memoire.

• Si p est une variable de type pointeur vers une donnee de type T,alors

*pdonne le contenu de l’emplacement memoire dont l’adresse est p.

• Il est possible des operations sur les pointeurs.

17 / 111

Page 31: Pointeurs : gestion dynamique de la memoire´

Affectations

• Soit p1 et p2 deux pointeurs du meme type T. Soit A une variablede type T. Alors, les operations suivantes sont permises :

• Affectation d’adresse a un pointeur :

p1 = p2

p1 = &A

p1 = NULL

• Affectation de valeur :

∗p1 = ∗p2

∗p1 = A

A = ∗p1

18 / 111

Page 32: Pointeurs : gestion dynamique de la memoire´

Affectations

• Soit p1 et p2 deux pointeurs du meme type T. Soit A une variablede type T. Alors, les operations suivantes sont permises :

• Affectation d’adresse a un pointeur :p1 = p2

p1 = &A

p1 = NULL

• Affectation de valeur :

∗p1 = ∗p2

∗p1 = A

A = ∗p1

18 / 111

Page 33: Pointeurs : gestion dynamique de la memoire´

Affectations

• Soit p1 et p2 deux pointeurs du meme type T. Soit A une variablede type T. Alors, les operations suivantes sont permises :

• Affectation d’adresse a un pointeur :p1 = p2

p1 = &A

p1 = NULL

• Affectation de valeur :

∗p1 = ∗p2

∗p1 = A

A = ∗p1

18 / 111

Page 34: Pointeurs : gestion dynamique de la memoire´

Affectations

• Soit p1 et p2 deux pointeurs du meme type T. Soit A une variablede type T. Alors, les operations suivantes sont permises :

• Affectation d’adresse a un pointeur :p1 = p2

p1 = &A

p1 = NULL

• Affectation de valeur :

∗p1 = ∗p2

∗p1 = A

A = ∗p1

18 / 111

Page 35: Pointeurs : gestion dynamique de la memoire´

Affectations

• Soit p1 et p2 deux pointeurs du meme type T. Soit A une variablede type T. Alors, les operations suivantes sont permises :

• Affectation d’adresse a un pointeur :p1 = p2

p1 = &A

p1 = NULL

• Affectation de valeur :

∗p1 = ∗p2

∗p1 = A

A = ∗p1

18 / 111

Page 36: Pointeurs : gestion dynamique de la memoire´

Affectations

• Soit p1 et p2 deux pointeurs du meme type T. Soit A une variablede type T. Alors, les operations suivantes sont permises :

• Affectation d’adresse a un pointeur :p1 = p2

p1 = &A

p1 = NULL

• Affectation de valeur :

∗p1 = ∗p2

∗p1 = A

A = ∗p1

18 / 111

Page 37: Pointeurs : gestion dynamique de la memoire´

Affectations

• Soit p1 et p2 deux pointeurs du meme type T. Soit A une variablede type T. Alors, les operations suivantes sont permises :

• Affectation d’adresse a un pointeur :p1 = p2

p1 = &A

p1 = NULL

• Affectation de valeur :

∗p1 = ∗p2

∗p1 = A

A = ∗p1

18 / 111

Page 38: Pointeurs : gestion dynamique de la memoire´

Allocations

Soit p1 un pointeur vers des donnees type T.

• Allouer (p1);

• Liberer (p1);

19 / 111

Page 39: Pointeurs : gestion dynamique de la memoire´

Allocations

Soit p1 un pointeur vers des donnees type T.• Allouer (p1);

• Liberer (p1);

19 / 111

Page 40: Pointeurs : gestion dynamique de la memoire´

Allocations

Soit p1 un pointeur vers des donnees type T.• Allouer (p1);

• Liberer (p1);

19 / 111

Page 41: Pointeurs : gestion dynamique de la memoire´

Exemple

20 / 111

Page 42: Pointeurs : gestion dynamique de la memoire´

Trace

Regardons la trace de la sequence suivante.

1 int i;2 int *p;3 i=30;4 p=&i;5 i=412;6 p=(int *) malloc (sizeof (int));7 *p=20;8 free(p);

• On imprimera les emplacements des variables (tas, pile).• Pour la variable entiere i on imprimera son adresse memoire ”&i”

et son contenu ”i”.• Pour la variable de type pointeur p on imprimera son adresse

memoire ”&p”, son contenu ”p” et l’element sur lequel elle pointe”*p”.

21 / 111

Page 43: Pointeurs : gestion dynamique de la memoire´

Deroulement du programme

int i;Execution de l’instruction

@ memoire Contenu de la Pile

i = 0x7fff68be0ae4 0

Contenu du Tas

22 / 111

Page 44: Pointeurs : gestion dynamique de la memoire´

Deroulement du programme

int *p;Execution de l’instruction

@ memoire Contenu de la Pile

i = 0x7fff68be0ae4 0

p = 0x7fff68be0ad8 0x0

Contenu du Tas

23 / 111

Page 45: Pointeurs : gestion dynamique de la memoire´

Deroulement du programme

i=30;Execution de l’instruction

@ memoire Contenu de la Pile

i = 0x7fff68be0ae4 �S0 30

p = 0x7fff68be0ad8 0x0

Contenu du Tas

24 / 111

Page 46: Pointeurs : gestion dynamique de la memoire´

Deroulement du programme

p=&i;Execution de l’instruction

@ memoire Contenu de la Pile

i = 0x7fff68be0ae4 30

p = 0x7fff68be0ad8 ��HH0x0 0x7fff68be0ae4

Contenu du Tas

25 / 111

Page 47: Pointeurs : gestion dynamique de la memoire´

Deroulement du programme

i=412;Execution de l’instruction

@ memoire Contenu de la Pile

i = 0x7fff68be0ae4 ��ZZ30 412

p = 0x7fff68be0ad8 0x7fff68be0ae4

Contenu du Tas

26 / 111

Page 48: Pointeurs : gestion dynamique de la memoire´

Deroulement du programme

p=(int *) malloc (sizeof (int));Execution de l’instruction

@ memoire Contenu de la Pile

i = 0x7fff68be0ae4 412

p = 0x7fff68be0ad8 ((((((((hhhhhhhh0x7fff68be0ae4 0x109100900

Contenu du Tas

0x109100900 0

27 / 111

Page 49: Pointeurs : gestion dynamique de la memoire´

Deroulement du programme

*p=20;Execution de l’instruction

@ memoire Contenu de la Pile

i = 0x7fff68be0ae4 412

p = 0x7fff68be0ad8 0x109100900

Contenu du Tas

0x109100900 �S0 20

28 / 111

Page 50: Pointeurs : gestion dynamique de la memoire´

Deroulement du programme

free(p);Execution de l’instruction

@ memoire Contenu de la Pile

i = 0x7fff68be0ae4 412

p = 0x7fff68be0ad8 0x109100900

Contenu du Tas

0x109100900 ��ZZ20

29 / 111

Page 51: Pointeurs : gestion dynamique de la memoire´

Enregistrement et liste chaınee

30 / 111

Page 52: Pointeurs : gestion dynamique de la memoire´

Enregistrement ou structure

DefinitionsLa structure ou l’enregistrement permet de decrire un type complexeet de regrouper differentes types en un seul.

• On declare une structure avec le mot clef ”struct”. Par exemple :

struct etudiant{int age;char *niveau_etude;

};

31 / 111

Page 53: Pointeurs : gestion dynamique de la memoire´

Enregistrement ou structure

Remarques

• Il n’y a pas d’espace memoire reserve pour la definition d’un typeenregistrement.

• On declare une variable A de type enregistrement par :

struct etudiant A;

• L’acces a un champs de A se fait grace a l’operateur ”.”. Parexemple, A.age permet d’acceder au champs ”age” et secomporte comme une variable de type entier.

• Bien sur on peut declarer un pointeur vers une variable de typeenregistrement.

32 / 111

Page 54: Pointeurs : gestion dynamique de la memoire´

Enregistrement ou structure

Remarques• Il n’y a pas d’espace memoire reserve pour la definition d’un type

enregistrement.

• On declare une variable A de type enregistrement par :

struct etudiant A;

• L’acces a un champs de A se fait grace a l’operateur ”.”. Parexemple, A.age permet d’acceder au champs ”age” et secomporte comme une variable de type entier.

• Bien sur on peut declarer un pointeur vers une variable de typeenregistrement.

32 / 111

Page 55: Pointeurs : gestion dynamique de la memoire´

Enregistrement ou structure

Remarques• Il n’y a pas d’espace memoire reserve pour la definition d’un type

enregistrement.• On declare une variable A de type enregistrement par :

struct etudiant A;

• L’acces a un champs de A se fait grace a l’operateur ”.”. Parexemple, A.age permet d’acceder au champs ”age” et secomporte comme une variable de type entier.

• Bien sur on peut declarer un pointeur vers une variable de typeenregistrement.

32 / 111

Page 56: Pointeurs : gestion dynamique de la memoire´

Enregistrement ou structure

Remarques• Il n’y a pas d’espace memoire reserve pour la definition d’un type

enregistrement.• On declare une variable A de type enregistrement par :

struct etudiant A;

• L’acces a un champs de A se fait grace a l’operateur ”.”. Parexemple, A.age permet d’acceder au champs ”age” et secomporte comme une variable de type entier.

• Bien sur on peut declarer un pointeur vers une variable de typeenregistrement.

32 / 111

Page 57: Pointeurs : gestion dynamique de la memoire´

Structure recursive avec pointeur

Une structure recursive avec pointeur r est une structure composee dedeux parties :

• La premiere partie contient l’element a stocker qui peut-etre detype simple (un entier par exemple) ou de type complexe (unenregistrement ou un tableau).

• La deuxieme partie contient une variable de type pointeur, qui aufait ”pointe” vers un element de type r . Ce pointeur est essentielpour enchainer differents elements de type r .

element

Pointeur

un enregistrement de type r

33 / 111

Page 58: Pointeurs : gestion dynamique de la memoire´

Structure recursive avec pointeur

Une structure recursive avec pointeur r est une structure composee dedeux parties :

• La premiere partie contient l’element a stocker qui peut-etre detype simple (un entier par exemple) ou de type complexe (unenregistrement ou un tableau).

• La deuxieme partie contient une variable de type pointeur, qui aufait ”pointe” vers un element de type r . Ce pointeur est essentielpour enchainer differents elements de type r .

element

Pointeur

un enregistrement de type r

33 / 111

Page 59: Pointeurs : gestion dynamique de la memoire´

Structure recursive avec pointeur

Une structure recursive avec pointeur r est une structure composee dedeux parties :

• La premiere partie contient l’element a stocker qui peut-etre detype simple (un entier par exemple) ou de type complexe (unenregistrement ou un tableau).

• La deuxieme partie contient une variable de type pointeur, qui aufait ”pointe” vers un element de type r . Ce pointeur est essentielpour enchainer differents elements de type r .

element

Pointeur

un enregistrement de type r

33 / 111

Page 60: Pointeurs : gestion dynamique de la memoire´

Structure recursive avec pointeur

Une structure recursive avec pointeur r est une structure composee dedeux parties :

• La premiere partie contient l’element a stocker qui peut-etre detype simple (un entier par exemple) ou de type complexe (unenregistrement ou un tableau).

• La deuxieme partie contient une variable de type pointeur, qui aufait ”pointe” vers un element de type r . Ce pointeur est essentielpour enchainer differents elements de type r .

element

Pointeur

un enregistrement de type r

33 / 111

Page 61: Pointeurs : gestion dynamique de la memoire´

Pomme, peche, poire, abricot

Jeu avec une liste chaıneeEcrire une fonction qui code le jeu avec une representation par la listechaınee circulaire.Il s’agit d’ecrire une fonction qui prend en parametre le nombre dejoueurs, les stocke dans une liste chaınee.

34 / 111

Page 62: Pointeurs : gestion dynamique de la memoire´

Jeu avec une liste chaınee : partie declaration

12 struct noeud_joueur3 {4 int numero_joueur;5 struct noeud_joueur *suivant;6 };78 typedef struct noeud_joueur joueur;

35 / 111

Page 63: Pointeurs : gestion dynamique de la memoire´

Jeu avec une liste chaınee : creation de la liste

1 joueur *creation_de_liste(int N)2 {3 int i;4 joueur *p, *debut;5 for (i=0; i<N; i++)6 {7 if (i == 0)8 {9 debut = (joueur *)malloc(sizeof(joueur));

10 p = debut;11 }12 else13 {14 p->suivant = (joueur *) malloc(sizeof(joueur));15 p = p->suivant;16 }17 p->numero_joueur=i;18 }19 p->suivant = debut;20 return (debut);21 }

36 / 111

Page 64: Pointeurs : gestion dynamique de la memoire´

Trace de la fonction creation

• Pour la trace on prendra :

Nombre de joueur = 3.M=2

• On imprimera les emplacements des variables (tas, pile).

• Pour la variable entiere i on imprimera son adresse memoire ”&i”et son contenu ”i”.

• Pour les variables de type pointeur p et debut on imprimera leuradresse memoire, leur contenu et les elements sur lesquels ellespointent.

37 / 111

Page 65: Pointeurs : gestion dynamique de la memoire´

Instruction : int i=0;

@ memoire Contenu de la Pile

i = 0x7fff6edd3a84 0

Contenu du Tas

38 / 111

Page 66: Pointeurs : gestion dynamique de la memoire´

Instruction : joueur *p;

@ memoire Contenu de la Pile

i = 0x7fff6edd3a84 0

p = 0x7fff6edd3a78 0x1

Contenu du Tas

39 / 111

Page 67: Pointeurs : gestion dynamique de la memoire´

Instruction : joueur *debut;

@ memoire Contenu de la Pile

i = 0x7fff6edd3a84 0

p = 0x7fff6edd3a78 0x1

debut = 0x7fff6edd3a70 0x0

Contenu du Tas

40 / 111

Page 68: Pointeurs : gestion dynamique de la memoire´

Instruction : for (i=0; i<N; i++)

@ memoire Contenu de la Pile

i = 0x7fff6edd3a84 0

p = 0x7fff6edd3a78 0x1

debut = 0x7fff6edd3a70 0x0

Contenu du Tas

41 / 111

Page 69: Pointeurs : gestion dynamique de la memoire´

Instruction : debut = (joueur *)malloc(sizeof(joueur));

@ memoire Contenu de la Pile

i = 0x7fff6edd3a84 0

p = 0x7fff6edd3a78 0x1

debut = 0x7fff6edd3a70 ��HH0x0 0x10f300900

Contenu du Tas

0x10f300900

00x0

42 / 111

Page 70: Pointeurs : gestion dynamique de la memoire´

Instruction : p = debut;

@ memoire Contenu de la Pile

i = 0x7fff6edd3a84 0

p = 0x7fff6edd3a78 ��HH0x1 0x10f300900

debut = 0x7fff6edd3a70 0x10f300900

Contenu du Tas

0x10f300900

00x0

43 / 111

Page 71: Pointeurs : gestion dynamique de la memoire´

Instruction : p− >numero joueur=i;

@ memoire Contenu de la Pile

i = 0x7fff6edd3a84 0

p = 0x7fff6edd3a78 0x10f300900

debut = 0x7fff6edd3a70 0x10f300900

Contenu du Tas

0x10f300900

00x0

44 / 111

Page 72: Pointeurs : gestion dynamique de la memoire´

Instruction : for (i=0; i<N; i++)

@ memoire Contenu de la Pile

i = 0x7fff6edd3a84 �A0 1

p = 0x7fff6edd3a78 0x10f300900

debut = 0x7fff6edd3a70 0x10f300900

Contenu du Tas

0x10f300900

00x0

45 / 111

Page 73: Pointeurs : gestion dynamique de la memoire´

Instruction : p− >suivant = (joueur *) malloc(sizeof(joueur));

@ memoire Contenu de la Pile

i = 0x7fff6edd3a84 1

p = 0x7fff6edd3a78 0x10f300900

debut = 0x7fff6edd3a70 0x10f300900

Contenu du Tas

0x10f300910

00x0

0x10f300900

0

��HH0x0 0x10f300910

46 / 111

Page 74: Pointeurs : gestion dynamique de la memoire´

Instruction : p = p− >suivant;

@ memoire Contenu de la Pile

i = 0x7fff6edd3a84 1

p = 0x7fff6edd3a78 ((((((hhhhhh0x10f300900 0x10f300910

debut = 0x7fff6edd3a70 0x10f300900

Contenu du Tas

0x10f300910

00x0

0x10f300900

00x10f300910

47 / 111

Page 75: Pointeurs : gestion dynamique de la memoire´

Instruction : p− >numero joueur=i;

@ memoire Contenu de la Pile

i = 0x7fff6edd3a84 1

p = 0x7fff6edd3a78 0x10f300910

debut = 0x7fff6edd3a70 0x10f300900

Contenu du Tas

0x10f300910

�A0 10x0

0x10f300900

00x10f300910

48 / 111

Page 76: Pointeurs : gestion dynamique de la memoire´

Instruction : for (i=0; i<N; i++)

@ memoire Contenu de la Pile

i = 0x7fff6edd3a84 �A1 2

p = 0x7fff6edd3a78 0x10f300910

debut = 0x7fff6edd3a70 0x10f300900

Contenu du Tas

0x10f300910

10x0

0x10f300900

00x10f300910

49 / 111

Page 77: Pointeurs : gestion dynamique de la memoire´

Instruction : p− >suivant = (joueur *) malloc(sizeof(joueur));

@ memoire Contenu de la Pile

i = 0x7fff6edd3a84 2

p = 0x7fff6edd3a78 0x10f300910

debut = 0x7fff6edd3a70 0x10f300900

Contenu du Tas

0x10f300920

00x0

0x10f300910

1

��HH0x0 0x10f300920

0x10f300900

00x10f300910

50 / 111

Page 78: Pointeurs : gestion dynamique de la memoire´

Instruction : p = p− >suivant;

@ memoire Contenu de la Pile

i = 0x7fff6edd3a84 2

p = 0x7fff6edd3a78 ((((((hhhhhh0x10f300910 0x10f300920

debut = 0x7fff6edd3a70 0x10f300900

Contenu du Tas

0x10f300920

00x0

0x10f300910

10x10f300920

0x10f300900

00x10f300910

51 / 111

Page 79: Pointeurs : gestion dynamique de la memoire´

Instruction : p− >numero joueur=i;

@ memoire Contenu de la Pile

i = 0x7fff6edd3a84 2

p = 0x7fff6edd3a78 0x10f300920

debut = 0x7fff6edd3a70 0x10f300900

Contenu du Tas

0x10f300920

�A0 20x0

0x10f300910

10x10f300920

0x10f300900

00x10f300910

52 / 111

Page 80: Pointeurs : gestion dynamique de la memoire´

Instruction : p− >suivant = debut;

@ memoire Contenu de la Pile

i = 0x7fff6edd3a84 3

p = 0x7fff6edd3a78 0x10f300920

debut = 0x7fff6edd3a70 0x10f300900

Contenu du Tas

0x10f300920

2

��HH0x0 0x10f300900

0x10f300910

10x10f300920

0x10f300900

00x10f300910

53 / 111

Page 81: Pointeurs : gestion dynamique de la memoire´

Jeu avec une liste chaınee

Ecrire une fonction qui :

• prend en parametre une liste chaınee circulaire qui contient lesidentifiants des joueurs,

• supprime, au fur et a mesure, de la liste les joueurs elimines et

• retourne l’identifiant du gagnant.

54 / 111

Page 82: Pointeurs : gestion dynamique de la memoire´

Jeu avec une liste chaınee : partie jeu

12 int jeu(int M, joueur *debut)3 {4 int i;5 joueur *p=debut, *precedent;6 while (p->suivant !=p)7 {8 for (i=0; i<M; i++)9 {

10 precedent=p;11 p=p->suivant;12 }13 precedent->suivant=p->suivant;14 free (p);15 p=precedent->suivant;1617 }18 return p->numero_joueur;19 }

55 / 111

Page 83: Pointeurs : gestion dynamique de la memoire´

Deroulement detaillede la fonction jeu

56 / 111

Page 84: Pointeurs : gestion dynamique de la memoire´

Trace tres detaillee de la fonction jeu

• Pour la trace on utilisera une representation graphique a base demaillons. Nous choisirons :

Nombre de joueur = 5.M=3

• Pour chaque instruction :

On affichera les valeurs des variables entieres ”i” et M.On suivra graphiquement l’evolution des pointeurs p et precedent .

57 / 111

Page 85: Pointeurs : gestion dynamique de la memoire´

Deroulement de l’algorithme

Partie Declaration :int i=0;joueur *p=debut;joueur *precedent=NULL;

Execution de l’instructioni M

0 3

0 1 2 3 4

p

58 / 111

Page 86: Pointeurs : gestion dynamique de la memoire´

Deroulement de l’algorithme

1 while (p->suivant !=p) {

2 for (i=0; i<M; i++) {3 precedent=p;4 p=p->suivant; }5 precedent->suivant=p->suivant;6 free (p);7 p=precedent->suivant; }8 return p->numero_joueur; }

i M

0 3

0 1 2 3 4

p

59 / 111

Page 87: Pointeurs : gestion dynamique de la memoire´

Deroulement de l’algorithme

1 while (p->suivant !=p) {

2 for (i=0; i<M; i++) {

3 precedent=p;4 p=p->suivant; }5 precedent->suivant=p->suivant;6 free (p);7 p=precedent->suivant; }8 return p->numero_joueur; }

i M

0 3

0 1 2 3 4

p

60 / 111

Page 88: Pointeurs : gestion dynamique de la memoire´

Deroulement de l’algorithme

1 while (p->suivant !=p) {2 for (i=0; i<M; i++) {

3 precedent=p;

4 p=p->suivant; }5 precedent->suivant=p->suivant;6 free (p);7 p=precedent->suivant; }8 return p->numero_joueur; }

i M

0 3

0 1 2 3 4

p, precedent

61 / 111

Page 89: Pointeurs : gestion dynamique de la memoire´

Deroulement de l’algorithme

1 while (p->suivant !=p) {2 for (i=0; i<M; i++) {3 precedent=p;

4 p=p->suivant; }

5 precedent->suivant=p->suivant;6 free (p);7 p=precedent->suivant; }8 return p->numero_joueur; }

i M

0 3

0 1 2 3 4

pprec

eden

t

62 / 111

Page 90: Pointeurs : gestion dynamique de la memoire´

Deroulement de l’algorithme

1 while (p->suivant !=p) {

2 for (i=0; i<M; i++) {

3 precedent=p;4 p=p->suivant; }5 precedent->suivant=p->suivant;6 free (p);7 p=precedent->suivant; }8 return p->numero_joueur; }

i M

1 3

0 1 2 3 4

pprec

eden

t

63 / 111

Page 91: Pointeurs : gestion dynamique de la memoire´

Deroulement de l’algorithme

1 while (p->suivant !=p) {2 for (i=0; i<M; i++) {

3 precedent=p;

4 p=p->suivant; }5 precedent->suivant=p->suivant;6 free (p);7 p=precedent->suivant; }8 return p->numero_joueur; }

i M

1 3

0 1 2 3 4

p, precedent

64 / 111

Page 92: Pointeurs : gestion dynamique de la memoire´

Deroulement de l’algorithme

1 while (p->suivant !=p) {2 for (i=0; i<M; i++) {3 precedent=p;

4 p=p->suivant; }

5 precedent->suivant=p->suivant;6 free (p);7 p=precedent->suivant; }8 return p->numero_joueur; }

i M

1 3

0 1 2 3 4

pprec

eden

t

65 / 111

Page 93: Pointeurs : gestion dynamique de la memoire´

Deroulement de l’algorithme

1 while (p->suivant !=p) {

2 for (i=0; i<M; i++) {

3 precedent=p;4 p=p->suivant; }5 precedent->suivant=p->suivant;6 free (p);7 p=precedent->suivant; }8 return p->numero_joueur; }

i M

2 3

0 1 2 3 4

pprec

eden

t

66 / 111

Page 94: Pointeurs : gestion dynamique de la memoire´

Deroulement de l’algorithme

1 while (p->suivant !=p) {2 for (i=0; i<M; i++) {

3 precedent=p;

4 p=p->suivant; }5 precedent->suivant=p->suivant;6 free (p);7 p=precedent->suivant; }8 return p->numero_joueur; }

i M

2 3

0 1 2 3 4

p, precedent

67 / 111

Page 95: Pointeurs : gestion dynamique de la memoire´

Deroulement de l’algorithme

1 while (p->suivant !=p) {2 for (i=0; i<M; i++) {3 precedent=p;

4 p=p->suivant; }

5 precedent->suivant=p->suivant;6 free (p);7 p=precedent->suivant; }8 return p->numero_joueur; }

i M

2 3

0 1 2 3 4

pprec

eden

t

68 / 111

Page 96: Pointeurs : gestion dynamique de la memoire´

Deroulement de l’algorithme

1 while (p->suivant !=p) {2 for (i=0; i<M; i++) {3 precedent=p;4 p=p->suivant; }

5 precedent->suivant=p->suivant;

6 free (p);7 p=precedent->suivant; }8 return p->numero_joueur; }

i M

3 3

0 1 2 3 4

pprec

eden

t

69 / 111

Page 97: Pointeurs : gestion dynamique de la memoire´

Deroulement de l’algorithme

1 while (p->suivant !=p) {2 for (i=0; i<M; i++) {3 precedent=p;4 p=p->suivant; }5 precedent->suivant=p->suivant;

6 free (p);

7 p=precedent->suivant; }8 return p->numero_joueur; }

i M

3 3

0 1 2 3 4

pprec

eden

t

70 / 111

Page 98: Pointeurs : gestion dynamique de la memoire´

Deroulement de l’algorithme

1 while (p->suivant !=p) {2 for (i=0; i<M; i++) {3 precedent=p;4 p=p->suivant; }5 precedent->suivant=p->suivant;6 free (p);

7 p=precedent->suivant; }

8 return p->numero_joueur; }

i M

3 3

0 1 2 4

pprec

eden

t

71 / 111

Page 99: Pointeurs : gestion dynamique de la memoire´

Deroulement de l’algorithme

1 while (p->suivant !=p) {

2 for (i=0; i<M; i++) {3 precedent=p;4 p=p->suivant; }5 precedent->suivant=p->suivant;6 free (p);7 p=precedent->suivant; }8 return p->numero_joueur; }

i M

3 3

0 1 2 4

pprec

eden

t

72 / 111

Page 100: Pointeurs : gestion dynamique de la memoire´

Deroulement de l’algorithme

1 while (p->suivant !=p) {

2 for (i=0; i<M; i++) {

3 precedent=p;4 p=p->suivant; }5 precedent->suivant=p->suivant;6 free (p);7 p=precedent->suivant; }8 return p->numero_joueur; }

i M

0 3

0 1 2 4

pprec

eden

t

73 / 111

Page 101: Pointeurs : gestion dynamique de la memoire´

Deroulement de l’algorithme

1 while (p->suivant !=p) {2 for (i=0; i<M; i++) {

3 precedent=p;

4 p=p->suivant; }5 precedent->suivant=p->suivant;6 free (p);7 p=precedent->suivant; }8 return p->numero_joueur; }

i M

0 3

0 1 2 4

p, precedent

74 / 111

Page 102: Pointeurs : gestion dynamique de la memoire´

Deroulement de l’algorithme

1 while (p->suivant !=p) {2 for (i=0; i<M; i++) {3 precedent=p;

4 p=p->suivant; }

5 precedent->suivant=p->suivant;6 free (p);7 p=precedent->suivant; }8 return p->numero_joueur; }

i M

0 3

0 1 2 4

p prec

eden

t

75 / 111

Page 103: Pointeurs : gestion dynamique de la memoire´

Deroulement de l’algorithme

1 while (p->suivant !=p) {

2 for (i=0; i<M; i++) {

3 precedent=p;4 p=p->suivant; }5 precedent->suivant=p->suivant;6 free (p);7 p=precedent->suivant; }8 return p->numero_joueur; }

i M

1 3

0 1 2 4

p prec

eden

t

76 / 111

Page 104: Pointeurs : gestion dynamique de la memoire´

Deroulement de l’algorithme

1 while (p->suivant !=p) {2 for (i=0; i<M; i++) {

3 precedent=p;

4 p=p->suivant; }5 precedent->suivant=p->suivant;6 free (p);7 p=precedent->suivant; }8 return p->numero_joueur; }

i M

1 3

0 1 2 4

p, precedent

77 / 111

Page 105: Pointeurs : gestion dynamique de la memoire´

Deroulement de l’algorithme

1 while (p->suivant !=p) {2 for (i=0; i<M; i++) {3 precedent=p;

4 p=p->suivant; }

5 precedent->suivant=p->suivant;6 free (p);7 p=precedent->suivant; }8 return p->numero_joueur; }

i M

1 3

0 1 2 4

pprec

eden

t

78 / 111

Page 106: Pointeurs : gestion dynamique de la memoire´

Deroulement de l’algorithme

1 while (p->suivant !=p) {

2 for (i=0; i<M; i++) {

3 precedent=p;4 p=p->suivant; }5 precedent->suivant=p->suivant;6 free (p);7 p=precedent->suivant; }8 return p->numero_joueur; }

i M

2 3

0 1 2 4

pprec

eden

t

79 / 111

Page 107: Pointeurs : gestion dynamique de la memoire´

Deroulement de l’algorithme

1 while (p->suivant !=p) {2 for (i=0; i<M; i++) {

3 precedent=p;

4 p=p->suivant; }5 precedent->suivant=p->suivant;6 free (p);7 p=precedent->suivant; }8 return p->numero_joueur; }

i M

2 3

0 1 2 4

p, precedent

80 / 111

Page 108: Pointeurs : gestion dynamique de la memoire´

Deroulement de l’algorithme

1 while (p->suivant !=p) {2 for (i=0; i<M; i++) {3 precedent=p;

4 p=p->suivant; }

5 precedent->suivant=p->suivant;6 free (p);7 p=precedent->suivant; }8 return p->numero_joueur; }

i M

2 3

0 1 2 4

pprec

eden

t

81 / 111

Page 109: Pointeurs : gestion dynamique de la memoire´

Deroulement de l’algorithme

1 while (p->suivant !=p) {2 for (i=0; i<M; i++) {3 precedent=p;4 p=p->suivant; }

5 precedent->suivant=p->suivant;

6 free (p);7 p=precedent->suivant; }8 return p->numero_joueur; }

i M

3 3

0 1 2 4

pprec

eden

t

82 / 111

Page 110: Pointeurs : gestion dynamique de la memoire´

Deroulement de l’algorithme

1 while (p->suivant !=p) {2 for (i=0; i<M; i++) {3 precedent=p;4 p=p->suivant; }5 precedent->suivant=p->suivant;

6 free (p);

7 p=precedent->suivant; }8 return p->numero_joueur; }

i M

3 3

0 1 2 4

pprec

eden

t

83 / 111

Page 111: Pointeurs : gestion dynamique de la memoire´

Deroulement de l’algorithme

1 while (p->suivant !=p) {2 for (i=0; i<M; i++) {3 precedent=p;4 p=p->suivant; }5 precedent->suivant=p->suivant;6 free (p);

7 p=precedent->suivant; }

8 return p->numero_joueur; }

i M

3 3

0 1 4

pprec

eden

t

84 / 111

Page 112: Pointeurs : gestion dynamique de la memoire´

Deroulement de l’algorithme

1 while (p->suivant !=p) {

2 for (i=0; i<M; i++) {3 precedent=p;4 p=p->suivant; }5 precedent->suivant=p->suivant;6 free (p);7 p=precedent->suivant; }8 return p->numero_joueur; }

i M

3 3

0 1 4

pprec

eden

t

85 / 111

Page 113: Pointeurs : gestion dynamique de la memoire´

Deroulement de l’algorithme

1 while (p->suivant !=p) {

2 for (i=0; i<M; i++) {

3 precedent=p;4 p=p->suivant; }5 precedent->suivant=p->suivant;6 free (p);7 p=precedent->suivant; }8 return p->numero_joueur; }

i M

0 3

0 1 4

pprec

eden

t

86 / 111

Page 114: Pointeurs : gestion dynamique de la memoire´

Deroulement de l’algorithme

1 while (p->suivant !=p) {2 for (i=0; i<M; i++) {

3 precedent=p;

4 p=p->suivant; }5 precedent->suivant=p->suivant;6 free (p);7 p=precedent->suivant; }8 return p->numero_joueur; }

i M

0 3

0 1 4

p, precedent

87 / 111

Page 115: Pointeurs : gestion dynamique de la memoire´

Deroulement de l’algorithme

1 while (p->suivant !=p) {2 for (i=0; i<M; i++) {3 precedent=p;

4 p=p->suivant; }

5 precedent->suivant=p->suivant;6 free (p);7 p=precedent->suivant; }8 return p->numero_joueur; }

i M

0 3

0 1 4

p prec

eden

t

88 / 111

Page 116: Pointeurs : gestion dynamique de la memoire´

Deroulement de l’algorithme

1 while (p->suivant !=p) {

2 for (i=0; i<M; i++) {

3 precedent=p;4 p=p->suivant; }5 precedent->suivant=p->suivant;6 free (p);7 p=precedent->suivant; }8 return p->numero_joueur; }

i M

1 3

0 1 4

p prec

eden

t

89 / 111

Page 117: Pointeurs : gestion dynamique de la memoire´

Deroulement de l’algorithme

1 while (p->suivant !=p) {2 for (i=0; i<M; i++) {

3 precedent=p;

4 p=p->suivant; }5 precedent->suivant=p->suivant;6 free (p);7 p=precedent->suivant; }8 return p->numero_joueur; }

i M

1 3

0 1 4

p, precedent

90 / 111

Page 118: Pointeurs : gestion dynamique de la memoire´

Deroulement de l’algorithme

1 while (p->suivant !=p) {2 for (i=0; i<M; i++) {3 precedent=p;

4 p=p->suivant; }

5 precedent->suivant=p->suivant;6 free (p);7 p=precedent->suivant; }8 return p->numero_joueur; }

i M

1 3

0 1 4

pprec

eden

t

91 / 111

Page 119: Pointeurs : gestion dynamique de la memoire´

Deroulement de l’algorithme

1 while (p->suivant !=p) {

2 for (i=0; i<M; i++) {

3 precedent=p;4 p=p->suivant; }5 precedent->suivant=p->suivant;6 free (p);7 p=precedent->suivant; }8 return p->numero_joueur; }

i M

2 3

0 1 4

pprec

eden

t

92 / 111

Page 120: Pointeurs : gestion dynamique de la memoire´

Deroulement de l’algorithme

1 while (p->suivant !=p) {2 for (i=0; i<M; i++) {

3 precedent=p;

4 p=p->suivant; }5 precedent->suivant=p->suivant;6 free (p);7 p=precedent->suivant; }8 return p->numero_joueur; }

i M

2 3

0 1 4

p, precedent

93 / 111

Page 121: Pointeurs : gestion dynamique de la memoire´

Deroulement de l’algorithme

1 while (p->suivant !=p) {2 for (i=0; i<M; i++) {3 precedent=p;

4 p=p->suivant; }

5 precedent->suivant=p->suivant;6 free (p);7 p=precedent->suivant; }8 return p->numero_joueur; }

i M

2 3

0 1 4

pprec

eden

t

94 / 111

Page 122: Pointeurs : gestion dynamique de la memoire´

Deroulement de l’algorithme

1 while (p->suivant !=p) {2 for (i=0; i<M; i++) {3 precedent=p;4 p=p->suivant; }

5 precedent->suivant=p->suivant;

6 free (p);7 p=precedent->suivant; }8 return p->numero_joueur; }

i M

3 3

0 1 4

pprec

eden

t

95 / 111

Page 123: Pointeurs : gestion dynamique de la memoire´

Deroulement de l’algorithme

1 while (p->suivant !=p) {2 for (i=0; i<M; i++) {3 precedent=p;4 p=p->suivant; }5 precedent->suivant=p->suivant;

6 free (p);

7 p=precedent->suivant; }8 return p->numero_joueur; }

i M

3 3

0 1 4

pprec

eden

t

96 / 111

Page 124: Pointeurs : gestion dynamique de la memoire´

Deroulement de l’algorithme

1 while (p->suivant !=p) {2 for (i=0; i<M; i++) {3 precedent=p;4 p=p->suivant; }5 precedent->suivant=p->suivant;6 free (p);

7 p=precedent->suivant; }

8 return p->numero_joueur; }

i M

3 3

0 1

p prec

eden

t

97 / 111

Page 125: Pointeurs : gestion dynamique de la memoire´

Deroulement de l’algorithme

1 while (p->suivant !=p) {

2 for (i=0; i<M; i++) {3 precedent=p;4 p=p->suivant; }5 precedent->suivant=p->suivant;6 free (p);7 p=precedent->suivant; }8 return p->numero_joueur; }

i M

3 3

0 1

p prec

eden

t

98 / 111

Page 126: Pointeurs : gestion dynamique de la memoire´

Deroulement de l’algorithme

1 while (p->suivant !=p) {

2 for (i=0; i<M; i++) {

3 precedent=p;4 p=p->suivant; }5 precedent->suivant=p->suivant;6 free (p);7 p=precedent->suivant; }8 return p->numero_joueur; }

i M

0 3

0 1

p prec

eden

t

99 / 111

Page 127: Pointeurs : gestion dynamique de la memoire´

Deroulement de l’algorithme

1 while (p->suivant !=p) {2 for (i=0; i<M; i++) {

3 precedent=p;

4 p=p->suivant; }5 precedent->suivant=p->suivant;6 free (p);7 p=precedent->suivant; }8 return p->numero_joueur; }

i M

0 3

0 1

p, precedent

100 / 111

Page 128: Pointeurs : gestion dynamique de la memoire´

Deroulement de l’algorithme

1 while (p->suivant !=p) {2 for (i=0; i<M; i++) {3 precedent=p;

4 p=p->suivant; }

5 precedent->suivant=p->suivant;6 free (p);7 p=precedent->suivant; }8 return p->numero_joueur; }

i M

0 3

0 1

pprec

eden

t

101 / 111

Page 129: Pointeurs : gestion dynamique de la memoire´

Deroulement de l’algorithme

1 while (p->suivant !=p) {

2 for (i=0; i<M; i++) {

3 precedent=p;4 p=p->suivant; }5 precedent->suivant=p->suivant;6 free (p);7 p=precedent->suivant; }8 return p->numero_joueur; }

i M

1 3

0 1

pprec

eden

t

102 / 111

Page 130: Pointeurs : gestion dynamique de la memoire´

Deroulement de l’algorithme

1 while (p->suivant !=p) {2 for (i=0; i<M; i++) {

3 precedent=p;

4 p=p->suivant; }5 precedent->suivant=p->suivant;6 free (p);7 p=precedent->suivant; }8 return p->numero_joueur; }

i M

1 3

0 1

p, precedent

103 / 111

Page 131: Pointeurs : gestion dynamique de la memoire´

Deroulement de l’algorithme

1 while (p->suivant !=p) {2 for (i=0; i<M; i++) {3 precedent=p;

4 p=p->suivant; }

5 precedent->suivant=p->suivant;6 free (p);7 p=precedent->suivant; }8 return p->numero_joueur; }

i M

1 3

0 1

p prec

eden

t

104 / 111

Page 132: Pointeurs : gestion dynamique de la memoire´

Deroulement de l’algorithme

1 while (p->suivant !=p) {

2 for (i=0; i<M; i++) {

3 precedent=p;4 p=p->suivant; }5 precedent->suivant=p->suivant;6 free (p);7 p=precedent->suivant; }8 return p->numero_joueur; }

i M

2 3

0 1

p prec

eden

t

105 / 111

Page 133: Pointeurs : gestion dynamique de la memoire´

Deroulement de l’algorithme

1 while (p->suivant !=p) {2 for (i=0; i<M; i++) {

3 precedent=p;

4 p=p->suivant; }5 precedent->suivant=p->suivant;6 free (p);7 p=precedent->suivant; }8 return p->numero_joueur; }

i M

2 3

0 1

p, precedent

106 / 111

Page 134: Pointeurs : gestion dynamique de la memoire´

Deroulement de l’algorithme

1 while (p->suivant !=p) {2 for (i=0; i<M; i++) {3 precedent=p;

4 p=p->suivant; }

5 precedent->suivant=p->suivant;6 free (p);7 p=precedent->suivant; }8 return p->numero_joueur; }

i M

2 3

0 1

pprec

eden

t

107 / 111

Page 135: Pointeurs : gestion dynamique de la memoire´

Deroulement de l’algorithme

1 while (p->suivant !=p) {2 for (i=0; i<M; i++) {3 precedent=p;4 p=p->suivant; }

5 precedent->suivant=p->suivant;

6 free (p);7 p=precedent->suivant; }8 return p->numero_joueur; }

i M

3 3

0 1

pprec

eden

t

108 / 111

Page 136: Pointeurs : gestion dynamique de la memoire´

Deroulement de l’algorithme

1 while (p->suivant !=p) {2 for (i=0; i<M; i++) {3 precedent=p;4 p=p->suivant; }5 precedent->suivant=p->suivant;

6 free (p);

7 p=precedent->suivant; }8 return p->numero_joueur; }

i M

3 3

0 1

pprec

eden

t

109 / 111

Page 137: Pointeurs : gestion dynamique de la memoire´

Deroulement de l’algorithme

1 while (p->suivant !=p) {2 for (i=0; i<M; i++) {3 precedent=p;4 p=p->suivant; }5 precedent->suivant=p->suivant;6 free (p);

7 p=precedent->suivant; }

8 return p->numero_joueur; }

i M

3 3

0

p, precedent

110 / 111

Page 138: Pointeurs : gestion dynamique de la memoire´

Deroulement de l’algorithme

1 while (p->suivant !=p) {2 for (i=0; i<M; i++) {3 precedent=p;4 p=p->suivant; }5 precedent->suivant=p->suivant;6 free (p);7 p=precedent->suivant; }

8 return p− >numero joueur; }

i M

5 5

Le gagnant est :

0

111 / 111