Cours d'algorithmique 2 - Intranet 1 8 novembre 2006 Cours dAlgorithmique Listes, piles et...

Preview:

Citation preview

Cours d'algorithmique 2 - IntranetCours d'algorithmique 2 - Intranet 118 novembre 20068 novembre 2006

Cours d’AlgorithmiqueCours d’Algorithmique

Listes, piles et files.Listes, piles et files.

Arbres.Arbres.

Types de données abstraits.Types de données abstraits.

Implantations.Implantations.

8 novembre 20068 novembre 2006 Cours d'algorithmique 2 - IntranetCours d'algorithmique 2 - Intranet 22

• Trier et chercherTrier et chercher• Listes et arbresListes et arbres• Le back-trackLe back-track• Arbres équilibrésArbres équilibrés• Récursivité et induction sur la structureRécursivité et induction sur la structure• Divide and conquerDivide and conquer• MinimaxMinimax• DérécursionDérécursion• Divers problèmes particuliersDivers problèmes particuliers• Logique de HoareLogique de Hoare• Programmation dynamiqueProgrammation dynamique• Complexité et calculabilitéComplexité et calculabilité

Les grandes lignes du coursLes grandes lignes du cours

8 novembre 20068 novembre 2006 Cours d'algorithmique 2 - IntranetCours d'algorithmique 2 - Intranet 33

Voici des listes !Voici des listes !

22 22 1144

00 22 44 66 88 1010

2244 22 1122 -1-166 1010

44

TableauTableau

8 novembre 20068 novembre 2006 Cours d'algorithmique 2 - IntranetCours d'algorithmique 2 - Intranet 44

22 22 1144

00 22 44 66 88 1010

2244 22 1122 -1-166 1010

44

TableauTableau

Voici des listes !Voici des listes !

8 novembre 20068 novembre 2006 Cours d'algorithmique 2 - IntranetCours d'algorithmique 2 - Intranet 55

Voici des listes !Voici des listes !

22 22 1144

00 22 44 66 88 1010

2244 22 1122 -1-166 1010

44

TableauTableau

8 novembre 20068 novembre 2006 Cours d'algorithmique 2 - IntranetCours d'algorithmique 2 - Intranet 66

Voici des listes !Voici des listes !

22 22 1144

00 22 44 66 88 1010

2244 22 1122 -1-166 1010

44

TableauTableau

8 novembre 20068 novembre 2006 Cours d'algorithmique 2 - IntranetCours d'algorithmique 2 - Intranet 77

Voici des listes !Voici des listes !

22 22 1144

00 22 44 66 88 1010

2244 22 1122 -1-166 1010

44

TableauTableau

8 novembre 20068 novembre 2006 Cours d'algorithmique 2 - IntranetCours d'algorithmique 2 - Intranet 88

Voici des listes !Voici des listes !

22 22 1144

00 22 44 66 88 1010

2244 22 1122 -1-166 1010

44

TableauTableau

FINFIN

8 novembre 20068 novembre 2006 Cours d'algorithmique 2 - IntranetCours d'algorithmique 2 - Intranet 99

Caractérisations d’une liste !Caractérisations d’une liste !

• Un élément plus un lien vers le suivant.Un élément plus un lien vers le suivant.

• Séquence ordonnée finie.Séquence ordonnée finie.– Suite ordonnée des mathématiques.Suite ordonnée des mathématiques.

• Un tableau peut être vu comme une liste, si on limite les Un tableau peut être vu comme une liste, si on limite les accès aléatoires.accès aléatoires.– On lit T[0], puis T[1], etc, par exemple.On lit T[0], puis T[1], etc, par exemple.

• Une liste est caractérisée parUne liste est caractérisée par– ses propriétés et fonctions d’accèsses propriétés et fonctions d’accès– et non sa réalisation.et non sa réalisation.

8 novembre 20068 novembre 2006 Cours d'algorithmique 2 - IntranetCours d'algorithmique 2 - Intranet 1010

Constructeurs et prédicats sur listesConstructeurs et prédicats sur listes----------------------------------------------------------------------------------------------------------------------------------

Soit Soit LTLT le type des listes d’éléments de type le type des listes d’éléments de type TT..

Le constructeur de la liste vide :Le constructeur de la liste vide :

cree_vide : void ->cree_vide : void -> LTLT

8 novembre 20068 novembre 2006 Cours d'algorithmique 2 - IntranetCours d'algorithmique 2 - Intranet 1111

Constructeurs et prédicats sur listesConstructeurs et prédicats sur listes----------------------------------------------------------------------------------------------------------------------------------

Soit Soit LTLT le type des listes d’éléments de type le type des listes d’éléments de type TT..

Le constructeur de la liste vide :Le constructeur de la liste vide :

cree_vide : void -> cree_vide : void -> LTLT

Le constructeur général :Le constructeur général :

ajout_liste : ajout_liste : T T x x LTLT -> -> LTLT

8 novembre 20068 novembre 2006 Cours d'algorithmique 2 - IntranetCours d'algorithmique 2 - Intranet 1212

Constructeurs et prédicats sur listesConstructeurs et prédicats sur listes----------------------------------------------------------------------------------------------------------------------------------

Soit Soit LTLT le type des listes d’éléments de type le type des listes d’éléments de type TT..

Le constructeur de la liste vide :Le constructeur de la liste vide :

cree_vide : void -> cree_vide : void -> LTLT

Le constructeur général :Le constructeur général :

ajout_liste : ajout_liste : T T x x LTLT -> -> LTLT

Le prédicat qui distingue les deux cas Le prédicat qui distingue les deux cas ::

est_vide : est_vide : LTLT -> BOOL -> BOOL

8 novembre 20068 novembre 2006 Cours d'algorithmique 2 - IntranetCours d'algorithmique 2 - Intranet 1313

Constructeurs et prédicats sur listesConstructeurs et prédicats sur listes----------------------------------------------------------------------------------------------------------------------------------

Les propriétés vérifiées par ces fonctions :Les propriétés vérifiées par ces fonctions :

est_videest_vide ( cree_vide () ) = ( cree_vide () ) = VraiVrai

est_vide ( ajout_liste ( e , l ) ) = est_vide ( ajout_liste ( e , l ) ) = FauxFaux

• La seule liste vide est celle créée par « cree_vide ».La seule liste vide est celle créée par « cree_vide ».

• Aucune liste obtenue par adjonction d’un élément « a » Aucune liste obtenue par adjonction d’un élément « a » à une liste « l » n’est vide.à une liste « l » n’est vide.

• Salutations de la part de Monsieur de la Palisse !Salutations de la part de Monsieur de la Palisse !

8 novembre 20068 novembre 2006 Cours d'algorithmique 2 - IntranetCours d'algorithmique 2 - Intranet 1414

Fonctions d’accès sur listesFonctions d’accès sur listes----------------------------------------------------------------------------------------------------------------------------------

La fonction d’accès à l’élément :La fonction d’accès à l’élément :

tete_liste : tete_liste : LTLT -> -> TT

La fonction d’accès à la suite de la La fonction d’accès à la suite de la liste :liste :

queue_liste : queue_liste : LTLT -> -> LTLT

8 novembre 20068 novembre 2006 Cours d'algorithmique 2 - IntranetCours d'algorithmique 2 - Intranet 1515

Fonctions d’accès sur listesFonctions d’accès sur listes----------------------------------------------------------------------------------------------------------------------------------

La fonction d’accès à l’élément :La fonction d’accès à l’élément :

tete_liste : tete_liste : LTLT -> -> TT

La fonction d’accès à la suite de la La fonction d’accès à la suite de la liste :liste :

queue_liste : queue_liste : LTLT -> -> LTLTLes propriétés vérifiées par ces fonctions :Les propriétés vérifiées par ces fonctions :

tete_listetete_liste ( ajout_liste ( a , l ) ) = ( ajout_liste ( a , l ) ) = a a

queue_listequeue_liste ( ajout_liste ( a , l ) ) ( ajout_liste ( a , l ) ) = l= l

8 novembre 20068 novembre 2006 Cours d'algorithmique 2 - IntranetCours d'algorithmique 2 - Intranet 1616

Fonctions d’accès sur listesFonctions d’accès sur listes----------------------------------------------------------------------------------------------------------------------------------

Les limitations d’application de ces fonctions,Les limitations d’application de ces fonctions,les appels suivants sont interdits :les appels suivants sont interdits :

tete_listetete_liste ( cree_vide () )( cree_vide () )

queue_listequeue_liste ( cree_vide () )( cree_vide () )

8 novembre 20068 novembre 2006 Cours d'algorithmique 2 - IntranetCours d'algorithmique 2 - Intranet 1717

Fonctions d’accès sur listesFonctions d’accès sur listes----------------------------------------------------------------------------------------------------------------------------------

Les limitations d’application de ces fonctions,Les limitations d’application de ces fonctions,les appels suivants sont interdits :les appels suivants sont interdits :

tete_listetete_liste ( cree_vide () )( cree_vide () )

queue_listequeue_liste ( cree_vide () )( cree_vide () )

Ce qui est vraiment caractéristique d’une liste Ce qui est vraiment caractéristique d’une liste ::

tete_listetete_liste ( ajout_liste ( a , l ) ) = ( ajout_liste ( a , l ) ) = a a

8 novembre 20068 novembre 2006 Cours d'algorithmique 2 - IntranetCours d'algorithmique 2 - Intranet 1818

Fonctions d’accès sur listesFonctions d’accès sur listes----------------------------------------------------------------------------------------------------------------------------------

Les limitations d’application de ces fonctions,Les limitations d’application de ces fonctions,les appels suivants sont interdits :les appels suivants sont interdits :

tete_listetete_liste ( cree_vide () )( cree_vide () )

queue_listequeue_liste ( cree_vide () )( cree_vide () )

On parle d’une structureOn parle d’une structure

Ce qui est vraiment caractéristique d’une liste Ce qui est vraiment caractéristique d’une liste ::

tete_listetete_liste ( ajout_liste ( a , l ) ) = ( ajout_liste ( a , l ) ) = a a

LLast ast IIn - n - FFirst irst OOut ut (LIFO)(LIFO)

8 novembre 20068 novembre 2006 Cours d'algorithmique 2 - IntranetCours d'algorithmique 2 - Intranet 1919

Types de données abstraitsTypes de données abstraits----------------------------------------------------------------------------------------------------------------------------------

• Nous nous sommes donné des noms de types :Nous nous sommes donné des noms de types :– un type de base un type de base T T,,– un type de liste un type de liste LT LT sur ce type de base.sur ce type de base.

8 novembre 20068 novembre 2006 Cours d'algorithmique 2 - IntranetCours d'algorithmique 2 - Intranet 2020

Types de données abstraitsTypes de données abstraits----------------------------------------------------------------------------------------------------------------------------------

• Nous nous sommes donné des noms de types :Nous nous sommes donné des noms de types :– un type de base un type de base T T,,– un type de liste un type de liste LT LT sur ce type de base.sur ce type de base.

• Nous nous sommes donné des fonctions et leurs propriétés :Nous nous sommes donné des fonctions et leurs propriétés :– cree_vide , ... ,cree_vide , ... ,– est_vide ( cree_vide () ) = Vrai , … .est_vide ( cree_vide () ) = Vrai , … .

8 novembre 20068 novembre 2006 Cours d'algorithmique 2 - IntranetCours d'algorithmique 2 - Intranet 2121

Types de données abstraitsTypes de données abstraits----------------------------------------------------------------------------------------------------------------------------------

• Nous nous sommes donné des noms de types :Nous nous sommes donné des noms de types :– un type de base un type de base T T,,– un type de liste un type de liste LT LT sur ce type de base.sur ce type de base.

• Nous nous sommes donné des fonctions et leurs propriétés :Nous nous sommes donné des fonctions et leurs propriétés :– cree_vide , ... ,cree_vide , ... ,– est_vide ( cree_vide () ) = Vrai , … .est_vide ( cree_vide () ) = Vrai , … .

• Nous n’avons pas besoin de devenir plus concrets.Nous n’avons pas besoin de devenir plus concrets.

8 novembre 20068 novembre 2006 Cours d'algorithmique 2 - IntranetCours d'algorithmique 2 - Intranet 2222

Types de données abstraitsTypes de données abstraits----------------------------------------------------------------------------------------------------------------------------------

• Nous nous sommes donné des noms de types :Nous nous sommes donné des noms de types :– un type de base un type de base T T,,– un type de liste un type de liste LT LT sur ce type de base.sur ce type de base.

• Nous nous sommes donné des fonctions et leurs propriétés :Nous nous sommes donné des fonctions et leurs propriétés :– cree_vide , ... ,cree_vide , ... ,– est_vide ( cree_vide () ) = Vrai , … .est_vide ( cree_vide () ) = Vrai , … .

• Nous n’avons pas besoin de devenir plus concrets.Nous n’avons pas besoin de devenir plus concrets.

C’est un C’est un type de données abstrait.type de données abstrait.

8 novembre 20068 novembre 2006 Cours d'algorithmique 2 - IntranetCours d'algorithmique 2 - Intranet 2323

Exemple d’implantationExemple d’implantation----------------------------------------------------------------------------------------------------------------------------------

22 11ajout_listeajout_liste ( ( 55 , , ) )

22 1155

ajout_listeajout_liste ( ( 55 , , cree_vide cree_vide ()() ) )

55

8 novembre 20068 novembre 2006 Cours d'algorithmique 2 - IntranetCours d'algorithmique 2 - Intranet 2424

Exemple d’implantationExemple d’implantation----------------------------------------------------------------------------------------------------------------------------------

22 11

tete_listetete_liste ( )( )

22 1155

5

queue_listequeue_liste ( ( ) )

22 1155

8 novembre 20068 novembre 2006 Cours d'algorithmique 2 - IntranetCours d'algorithmique 2 - Intranet 2525

L I S T E S L I S T E S E TE T

P I L E S ! ! !P I L E S ! ! !

Listes et pilesListes et piles----------------------------------------------------------------------------------------------------------------------------------

8 novembre 20068 novembre 2006 Cours d'algorithmique 2 - IntranetCours d'algorithmique 2 - Intranet 2626

Listes et pilesListes et piles----------------------------------------------------------------------------------------------------------------------------------

22 1155

8 novembre 20068 novembre 2006 Cours d'algorithmique 2 - IntranetCours d'algorithmique 2 - Intranet 2727

Listes et pilesListes et piles----------------------------------------------------------------------------------------------------------------------------------

22 1155

22

11

55

8 novembre 20068 novembre 2006 Cours d'algorithmique 2 - IntranetCours d'algorithmique 2 - Intranet 2828

Listes et pilesListes et piles----------------------------------------------------------------------------------------------------------------------------------

22 1155

22

11

55

Pile ( d’assiettes )Pile ( d’assiettes )stack en anglaisstack en anglais

8 novembre 20068 novembre 2006 Cours d'algorithmique 2 - IntranetCours d'algorithmique 2 - Intranet 2929

Listes et pilesListes et piles----------------------------------------------------------------------------------------------------------------------------------

22 1155

22

11

55

Pile ( d’assiettes )Pile ( d’assiettes )stack en anglaisstack en anglais

ajout_liste = push = ajout_liste = push = empilerempiler

tete_liste = top = sommettete_liste = top = sommet

queue_liste = pop = queue_liste = pop = dépilerdépiler

8 novembre 20068 novembre 2006 Cours d'algorithmique 2 - IntranetCours d'algorithmique 2 - Intranet 3030

Listes et pilesListes et piles----------------------------------------------------------------------------------------------------------------------------------

22 1155

22

11

55

Pile ( d’assiettes )Pile ( d’assiettes )stack en anglaisstack en anglais

ajout_liste = push = ajout_liste = push = empilerempiler

tete_liste = top = sommettete_liste = top = sommet

queue_liste = pop = queue_liste = pop = dépilerdépiler

LIFO !LIFO !

8 novembre 20068 novembre 2006 Cours d'algorithmique 2 - IntranetCours d'algorithmique 2 - Intranet 3131

Listes et piles : les différencesListes et piles : les différences----------------------------------------------------------------------------------------------------------------------------------

• Les piles sont restreintes aux opérations :Les piles sont restreintes aux opérations :– top , pop et push ( et la détection de la pile vide ),top , pop et push ( et la détection de la pile vide ),– celles-ci sont réalisées de façon efficace dans le celles-ci sont réalisées de façon efficace dans le

processeur,processeur,– par le biais d’un tableau !!!par le biais d’un tableau !!!

8 novembre 20068 novembre 2006 Cours d'algorithmique 2 - IntranetCours d'algorithmique 2 - Intranet 3232

Listes et piles : les différencesListes et piles : les différences----------------------------------------------------------------------------------------------------------------------------------

• Les piles sont restreintes aux opérations :Les piles sont restreintes aux opérations :– top , pop et push ( et la détection de la pile vide ),top , pop et push ( et la détection de la pile vide ),– celles-ci sont réalisées de façon efficace dans le processeur,celles-ci sont réalisées de façon efficace dans le processeur,– par le biais d’un tableau !!!par le biais d’un tableau !!!

• Les listes peuvent comporter entre autres :Les listes peuvent comporter entre autres :– en plus de ajout_liste , tete_liste et queue_liste (+ liste vide),en plus de ajout_liste , tete_liste et queue_liste (+ liste vide),– des fonctions comme inserer_liste , supprimer_liste, … ,des fonctions comme inserer_liste , supprimer_liste, … ,– être doublement chaînées ( cf. TD ) ou circulaires,être doublement chaînées ( cf. TD ) ou circulaires,– et ne sont plus des tableaux !et ne sont plus des tableaux !

8 novembre 20068 novembre 2006 Cours d'algorithmique 2 - IntranetCours d'algorithmique 2 - Intranet 3333

Listes et piles : les différencesListes et piles : les différences----------------------------------------------------------------------------------------------------------------------------------

• Les piles sont restreintes aux opérations :Les piles sont restreintes aux opérations :– top , pop et push ( et la détection de la pile vide ),top , pop et push ( et la détection de la pile vide ),– celles-ci sont réalisées de façon efficace dans le processeur,celles-ci sont réalisées de façon efficace dans le processeur,– par le biais d’un tableau !!!par le biais d’un tableau !!!

• Les listes peuvent comporter entre autres :Les listes peuvent comporter entre autres :– en plus de ajout_liste , tete_liste et queue_liste (+ liste vide),en plus de ajout_liste , tete_liste et queue_liste (+ liste vide),– des fonctions comme inserer_liste , supprimer_liste, … ,des fonctions comme inserer_liste , supprimer_liste, … ,– être doublement chaînées ( cf. TD ) ou circulaires,être doublement chaînées ( cf. TD ) ou circulaires,– et ne sont plus des tableaux !et ne sont plus des tableaux !

22 66 44

8 novembre 20068 novembre 2006 Cours d'algorithmique 2 - IntranetCours d'algorithmique 2 - Intranet 3434

Listes et piles : les différencesListes et piles : les différences----------------------------------------------------------------------------------------------------------------------------------

• Les piles sont restreintes aux opérations :Les piles sont restreintes aux opérations :– top , pop et push ( et la détection de la pile vide ),top , pop et push ( et la détection de la pile vide ),– celles-ci sont réalisées de façon efficace dans le processeur,celles-ci sont réalisées de façon efficace dans le processeur,– par le biais d’un tableau !!!par le biais d’un tableau !!!

• Les listes peuvent comporter entre autres :Les listes peuvent comporter entre autres :– en plus de ajout_liste , tete_liste et queue_liste (+ liste vide),en plus de ajout_liste , tete_liste et queue_liste (+ liste vide),– des fonctions comme inserer_liste , supprimer_liste, … ,des fonctions comme inserer_liste , supprimer_liste, … ,– être doublement chaînées ( cf. TD ) ou circulaires,être doublement chaînées ( cf. TD ) ou circulaires,– et ne sont plus des tableaux !et ne sont plus des tableaux !

22 66 44

8 novembre 20068 novembre 2006 Cours d'algorithmique 2 - IntranetCours d'algorithmique 2 - Intranet 3535

Listes en langage CListes en langage C----------------------------------------------------------------------------------------------------------------------------------

#include <stdio.h>#include <stdlib.h>#include <malloc.h>#include <assert.h>

typedef int type_base;

typedef struct moi_meme {type_base valeur; struct moi_meme *suivant; }t_maillon, *ptr_liste;

8 novembre 20068 novembre 2006 Cours d'algorithmique 2 - IntranetCours d'algorithmique 2 - Intranet 3636

Listes en langage CListes en langage C----------------------------------------------------------------------------------------------------------------------------------

#include <stdio.h>#include <stdlib.h>#include <malloc.h>#include <assert.h>

typedef int type_base;

typedef struct moi_meme {type_base valeur; struct moi_meme *suivant; }t_maillon, *ptr_liste;

Le nom du type de base.Le nom du type de base.

8 novembre 20068 novembre 2006 Cours d'algorithmique 2 - IntranetCours d'algorithmique 2 - Intranet 3737

Listes en langage CListes en langage C----------------------------------------------------------------------------------------------------------------------------------

#include <stdio.h>#include <stdlib.h>#include <malloc.h>#include <assert.h>

typedef int type_base;

typedef struct moi_meme {type_base valeur; struct moi_meme *suivant; }t_maillon, *ptr_liste;

Le nom du type de base.Le nom du type de base.

La structure elle-même.La structure elle-même.

8 novembre 20068 novembre 2006 Cours d'algorithmique 2 - IntranetCours d'algorithmique 2 - Intranet 3838

Listes en langage CListes en langage C----------------------------------------------------------------------------------------------------------------------------------

#include <stdio.h>#include <stdlib.h>#include <malloc.h>#include <assert.h>

typedef int type_base;

typedef struct moi_meme {type_base valeur; struct moi_meme *suivant; }t_maillon, *ptr_liste;

Le nom du type de base.Le nom du type de base.

La structure elle-même.La structure elle-même.

La structure s’appelle t_maillon.La structure s’appelle t_maillon.

8 novembre 20068 novembre 2006 Cours d'algorithmique 2 - IntranetCours d'algorithmique 2 - Intranet 3939

Listes en langage CListes en langage C----------------------------------------------------------------------------------------------------------------------------------

#include <stdio.h>#include <stdlib.h>#include <malloc.h>#include <assert.h>

typedef int type_base;

typedef struct moi_meme {type_base valeur; struct moi_meme *suivant; }t_maillon, *ptr_liste;

Le nom du type de baseLe nom du type de base

La structure elle-mêmeLa structure elle-même

La structure s’appelle t_maillon.La structure s’appelle t_maillon.

Le type du pointeur sur une tellestructure s’appelle ptr_liste.

8 novembre 20068 novembre 2006 Cours d'algorithmique 2 - IntranetCours d'algorithmique 2 - Intranet 4040

Listes en langage CListes en langage C----------------------------------------------------------------------------------------------------------------------------------

S o y o n s S o y o n s p l u sp l u s

c o n c r e t s !!!c o n c r e t s !!!

8 novembre 20068 novembre 2006 Cours d'algorithmique 2 - IntranetCours d'algorithmique 2 - Intranet 4141

Listes en langage CListes en langage C----------------------------------------------------------------------------------------------------------------------------------

ptr_liste cree_vide (void)

{ return( (ptr_liste)NULL ); }

int est_vide (ptr_liste liste)

{ return( liste == (ptr_liste)NULL ); }

type_base tete_liste (ptr_liste liste)

{assert( liste != (ptr_liste)NULL );

return( liste->valeur ); }

ptr_liste queue_liste (ptr_liste liste)

{assert( liste != (ptr_liste)NULL );

return( liste->suivant ); }

8 novembre 20068 novembre 2006 Cours d'algorithmique 2 - IntranetCours d'algorithmique 2 - Intranet 4242

Listes en langage CListes en langage C----------------------------------------------------------------------------------------------------------------------------------

ptr_liste cree_vide (void)

{ return( (ptr_liste)NULL ); }

int est_vide (ptr_liste liste)

{ return( liste == (ptr_liste)NULL ); }

type_base tete_liste (ptr_liste liste)

{assert( liste != (ptr_liste)NULL );

return( liste->valeur ); }

ptr_liste queue_liste (ptr_liste liste)

{assert( liste != (ptr_liste)NULL );

return( liste->suivant ); }

Création de la liste vide.Création de la liste vide.

8 novembre 20068 novembre 2006 Cours d'algorithmique 2 - IntranetCours d'algorithmique 2 - Intranet 4343

Listes en langage CListes en langage C----------------------------------------------------------------------------------------------------------------------------------

ptr_liste cree_vide (void)

{ return( (ptr_liste)NULL ); }

int est_vide (ptr_liste liste)

{ return( liste == (ptr_liste)NULL ); }

type_base tete_liste (ptr_liste liste)

{assert( liste != (ptr_liste)NULL );

return( liste->valeur ); }

ptr_liste queue_liste (ptr_liste liste)

{assert( liste != (ptr_liste)NULL );

return( liste->suivant ); }

Création de la liste vide.Création de la liste vide.

Le prédicat de listeLe prédicat de liste vide ou non.vide ou non.

8 novembre 20068 novembre 2006 Cours d'algorithmique 2 - IntranetCours d'algorithmique 2 - Intranet 4444

Listes en langage CListes en langage C----------------------------------------------------------------------------------------------------------------------------------

ptr_liste cree_vide (void)

{ return( (ptr_liste)NULL ); }

int est_vide (ptr_liste liste)

{ return( liste == (ptr_liste)NULL ); }

type_base tete_liste (ptr_liste liste)

{assert( liste != (ptr_liste)NULL );

return( liste->valeur ); }

ptr_liste queue_liste (ptr_liste liste)

{assert( liste != (ptr_liste)NULL );

return( liste->suivant ); }

Création de la liste vide.Création de la liste vide.

Le prédicat de listeLe prédicat de liste vide ou non.vide ou non.

Rendre la tête d’uneliste non vide.

8 novembre 20068 novembre 2006 Cours d'algorithmique 2 - IntranetCours d'algorithmique 2 - Intranet 4545

Listes en langage CListes en langage C----------------------------------------------------------------------------------------------------------------------------------

ptr_liste cree_vide (void)

{ return( (ptr_liste)NULL ); }

int est_vide (ptr_liste liste)

{ return( liste == (ptr_liste)NULL ); }

type_base tete_liste (ptr_liste liste)

{assert( liste != (ptr_liste)NULL );

return( liste->valeur ); }

ptr_liste queue_liste (ptr_liste liste)

{assert( liste != (ptr_liste)NULL );

return( liste->suivant ); }

Création de la liste vide.Création de la liste vide.

Le prédicat de listeLe prédicat de liste vide ou non.vide ou non.

Rendre la tête d’uneliste non vide.

On s’assure que la liste n’estOn s’assure que la liste n’estpas la liste vide.pas la liste vide.

Préférable : Préférable :

( liste != cree_vide() ) ( liste != cree_vide() )

8 novembre 20068 novembre 2006 Cours d'algorithmique 2 - IntranetCours d'algorithmique 2 - Intranet 4646

Listes en langage CListes en langage C----------------------------------------------------------------------------------------------------------------------------------

ptr_liste cree_vide (void)

{ return( (ptr_liste)NULL ); }

int est_vide (ptr_liste liste)

{ return( liste == (ptr_liste)NULL ); }

type_base tete_liste (ptr_liste liste)

{assert( liste != (ptr_liste)NULL );

return( liste->valeur ); }

ptr_liste queue_liste (ptr_liste liste)

{assert( liste != (ptr_liste)NULL );

return( liste->suivant ); }

Création de la liste vide.Création de la liste vide.

Le prédicat de listeLe prédicat de liste vide ou non.vide ou non.

Rendre la tête d’uneliste non vide.

Rendre la queueRendre la queued’une liste non vide.d’une liste non vide.

8 novembre 20068 novembre 2006 Cours d'algorithmique 2 - IntranetCours d'algorithmique 2 - Intranet 4747

Listes en langage CListes en langage C----------------------------------------------------------------------------------------------------------------------------------

ptr_liste ajout_liste (type_base elt, ptr_liste liste)

{ptr_liste ptr_auxil;

ptr_auxil = (ptr_liste)malloc(sizeof(t_maillon));

ptr_auxil->valeur = elt;

ptr_auxil->suivant = liste;

return( ptr_auxil );}

8 novembre 20068 novembre 2006 Cours d'algorithmique 2 - IntranetCours d'algorithmique 2 - Intranet 4848

Listes en langage CListes en langage C----------------------------------------------------------------------------------------------------------------------------------

ptr_liste ajout_liste (type_base elt, ptr_liste liste)

{ptr_liste ptr_auxil;

ptr_auxil = (ptr_liste)malloc(sizeof(t_maillon));

ptr_auxil->valeur = elt;

ptr_auxil->suivant = liste;

return( ptr_auxil );}

ptr_liste ??? ???

8 novembre 20068 novembre 2006 Cours d'algorithmique 2 - IntranetCours d'algorithmique 2 - Intranet 4949

Listes en langage CListes en langage C----------------------------------------------------------------------------------------------------------------------------------

ptr_liste ajout_liste (type_base elt, ptr_liste liste)

{ptr_liste ptr_auxil;

ptr_auxil = (ptr_liste)malloc(sizeof(t_maillon));

ptr_auxil->valeur = elt;

ptr_auxil->suivant = liste;

return( ptr_auxil );}

ptr_liste elt ???

8 novembre 20068 novembre 2006 Cours d'algorithmique 2 - IntranetCours d'algorithmique 2 - Intranet 5050

Listes en langage CListes en langage C----------------------------------------------------------------------------------------------------------------------------------

ptr_liste ajout_liste (type_base elt, ptr_liste liste)

{ptr_liste ptr_auxil;

ptr_auxil = (ptr_liste)malloc(sizeof(t_maillon));

ptr_auxil->valeur = elt;

ptr_auxil->suivant = liste;

return( ptr_auxil );}

ptr_liste elt liste

8 novembre 20068 novembre 2006 Cours d'algorithmique 2 - IntranetCours d'algorithmique 2 - Intranet 5151

Compilation séparéeCompilation séparée----------------------------------------------------------------------------------------------------------------------------------

C O M P I L A T I O N C O M P I L A T I O N

S E P A R E ES E P A R E E

8 novembre 20068 novembre 2006 Cours d'algorithmique 2 - IntranetCours d'algorithmique 2 - Intranet 5252

Exporter les types --- fichier adt_liste.cExporter les types --- fichier adt_liste.c----------------------------------------------------------------------------------------------------------------------------------

...#include <assert.h>

typedef int type_base;typedef struct moi_meme {type_base valeur; struct moi_meme *suivant; } t_maillon, *ptr_liste;

ptr_liste cree_vide (void)

{ return( (ptr_liste)NULL ); }

...

8 novembre 20068 novembre 2006 Cours d'algorithmique 2 - IntranetCours d'algorithmique 2 - Intranet 5353

Exporter les types --- fichier adt_liste.cExporter les types --- fichier adt_liste.c----------------------------------------------------------------------------------------------------------------------------------

...#include <assert.h>

typedef int type_base;typedef struct moi_meme {type_base valeur; struct moi_meme *suivant; } t_maillon, *ptr_liste;

ptr_liste cree_vide (void);int est_vide (ptr_liste liste);ptr_liste ajout_liste (type_base elt, ptr_liste liste);type_base tete_liste (ptr_liste liste);ptr_liste queue_liste (ptr_liste liste);

ptr_liste cree_vide (void)

{ return( (ptr_liste)NULL ); }

...

Nous inséronsNous inséronsles prototypes.les prototypes.

8 novembre 20068 novembre 2006 Cours d'algorithmique 2 - IntranetCours d'algorithmique 2 - Intranet 5454

Exporter les types --- fichier adt_liste.cExporter les types --- fichier adt_liste.c----------------------------------------------------------------------------------------------------------------------------------

...#include <assert.h>

typedef int type_base;typedef struct moi_meme {type_base valeur; struct moi_meme *suivant; } t_maillon, *ptr_liste;

ptr_liste cree_vide (void);int est_vide (ptr_liste liste);ptr_liste ajout_liste (type_base elt, ptr_liste liste);type_base tete_liste (ptr_liste liste);ptr_liste queue_liste (ptr_liste liste);

ptr_liste cree_vide (void)

{ return( (ptr_liste)NULL ); }

...

type_liste.h

#include ‘’type_liste.h ’’

8 novembre 20068 novembre 2006 Cours d'algorithmique 2 - IntranetCours d'algorithmique 2 - Intranet 5555

Exporter les types --- fichier adt_liste.cExporter les types --- fichier adt_liste.c----------------------------------------------------------------------------------------------------------------------------------

...#include <assert.h>

typedef int type_base;typedef struct moi_meme {type_base valeur; struct moi_meme *suivant; } t_maillon, *ptr_liste;

ptr_liste cree_vide (void);int est_vide (ptr_liste liste);ptr_liste ajout_liste (type_base elt, ptr_liste liste);type_base tete_liste (ptr_liste liste);ptr_liste queue_liste (ptr_liste liste);

ptr_liste cree_vide (void)

{ return( (ptr_liste)NULL ); }

...

type_liste.h

#include ‘’type_liste.h ’’

adt_liste.h

#include ‘’adt_liste.h’’

8 novembre 20068 novembre 2006 Cours d'algorithmique 2 - IntranetCours d'algorithmique 2 - Intranet 5656

Exporter les types --- fichier adt_liste.cExporter les types --- fichier adt_liste.c----------------------------------------------------------------------------------------------------------------------------------

...#include <assert.h>

#include ‘’type_liste.h’’

#include ‘’adt_liste.h’’

ptr_liste cree_vide (void)

{ return( (ptr_liste)NULL ); }

...

Les définitions viennent ici !Les définitions viennent ici !

Le fichier adt_liste.cLe fichier adt_liste.c

8 novembre 20068 novembre 2006 Cours d'algorithmique 2 - IntranetCours d'algorithmique 2 - Intranet 5757

prog.c qui utilise le type de données liste :prog.c qui utilise le type de données liste :----------------------------------------------------------------------------------------------------------------------------------

...#include <assert.h>

#include ‘’type_liste.h’’

#include ‘’adt_liste.h’’

int main (void)...

L’utilisateur voit la structureL’utilisateur voit la structuredu type de liste.du type de liste.

L’utilisateur voit les signaturesL’utilisateur voit les signaturesdes fonctions sur les listes.des fonctions sur les listes.

8 novembre 20068 novembre 2006 Cours d'algorithmique 2 - IntranetCours d'algorithmique 2 - Intranet 5858

prog.c qui utilise le type de données liste :prog.c qui utilise le type de données liste :----------------------------------------------------------------------------------------------------------------------------------

...#include <assert.h>

#include ‘’type_liste.h’’

#include ‘’adt_liste.h’’

int main (void)...

L’utilisateur voit la structureL’utilisateur voit la structuredu type de liste.du type de liste.

L’utilisateur voit les signaturesL’utilisateur voit les signaturesdes fonctions sur les listes.des fonctions sur les listes.

L’utilisateur ne voit pas la réalisation desL’utilisateur ne voit pas la réalisation desfonctions, c’est-à-dire le contenu de adt_liste.c !fonctions, c’est-à-dire le contenu de adt_liste.c !

Souvent, c’est mieux fait dans d’autres langagesSouvent, c’est mieux fait dans d’autres langagescomme Ada , Modula , C++ et plein d’autres.comme Ada , Modula , C++ et plein d’autres.

8 novembre 20068 novembre 2006 Cours d'algorithmique 2 - IntranetCours d'algorithmique 2 - Intranet 5959

Compilation séparéeCompilation séparée----------------------------------------------------------------------------------------------------------------------------------

• gcc –o executable prog.cgcc –o executable prog.c– On ne peut pas générer l’exécutable.On ne peut pas générer l’exécutable.– On connaît les signatures des fonctions sur les listes.On connaît les signatures des fonctions sur les listes.– Mais, on ne connaît pas leurs réalisations !Mais, on ne connaît pas leurs réalisations !

8 novembre 20068 novembre 2006 Cours d'algorithmique 2 - IntranetCours d'algorithmique 2 - Intranet 6060

Compilation séparéeCompilation séparée----------------------------------------------------------------------------------------------------------------------------------

• gcc –o executable prog.cgcc –o executable prog.c– On ne peut pas générer l’exécutable.On ne peut pas générer l’exécutable.– On connaît les signatures des fonctions sur les listes.On connaît les signatures des fonctions sur les listes.– Mais, on ne connaît pas leurs réalisations !Mais, on ne connaît pas leurs réalisations !

• gcc –o executable prog.c adt_liste.cgcc –o executable prog.c adt_liste.c– On peut compiler les deux fichiers en même temps.On peut compiler les deux fichiers en même temps.

8 novembre 20068 novembre 2006 Cours d'algorithmique 2 - IntranetCours d'algorithmique 2 - Intranet 6161

Compilation séparéeCompilation séparée----------------------------------------------------------------------------------------------------------------------------------

• gcc –o executable prog.cgcc –o executable prog.c– On ne peut pas générer l’exécutable.On ne peut pas générer l’exécutable.– On connaît les signatures des fonctions sur les listes.On connaît les signatures des fonctions sur les listes.– Mais, on ne connaît pas leurs réalisations !Mais, on ne connaît pas leurs réalisations !

• gcc –o executable prog.c adt_liste.cgcc –o executable prog.c adt_liste.c– On peut compiler les deux fichiers en même temps.On peut compiler les deux fichiers en même temps.

• gcc gcc –c–c prog.c prog.c– Nous compilons prog.c pour générer « prog.o » .Nous compilons prog.c pour générer « prog.o » .– Nous n’avons pas besoin des définitions sur les listes, car Nous n’avons pas besoin des définitions sur les listes, car

nous ne créons pas encore l’exécutable.nous ne créons pas encore l’exécutable.– De même, gcc De même, gcc –c–c adt_liste.c crée « adt_liste.o ». adt_liste.c crée « adt_liste.o ».

8 novembre 20068 novembre 2006 Cours d'algorithmique 2 - IntranetCours d'algorithmique 2 - Intranet 6262

Compilation séparéeCompilation séparée----------------------------------------------------------------------------------------------------------------------------------

• gcc –o executable prog.cgcc –o executable prog.c– On ne peut pas générer l’exécutable.On ne peut pas générer l’exécutable.– On connaît les signatures des fonctions sur les listes.On connaît les signatures des fonctions sur les listes.– Mais, on ne connaît pas leurs réalisations !Mais, on ne connaît pas leurs réalisations !

• gcc –o executable prog.c adt_liste.cgcc –o executable prog.c adt_liste.c– On peut compiler les deux fichiers en même temps.On peut compiler les deux fichiers en même temps.

• gcc gcc –c–c prog.c prog.c– Nous compilons prog.c pour générer « prog.o » .Nous compilons prog.c pour générer « prog.o » .– Nous n’avons pas besoin des définitions sur les listes, car Nous n’avons pas besoin des définitions sur les listes, car

nous ne créons pas encore l’exécutable.nous ne créons pas encore l’exécutable.– De même, gcc De même, gcc –c–c adt_liste.c crée « adt_liste.o ». adt_liste.c crée « adt_liste.o ».

• gcc –o executable prog.o adt_liste.ogcc –o executable prog.o adt_liste.o

8 novembre 20068 novembre 2006 Cours d'algorithmique 2 - IntranetCours d'algorithmique 2 - Intranet 6363

Les fichiers .hLes fichiers .h----------------------------------------------------------------------------------------------------------------------------------

• Les fichiers « .h » donnent les « types » et/ou les Les fichiers « .h » donnent les « types » et/ou les « prototypes ».« prototypes ».

8 novembre 20068 novembre 2006 Cours d'algorithmique 2 - IntranetCours d'algorithmique 2 - Intranet 6464

Les fichiers .hLes fichiers .h----------------------------------------------------------------------------------------------------------------------------------

• Les fichiers « .h » donnent les « types » et/ou les Les fichiers « .h » donnent les « types » et/ou les « prototypes ».« prototypes ».

• #include <file.h>#include <file.h>– file.h est cherché dans les répertoires standard,file.h est cherché dans les répertoires standard,– mais aussi dans tout répertoire indiqué par -mais aussi dans tout répertoire indiqué par -IIrép.rép.– Exemple : gcc … -Exemple : gcc … -II. -. -II../local/include …../local/include …

8 novembre 20068 novembre 2006 Cours d'algorithmique 2 - IntranetCours d'algorithmique 2 - Intranet 6565

Les fichiers .hLes fichiers .h----------------------------------------------------------------------------------------------------------------------------------

• Les fichiers « .h » donnent les « types » et/ou les Les fichiers « .h » donnent les « types » et/ou les « prototypes ».« prototypes ».

• #include <file.h>#include <file.h>– file.h est cherché dans les répertoires standard,file.h est cherché dans les répertoires standard,– mais aussi dans tout répertoire indiqué par -mais aussi dans tout répertoire indiqué par -IIrép.rép.– Exemple : gcc … -Exemple : gcc … -II. -. -II../local/include …../local/include …

• #include ‘’file.h’’#include ‘’file.h’’– file.h est cherché dans le répertoire courant.file.h est cherché dans le répertoire courant.

8 novembre 20068 novembre 2006 Cours d'algorithmique 2 - IntranetCours d'algorithmique 2 - Intranet 6666

Les fichiers .hLes fichiers .h----------------------------------------------------------------------------------------------------------------------------------

• Les fichiers « .h » donnent les « types » et/ou les Les fichiers « .h » donnent les « types » et/ou les « prototypes ».« prototypes ».

• #include <file.h>#include <file.h>– file.h est cherché dans les répertoires standard,file.h est cherché dans les répertoires standard,– mais aussi dans tout répertoire indiqué par -mais aussi dans tout répertoire indiqué par -IIrép.rép.– Exemple : gcc … -Exemple : gcc … -II. -. -II../local/include …../local/include …

• #include ‘’file.h’’#include ‘’file.h’’– file.h est cherché dans le répertoire courant.file.h est cherché dans le répertoire courant.

• gcc -Wmissing-prototypes …gcc -Wmissing-prototypes …– L’absence de prototypes est signalée par un avertissement.L’absence de prototypes est signalée par un avertissement.

8 novembre 20068 novembre 2006 Cours d'algorithmique 2 - IntranetCours d'algorithmique 2 - Intranet 6767

Créer et utiliser les librairiesCréer et utiliser les librairies----------------------------------------------------------------------------------------------------------------------------------

• Il existe des librairies statiques, dynamiques et archives.Il existe des librairies statiques, dynamiques et archives.– « ar r libadtl.a adt_liste.o » crée la librairie « libadtl.a » « ar r libadtl.a adt_liste.o » crée la librairie « libadtl.a »

à partir du contenu de « adt_liste.o »,à partir du contenu de « adt_liste.o »,– « ar t libadtl.a » affiche le contenu de la librairie.« ar t libadtl.a » affiche le contenu de la librairie.

8 novembre 20068 novembre 2006 Cours d'algorithmique 2 - IntranetCours d'algorithmique 2 - Intranet 6868

Créer et utiliser les librairiesCréer et utiliser les librairies----------------------------------------------------------------------------------------------------------------------------------

• Il existe des librairies statiques, dynamiques et archives.Il existe des librairies statiques, dynamiques et archives.– « ar r libadtl.a adt_liste.o » crée la librairie « libadtl.a » « ar r libadtl.a adt_liste.o » crée la librairie « libadtl.a »

à partir du contenu de « adt_liste.o »,à partir du contenu de « adt_liste.o »,– « ar t libadtl.a » affiche le contenu de la librairie.« ar t libadtl.a » affiche le contenu de la librairie.

• « gcc -o executable -L« gcc -o executable -L.. prog.c -l prog.c -ladtl adtl » compile prog.c» compile prog.c– Le répertoire Le répertoire .. est inspecté lors de la recherche des librairies, est inspecté lors de la recherche des librairies,– on recherche la librairie on recherche la librairie libadtl.alibadtl.a

8 novembre 20068 novembre 2006 Cours d'algorithmique 2 - IntranetCours d'algorithmique 2 - Intranet 6969

Créer et utiliser les librairiesCréer et utiliser les librairies----------------------------------------------------------------------------------------------------------------------------------

• Il existe des librairies statiques, dynamiques et archives.Il existe des librairies statiques, dynamiques et archives.– « ar r libadtl.a adt_liste.o » crée la librairie « libadtl.a » « ar r libadtl.a adt_liste.o » crée la librairie « libadtl.a »

à partir du contenu de « adt_liste.o »,à partir du contenu de « adt_liste.o »,– « ar t libadtl.a » affiche le contenu de la librairie.« ar t libadtl.a » affiche le contenu de la librairie.

• « gcc -o executable -L« gcc -o executable -L.. prog.c -l prog.c -ladtl adtl » compile prog.c» compile prog.c– Le répertoire  Le répertoire  .. est inspecté lors de la recherche des librairies, est inspecté lors de la recherche des librairies,– on recherche la librairie on recherche la librairie libadtl.alibadtl.a

• L’ordre des arguments importe :L’ordre des arguments importe :– OK : gcc prog-math.c -lmOK : gcc prog-math.c -lm– KO : gcc -lm prog-math.cKO : gcc -lm prog-math.c

8 novembre 20068 novembre 2006 Cours d'algorithmique 2 - IntranetCours d'algorithmique 2 - Intranet 7070

L E S L E S

F I L E SF I L E S

Les filesLes files----------------------------------------------------------------------------------------------------------------------------------

8 novembre 20068 novembre 2006 Cours d'algorithmique 2 - IntranetCours d'algorithmique 2 - Intranet 7171

Les filesLes files----------------------------------------------------------------------------------------------------------------------------------

• LIFO : listes et piles.LIFO : listes et piles.– Les accès en « ajout », « lecture » et « suppression » Les accès en « ajout », « lecture » et « suppression »

se font en tête de liste :se font en tête de liste :

InsertionInsertion

LectureLecture

SuppressionSuppression

8 novembre 20068 novembre 2006 Cours d'algorithmique 2 - IntranetCours d'algorithmique 2 - Intranet 7272

Les filesLes files----------------------------------------------------------------------------------------------------------------------------------

• LIFO : listes et piles.LIFO : listes et piles.– Les accès en « ajout », « lecture » et « suppression » Les accès en « ajout », « lecture » et « suppression »

se font en tête de liste :se font en tête de liste :

InsertionInsertion

LectureLecture

SuppressionSuppression

• FIFO : files.FIFO : files.– First In – First Out, c’est plus équitable !First In – First Out, c’est plus équitable !– L’insertion se fait à la fin et c’est la seule L’insertion se fait à la fin et c’est la seule

différence.différence.

LectureLecture

SuppressionSuppression

InsertionInsertion

8 novembre 20068 novembre 2006 Cours d'algorithmique 2 - IntranetCours d'algorithmique 2 - Intranet 7373

Les files en langage CLes files en langage C----------------------------------------------------------------------------------------------------------------------------------

ptr_liste ajout_file (type_base elt, ptr_file file)

{ptr_file ptr_auxil;

ptr_auxil = (ptr_file)malloc(sizeof(t_maillon));

ptr_auxil->valeur = elt;

ptr_auxil->suivant = (ptr_file)NULL;

if ( file == (ptr_file)NULL )

return( ptr_auxil );

else

{ptr_file ptr_local = file;

while ( ptr_local->suivant != (ptr_file)NULL )

ptr_local = ptr_local->suivant;

ptr_local->suivant = ptr_auxil;

return( file ); }}

8 novembre 20068 novembre 2006 Cours d'algorithmique 2 - IntranetCours d'algorithmique 2 - Intranet 7474

Les files en langage CLes files en langage C----------------------------------------------------------------------------------------------------------------------------------

ptr_liste ajout_file (type_base elt, ptr_file file)

{ptr_file ptr_auxil;

ptr_auxil = (ptr_file)malloc(sizeof(t_maillon));

ptr_auxil->valeur = elt;

ptr_auxil->suivant = (ptr_file)NULL;

if ( file == (ptr_file)NULL )

return( ptr_auxil );

else

{ptr_file ptr_local = file;

while ( ptr_local->suivant != (ptr_file)NULL )

ptr_local = ptr_local->suivant;

ptr_local->suivant = ptr_auxil;

return( file ); }}

Création du nouveauCréation du nouveaumaillon qui sera le dernier.maillon qui sera le dernier.

8 novembre 20068 novembre 2006 Cours d'algorithmique 2 - IntranetCours d'algorithmique 2 - Intranet 7575

Les files en langage CLes files en langage C----------------------------------------------------------------------------------------------------------------------------------

ptr_liste ajout_file (type_base elt, ptr_file file)

{ptr_file ptr_auxil;

ptr_auxil = (ptr_file)malloc(sizeof(t_maillon));

ptr_auxil->valeur = elt;

ptr_auxil->suivant = (ptr_file)NULL;

if ( file == (ptr_file)NULL )

return( ptr_auxil );

else

{ptr_file ptr_local = file;

while ( ptr_local->suivant != (ptr_file)NULL )

ptr_local = ptr_local->suivant;

ptr_local->suivant = ptr_auxil;

return( file ); }}

Il est peut-être le seul !Il est peut-être le seul !

8 novembre 20068 novembre 2006 Cours d'algorithmique 2 - IntranetCours d'algorithmique 2 - Intranet 7676

Les files en langage CLes files en langage C----------------------------------------------------------------------------------------------------------------------------------

ptr_liste ajout_file (type_base elt, ptr_file file)

{ptr_file ptr_auxil;

ptr_auxil = (ptr_file)malloc(sizeof(t_maillon));

ptr_auxil->valeur = elt;

ptr_auxil->suivant = (ptr_file)NULL;

if ( file == (ptr_file)NULL )

return( ptr_auxil );

else

{ptr_file ptr_local = file;

while ( ptr_local->suivant != (ptr_file)NULL )

ptr_local = ptr_local->suivant;

ptr_local->suivant = ptr_auxil;

return( file ); }}

Nous avançons jusqu’auNous avançons jusqu’audernier maillon,dernier maillon,

8 novembre 20068 novembre 2006 Cours d'algorithmique 2 - IntranetCours d'algorithmique 2 - Intranet 7777

Les files en langage CLes files en langage C----------------------------------------------------------------------------------------------------------------------------------

ptr_liste ajout_file (type_base elt, ptr_file file)

{ptr_file ptr_auxil;

ptr_auxil = (ptr_file)malloc(sizeof(t_maillon));

ptr_auxil->valeur = elt;

ptr_auxil->suivant = (ptr_file)NULL;

if ( file == (ptr_file)NULL )

return( ptr_auxil );

else

{ptr_file ptr_local = file;

while ( ptr_local->suivant != (ptr_file)NULL )

ptr_local = ptr_local->suivant;

ptr_local->suivant = ptr_auxil;

return( file ); }}

Nous chaînons etNous chaînons etrendons le résultat !rendons le résultat !

8 novembre 20068 novembre 2006 Cours d'algorithmique 2 - IntranetCours d'algorithmique 2 - Intranet 7878

Les filesLes files----------------------------------------------------------------------------------------------------------------------------------

• Souvent, on maintient deux pointeurs :Souvent, on maintient deux pointeurs :

têtetête

queuequeue

8 novembre 20068 novembre 2006 Cours d'algorithmique 2 - IntranetCours d'algorithmique 2 - Intranet 7979

Les filesLes files----------------------------------------------------------------------------------------------------------------------------------

• Souvent, on maintient deux pointeurs :Souvent, on maintient deux pointeurs :

têtetête

queuequeue

• C’est plus pratique d’avoir une structure de synthèse :C’est plus pratique d’avoir une structure de synthèse :

filefile

8 novembre 20068 novembre 2006 Cours d'algorithmique 2 - IntranetCours d'algorithmique 2 - Intranet 8080

Les arbresLes arbres----------------------------------------------------------------------------------------------------------------------------------

E TE TP O U RP O U R

T E R M I N E R ,T E R M I N E R ,L E SL E S

A R B R E S !A R B R E S !

8 novembre 20068 novembre 2006 Cours d'algorithmique 2 - IntranetCours d'algorithmique 2 - Intranet 8181

Les arbres enracinésLes arbres enracinés----------------------------------------------------------------------------------------------------------------------------------

racineracine

8 novembre 20068 novembre 2006 Cours d'algorithmique 2 - IntranetCours d'algorithmique 2 - Intranet 8282

Les arbres enracinésLes arbres enracinés----------------------------------------------------------------------------------------------------------------------------------

racineracine

Il y a un nœud qui est la « racine ».Il y a un nœud qui est la « racine ».

Il y a une orientation de laIl y a une orientation de laracine vers les autres.racine vers les autres.

8 novembre 20068 novembre 2006 Cours d'algorithmique 2 - IntranetCours d'algorithmique 2 - Intranet 8383

Les arbres enracinésLes arbres enracinés----------------------------------------------------------------------------------------------------------------------------------

autre racineautre racine

8 novembre 20068 novembre 2006 Cours d'algorithmique 2 - IntranetCours d'algorithmique 2 - Intranet 8484

Les arbres NON enracinésLes arbres NON enracinés----------------------------------------------------------------------------------------------------------------------------------

Les liens sont bi-directionnels.Les liens sont bi-directionnels.

Il n’y a pas de racine.Il n’y a pas de racine.

8 novembre 20068 novembre 2006 Cours d'algorithmique 2 - IntranetCours d'algorithmique 2 - Intranet 8585

Les arbres NON enracinésLes arbres NON enracinés----------------------------------------------------------------------------------------------------------------------------------

Pourquoi d’ailleurs faire laPourquoi d’ailleurs faire ladistinction entre feuillesdistinction entre feuilles

et nœuds ?et nœuds ?

C’est ainsi que nousC’est ainsi que nousverrons un arbreverrons un arbre

en théorie desen théorie desgraphes.graphes.

8 novembre 20068 novembre 2006 Cours d'algorithmique 2 - IntranetCours d'algorithmique 2 - Intranet 8686

Les arbres enracinésLes arbres enracinés----------------------------------------------------------------------------------------------------------------------------------

racineracine

Les feuilles sont les extrémités de Les feuilles sont les extrémités de l’arbre.l’arbre.

Du point de vue de l’arbre, ellesDu point de vue de l’arbre, ellessont atomiques (sanssont atomiques (sans

successeur).successeur).

Concernant l’application,Concernant l’application,elles comportentelles comportent

souvent dessouvent desvaleurs.valeurs.

5 13

8 novembre 20068 novembre 2006 Cours d'algorithmique 2 - IntranetCours d'algorithmique 2 - Intranet 8787

Les arbres enracinésLes arbres enracinés----------------------------------------------------------------------------------------------------------------------------------

racineracine

Il y a des nœuds (internes)Il y a des nœuds (internes)qui ont des « fils » enqui ont des « fils » en

nombre variable.nombre variable.

Chaque fils est à sonChaque fils est à sontour un arbre.tour un arbre.

ConcernantConcernantl’application,l’application,

les nœudsles nœudspeuventpeuvent

comportercomporterdes valeurs,des valeurs,

que l’on appelleque l’on appelleaussi des étiquettes.aussi des étiquettes.

x

+

8 novembre 20068 novembre 2006 Cours d'algorithmique 2 - IntranetCours d'algorithmique 2 - Intranet 8888

Les arbres enracinésLes arbres enracinés----------------------------------------------------------------------------------------------------------------------------------

racineracine

Sous-arbres !

8 novembre 20068 novembre 2006 Cours d'algorithmique 2 - IntranetCours d'algorithmique 2 - Intranet 8989

Les arbres enracinésLes arbres enracinés----------------------------------------------------------------------------------------------------------------------------------

• Un arbre estUn arbre est– soit, simplement une feuille :soit, simplement une feuille :

racineracine

8 novembre 20068 novembre 2006 Cours d'algorithmique 2 - IntranetCours d'algorithmique 2 - Intranet 9090

Les arbres enracinésLes arbres enracinés----------------------------------------------------------------------------------------------------------------------------------

• Un arbre estUn arbre est– soit, simplement une feuille :soit, simplement une feuille :

racineracine

– soit, un nœud (racine) avec un ou plusieurs fils qui soit, un nœud (racine) avec un ou plusieurs fils qui sont des arbres (enracinés) à leur tour :sont des arbres (enracinés) à leur tour :

racineracine

arbre arbre arbrearbre arbre arbre

8 novembre 20068 novembre 2006 Cours d'algorithmique 2 - IntranetCours d'algorithmique 2 - Intranet 9191

Les arbres enracinés (binaires) comme ADTLes arbres enracinés (binaires) comme ADT----------------------------------------------------------------------------------------------------------------------------------

• Création d’une feuille :Création d’une feuille :

– cree_feuille : void -> cree_feuille : void -> AA

– cree_feuille : int -> cree_feuille : int -> AApour créer une feuille qui comporte une valeur entière, pour créer une feuille qui comporte une valeur entière,

avec :avec :

valeur_feuille : valeur_feuille : AA -> int -> int

8 novembre 20068 novembre 2006 Cours d'algorithmique 2 - IntranetCours d'algorithmique 2 - Intranet 9292

Les arbres enracinés (binaires) comme ADTLes arbres enracinés (binaires) comme ADT----------------------------------------------------------------------------------------------------------------------------------

• Création d’une feuille :Création d’une feuille :

– cree_feuille : void -> cree_feuille : void -> AA

– cree_feuille : int -> cree_feuille : int -> AApour créer une feuille qui comporte une valeur entière, avec pour créer une feuille qui comporte une valeur entière, avec

::

valeur_feuille : valeur_feuille : AA -> int -> int

• Création d’un nœud binaire :Création d’un nœud binaire :

– cree_arbre : cree_arbre : A A x x AA -> -> AA

– cree_arbre : cree_arbre : A A x int x x int x AA -> -> AApour créer un nœud qui comporte une étiquette entière, pour créer un nœud qui comporte une étiquette entière,

avec : avec :

etiquette_arbre : etiquette_arbre : AA -> int -> int

8 novembre 20068 novembre 2006 Cours d'algorithmique 2 - IntranetCours d'algorithmique 2 - Intranet 9393

Les arbres enracinés (binaires) comme ADTLes arbres enracinés (binaires) comme ADT----------------------------------------------------------------------------------------------------------------------------------

• Distinction entre feuilles et noeuds :Distinction entre feuilles et noeuds :

– est_feuille : est_feuille : AA -> BOOL -> BOOL

est_feuille( cree_feuille() ) = Vraiest_feuille( cree_feuille() ) = Vrai

est_feuille( cree_noeud( x , y ) ) = Fauxest_feuille( cree_noeud( x , y ) ) = Faux

8 novembre 20068 novembre 2006 Cours d'algorithmique 2 - IntranetCours d'algorithmique 2 - Intranet 9494

Les arbres enracinés (binaires) comme ADTLes arbres enracinés (binaires) comme ADT----------------------------------------------------------------------------------------------------------------------------------

• Distinction entre feuilles et noeuds :Distinction entre feuilles et noeuds :

– est_feuille : est_feuille : AA -> BOOL -> BOOL

est_feuille( cree_feuille() ) = Vraiest_feuille( cree_feuille() ) = Vrai

est_feuille( cree_noeud( x , y ) ) = Fauxest_feuille( cree_noeud( x , y ) ) = Faux

• Décomposition d’un nœud binaire :Décomposition d’un nœud binaire :

– fils_gauche : fils_gauche : AA -> -> AA– fils_droit : fils_droit : AA -> -> AA

fils_gauche ( cree_arbre ( g , d ) ) = gfils_gauche ( cree_arbre ( g , d ) ) = g

fils_droit ( cree_arbre ( g , d ) ) = dfils_droit ( cree_arbre ( g , d ) ) = d

8 novembre 20068 novembre 2006 Cours d'algorithmique 2 - IntranetCours d'algorithmique 2 - Intranet 9595

Les arbres enracinés (binaires) comme ADTLes arbres enracinés (binaires) comme ADT----------------------------------------------------------------------------------------------------------------------------------

arbre_un = cree_arbre ( cree_feuille(5) , cree_feuille(7) );

arbre_deux = cree_arbre ( cree_feuille(2) ,

cree_arbre ( arbre_un ,

cree_feuille(1) ) );

arbre_trois = cree_arbre ( cree_feuille(3) , cree_feuille(7) );

arbre = cree_arbre ( arbre_deux , arbre_trois );

8 novembre 20068 novembre 2006 Cours d'algorithmique 2 - IntranetCours d'algorithmique 2 - Intranet 9696

Les arbres enracinés (binaires) comme ADTLes arbres enracinés (binaires) comme ADT----------------------------------------------------------------------------------------------------------------------------------

arbre_un = cree_arbre ( cree_feuille(5) , cree_feuille(7) );

arbre_deux = cree_arbre ( cree_feuille(2) ,

cree_arbre ( arbre_un ,

cree_feuille(1) ) );

arbre_trois = cree_arbre ( cree_feuille(3) , cree_feuille(7) );

arbre = cree_arbre ( arbre_deux , arbre_trois );

5 7

8 novembre 20068 novembre 2006 Cours d'algorithmique 2 - IntranetCours d'algorithmique 2 - Intranet 9797

Les arbres enracinés (binaires) comme ADTLes arbres enracinés (binaires) comme ADT----------------------------------------------------------------------------------------------------------------------------------

arbre_un = cree_arbre ( cree_feuille(5) , cree_feuille(7) );

arbre_deux = cree_arbre ( cree_feuille(2) ,

cree_arbre ( arbre_un ,

cree_feuille(1) ) );

arbre_trois = cree_arbre ( cree_feuille(3) , cree_feuille(7) );

arbre = cree_arbre ( arbre_deux , arbre_trois );

5 7

1

2

8 novembre 20068 novembre 2006 Cours d'algorithmique 2 - IntranetCours d'algorithmique 2 - Intranet 9898

Les arbres enracinés (binaires) comme ADTLes arbres enracinés (binaires) comme ADT----------------------------------------------------------------------------------------------------------------------------------

arbre_un = cree_arbre ( cree_feuille(5) , cree_feuille(7) );

arbre_deux = cree_arbre ( cree_feuille(2) ,

cree_arbre ( arbre_un ,

cree_feuille(1) ) );

arbre_trois = cree_arbre ( cree_feuille(3) , cree_feuille(7) );

arbre = cree_arbre ( arbre_deux , arbre_trois );

5 7

1

2 3 7

8 novembre 20068 novembre 2006 Cours d'algorithmique 2 - IntranetCours d'algorithmique 2 - Intranet 9999

Les arbres enracinés (binaires) comme ADTLes arbres enracinés (binaires) comme ADT----------------------------------------------------------------------------------------------------------------------------------

arbre_un = cree_arbre ( cree_feuille(5) , cree_feuille(7) );

arbre_deux = cree_arbre ( cree_feuille(2) ,

cree_arbre ( arbre_un ,

cree_feuille(1) ) );

arbre_trois = cree_arbre ( cree_feuille(3) , cree_feuille(7) );

arbre = cree_arbre ( arbre_deux , arbre_trois );

5 7

1

2 3 7

8 novembre 20068 novembre 2006 Cours d'algorithmique 2 - IntranetCours d'algorithmique 2 - Intranet 100100

Les arbres en langage CLes arbres en langage C----------------------------------------------------------------------------------------------------------------------------------

• Un pointeur sur un arbre est :Un pointeur sur un arbre est :– soit, un pointeur sur une feuille,soit, un pointeur sur une feuille,– soit, un pointeur sur un nœud.soit, un pointeur sur un nœud.

8 novembre 20068 novembre 2006 Cours d'algorithmique 2 - IntranetCours d'algorithmique 2 - Intranet 101101

Les arbres en langage CLes arbres en langage C----------------------------------------------------------------------------------------------------------------------------------

• Un pointeur sur un arbre est :Un pointeur sur un arbre est :– soit, un pointeur sur une feuille,soit, un pointeur sur une feuille,– soit, un pointeur sur un nœud.soit, un pointeur sur un nœud.

• Il faut donc une structure capable de contenir les deux :Il faut donc une structure capable de contenir les deux :– les champs d’une feuille,les champs d’une feuille,– les champs d’un nœud,les champs d’un nœud,– un indicateur booléen qui distingue les deux cas de figure.un indicateur booléen qui distingue les deux cas de figure.

8 novembre 20068 novembre 2006 Cours d'algorithmique 2 - IntranetCours d'algorithmique 2 - Intranet 102102

Les arbres en langage CLes arbres en langage C----------------------------------------------------------------------------------------------------------------------------------

• Un pointeur sur un arbre est :Un pointeur sur un arbre est :– soit, un pointeur sur une feuille,soit, un pointeur sur une feuille,– soit, un pointeur sur un nœud.soit, un pointeur sur un nœud.

• Il faut donc une structure capable de contenir les deux :Il faut donc une structure capable de contenir les deux :– les champs d’une feuille,les champs d’une feuille,– les champs d’un nœud,les champs d’un nœud,– un indicateur booléen qui distingue les deux cas de figure.un indicateur booléen qui distingue les deux cas de figure.

• Exemple, (expressions arithmétiques) :Exemple, (expressions arithmétiques) :– toute feuille est un entier,toute feuille est un entier,– chaque nœud comporte :chaque nœud comporte :

• un opérateur parmi « + », « * » et « - »,un opérateur parmi « + », « * » et « - »,

• deux fils qui sont des sous-expressions.deux fils qui sont des sous-expressions.

8 novembre 20068 novembre 2006 Cours d'algorithmique 2 - IntranetCours d'algorithmique 2 - Intranet 103103

Les arbres en langage CLes arbres en langage C----------------------------------------------------------------------------------------------------------------------------------

typedef struct moi_memetypedef struct moi_meme

{int est_feuille;{int est_feuille;

int valeur;int valeur;

char etiq;char etiq;

struct moi_meme *fg;struct moi_meme *fg;

struct moi_meme *fd;struct moi_meme *fd;

}}

t_arbre, *ptr_arbre;t_arbre, *ptr_arbre;

8 novembre 20068 novembre 2006 Cours d'algorithmique 2 - IntranetCours d'algorithmique 2 - Intranet 104104

Les arbres en langage CLes arbres en langage C----------------------------------------------------------------------------------------------------------------------------------

typedef struct moi_memetypedef struct moi_meme

{{int est_feuille; vaudra VRAIint est_feuille; vaudra VRAI

int valeur; aura une int valeur; aura une valeurvaleur

char etiq;char etiq;

struct moi_meme *fg;struct moi_meme *fg;

struct moi_meme *fd;struct moi_meme *fd;

}}

t_arbre, *ptr_arbre;t_arbre, *ptr_arbre;

Si c’est une feuille …Si c’est une feuille …

8 novembre 20068 novembre 2006 Cours d'algorithmique 2 - IntranetCours d'algorithmique 2 - Intranet 105105

Les arbres en langage CLes arbres en langage C----------------------------------------------------------------------------------------------------------------------------------

typedef struct moi_memetypedef struct moi_meme

{{int est_feuille; vaudra VRAIint est_feuille; vaudra VRAI

int valeur; aura une int valeur; aura une valeurvaleur

char etiq;char etiq;

struct moi_meme *fg;struct moi_meme *fg;

struct moi_meme *fd;struct moi_meme *fd;

}}

t_arbre, *ptr_arbre;t_arbre, *ptr_arbre;

Si c’est une feuille …Si c’est une feuille …

Ces champs n’ont simplementCes champs n’ont simplementaucun sens dans ce contexte !aucun sens dans ce contexte !

8 novembre 20068 novembre 2006 Cours d'algorithmique 2 - IntranetCours d'algorithmique 2 - Intranet 106106

Les arbres en langage CLes arbres en langage C----------------------------------------------------------------------------------------------------------------------------------

typedef struct moi_memetypedef struct moi_meme

{{int est_feuille; vaudra FAUXint est_feuille; vaudra FAUX

int valeur;int valeur;

char etiq; aura une valeurchar etiq; aura une valeur

struct moi_meme *fg; aura une valeurstruct moi_meme *fg; aura une valeur

struct moi_meme *fd; aura une valeurstruct moi_meme *fd; aura une valeur

}}

t_arbre, *ptr_arbre;t_arbre, *ptr_arbre;

Si c’est un noeud …Si c’est un noeud …

8 novembre 20068 novembre 2006 Cours d'algorithmique 2 - IntranetCours d'algorithmique 2 - Intranet 107107

Les arbres en langage CLes arbres en langage C----------------------------------------------------------------------------------------------------------------------------------

typedef struct moi_memetypedef struct moi_meme

{{int est_feuille; vaudra FAUXint est_feuille; vaudra FAUX

int valeur;int valeur;

char etiq; aura une valeurchar etiq; aura une valeur

struct moi_meme *fg; aura une valeurstruct moi_meme *fg; aura une valeur

struct moi_meme *fd; aura une valeurstruct moi_meme *fd; aura une valeur

}}

t_arbre, *ptr_arbre;t_arbre, *ptr_arbre;

Si c’est un noeud …Si c’est un noeud …

Le champ « valeur » n’a simplementLe champ « valeur » n’a simplementaucun sens dans ce contexte !aucun sens dans ce contexte !

8 novembre 20068 novembre 2006 Cours d'algorithmique 2 - IntranetCours d'algorithmique 2 - Intranet 108108

Les arbres en langage CLes arbres en langage C----------------------------------------------------------------------------------------------------------------------------------

typedef struct moi_memetypedef struct moi_meme

{{int est_feuille; vaudra FAUXint est_feuille; vaudra FAUX

int valeur;int valeur;

char etiq; aura une valeurchar etiq; aura une valeur

struct moi_meme *fg; aura une valeurstruct moi_meme *fg; aura une valeur

struct moi_meme *fd; aura une valeurstruct moi_meme *fd; aura une valeur

}}

t_arbre, *ptr_arbre;t_arbre, *ptr_arbre;

Si c’est un noeud …Si c’est un noeud …

Le champ « valeur » n’a simplementLe champ « valeur » n’a simplementaucun sens dans ce contexte !aucun sens dans ce contexte !

En Pascal, ADA et d’autres, il existe des structures variables !En Pascal, ADA et d’autres, il existe des structures variables !

8 novembre 20068 novembre 2006 Cours d'algorithmique 2 - IntranetCours d'algorithmique 2 - Intranet 109109

Les arbres en langage CLes arbres en langage C----------------------------------------------------------------------------------------------------------------------------------

int est_feuille (ptr_arbre arbre)int est_feuille (ptr_arbre arbre)

{return(arbre->est_feuille);{return(arbre->est_feuille);

}}

ptr_arbre cree_feuille (int val)ptr_arbre cree_feuille (int val)

{ptr_arbre arbre;{ptr_arbre arbre;

arbre = (ptr_arbre)malloc(sizeof(t_arbre));arbre = (ptr_arbre)malloc(sizeof(t_arbre));

arbre->est_feuille = 1;arbre->est_feuille = 1;

arbre->valeur = val;arbre->valeur = val;

return(arbre);return(arbre);

}}

8 novembre 20068 novembre 2006 Cours d'algorithmique 2 - IntranetCours d'algorithmique 2 - Intranet 110110

Les arbres en langage CLes arbres en langage C----------------------------------------------------------------------------------------------------------------------------------

int est_feuille (ptr_arbre arbre)int est_feuille (ptr_arbre arbre)

{return(arbre->est_feuille);{return(arbre->est_feuille);

}}

ptr_arbre cree_feuille (int val)ptr_arbre cree_feuille (int val)

{ptr_arbre arbre;{ptr_arbre arbre;

arbre = (ptr_arbre)malloc(sizeof(t_arbre));arbre = (ptr_arbre)malloc(sizeof(t_arbre));

arbre->est_feuille = 1;arbre->est_feuille = 1;

arbre->valeur = val;arbre->valeur = val;

return(arbre);return(arbre);

}}

C’est précisément un champ quiC’est précisément un champ qui mémorise si c’est une feuille.mémorise si c’est une feuille.

8 novembre 20068 novembre 2006 Cours d'algorithmique 2 - IntranetCours d'algorithmique 2 - Intranet 111111

Les arbres en langage CLes arbres en langage C----------------------------------------------------------------------------------------------------------------------------------

int est_feuille (ptr_arbre arbre)int est_feuille (ptr_arbre arbre)

{return(arbre->est_feuille);{return(arbre->est_feuille);

}}

ptr_arbre cree_feuille (int val)ptr_arbre cree_feuille (int val)

{ptr_arbre arbre;{ptr_arbre arbre;

arbre = (ptr_arbre)malloc(sizeof(t_arbre));arbre = (ptr_arbre)malloc(sizeof(t_arbre));

arbre->est_feuille = 1;arbre->est_feuille = 1;

arbre->valeur = val;arbre->valeur = val;

return(arbre);return(arbre);

}}

L’allocation de la mémoire.L’allocation de la mémoire.

Définition des champs concernés.Définition des champs concernés.

8 novembre 20068 novembre 2006 Cours d'algorithmique 2 - IntranetCours d'algorithmique 2 - Intranet 112112

Les arbres en langage CLes arbres en langage C----------------------------------------------------------------------------------------------------------------------------------

ptr_arbre cree_noeud (ptr_arbre fg, ptr_arbre fd, char ptr_arbre cree_noeud (ptr_arbre fg, ptr_arbre fd, char symbole)symbole)

{ptr_arbre arbre;{ptr_arbre arbre;

arbre = (ptr_arbre)malloc(sizeof(t_arbre));arbre = (ptr_arbre)malloc(sizeof(t_arbre));

arbre->est_feuille = 0;arbre->est_feuille = 0;

arbre->etiq = symbole;arbre->etiq = symbole;

arbre->fg = fg;arbre->fg = fg;

arbre->fd = fd;arbre->fd = fd;

return(arbre);return(arbre);

}}

8 novembre 20068 novembre 2006 Cours d'algorithmique 2 - IntranetCours d'algorithmique 2 - Intranet 113113

Les arbres en langage CLes arbres en langage C----------------------------------------------------------------------------------------------------------------------------------

ptr_arbre cree_noeud (ptr_arbre fg, ptr_arbre fd, char ptr_arbre cree_noeud (ptr_arbre fg, ptr_arbre fd, char symbole)symbole)

{ptr_arbre arbre;{ptr_arbre arbre;

arbre = (ptr_arbre)malloc(sizeof(t_arbre));arbre = (ptr_arbre)malloc(sizeof(t_arbre));

arbre->est_feuille = 0;arbre->est_feuille = 0;

arbre->etiq = symbole;arbre->etiq = symbole;

arbre->fg = fg;arbre->fg = fg;

arbre->fd = fd;arbre->fd = fd;

return(arbre);return(arbre);

}}

L’allocation de la mémoire.L’allocation de la mémoire.

Définition des champs concernés.Définition des champs concernés.

8 novembre 20068 novembre 2006 Cours d'algorithmique 2 - IntranetCours d'algorithmique 2 - Intranet 114114

Les arbres en langage CLes arbres en langage C----------------------------------------------------------------------------------------------------------------------------------

ptr_arbre fils_gauche (ptr_arbre arbre)ptr_arbre fils_gauche (ptr_arbre arbre)

{assert( !est_feuille(arbre) );{assert( !est_feuille(arbre) );

return(arbre->fg);return(arbre->fg);

}}

ptr_arbre fils_droit (ptr_arbre arbre)ptr_arbre fils_droit (ptr_arbre arbre)

{assert( !est_feuille(arbre) );{assert( !est_feuille(arbre) );

return(arbre->fd);return(arbre->fd);

}}

8 novembre 20068 novembre 2006 Cours d'algorithmique 2 - IntranetCours d'algorithmique 2 - Intranet 115115

Les arbres en langage CLes arbres en langage C----------------------------------------------------------------------------------------------------------------------------------

ptr_arbre fils_gauche (ptr_arbre arbre)ptr_arbre fils_gauche (ptr_arbre arbre)

{{assert( !est_feuille(arbre) );assert( !est_feuille(arbre) );

return(arbre->fg);return(arbre->fg);

}}

ptr_arbre fils_droit (ptr_arbre arbre)ptr_arbre fils_droit (ptr_arbre arbre)

{{assert( !est_feuille(arbre) );assert( !est_feuille(arbre) );

return(arbre->fd);return(arbre->fd);

}}

Vérification que l’arbre estVérification que l’arbre estbien un nœud interne.bien un nœud interne.

Retour du résultat demandé.Retour du résultat demandé.

8 novembre 20068 novembre 2006 Cours d'algorithmique 2 - IntranetCours d'algorithmique 2 - Intranet 116116

Listes, arbres et le pointeur NULLListes, arbres et le pointeur NULL----------------------------------------------------------------------------------------------------------------------------------

• Une liste peut être vide !Une liste peut être vide !

• Elle sera représentée par le pointeur NULL !Elle sera représentée par le pointeur NULL !

• La raison profonde est le fait que l’opération de base est :La raison profonde est le fait que l’opération de base est :– la concaténation,la concaténation,– qui est associativequi est associative– et possède la liste vide comme élément neutre !et possède la liste vide comme élément neutre !

8 novembre 20068 novembre 2006 Cours d'algorithmique 2 - IntranetCours d'algorithmique 2 - Intranet 117117

Listes, arbres et le pointeur NULLListes, arbres et le pointeur NULL----------------------------------------------------------------------------------------------------------------------------------

• Une liste peut être vide !Une liste peut être vide !

• Elle sera représentée par le pointeur NULL !Elle sera représentée par le pointeur NULL !

• La raison profonde est le fait que l’opération de base est :La raison profonde est le fait que l’opération de base est :– la concaténation,la concaténation,– qui est associativequi est associative– et possède la liste vide comme élément neutre !et possède la liste vide comme élément neutre !

• Nous avons les fonctions suivantes :Nous avons les fonctions suivantes :

– cree_videcree_vide– ajout_listeajout_liste– est_videest_vide– tete_listetete_liste– queue_listequeue_liste

8 novembre 20068 novembre 2006 Cours d'algorithmique 2 - IntranetCours d'algorithmique 2 - Intranet 118118

Listes, arbres et le pointeur NULLListes, arbres et le pointeur NULL----------------------------------------------------------------------------------------------------------------------------------

• Un arbre n’est jamais NULL !Un arbre n’est jamais NULL !

• C’est juste le programmeur qui l’est ! ! !C’est juste le programmeur qui l’est ! ! !

• La raison profonde est le fait que l’opération de base est :La raison profonde est le fait que l’opération de base est :– la construction d’arbre,la construction d’arbre,– qui n’est pas associativequi n’est pas associative– et la question de l’élément neutre ne se pose même pas !et la question de l’élément neutre ne se pose même pas !

8 novembre 20068 novembre 2006 Cours d'algorithmique 2 - IntranetCours d'algorithmique 2 - Intranet 119119

Listes, arbres et le pointeur NULLListes, arbres et le pointeur NULL----------------------------------------------------------------------------------------------------------------------------------

• Un arbre n’est jamais NULL !Un arbre n’est jamais NULL !

• C’est juste le programmeur qui l’est ! ! !C’est juste le programmeur qui l’est ! ! !

• La raison profonde est le fait que l’opération de base est :La raison profonde est le fait que l’opération de base est :– la construction d’arbre,la construction d’arbre,– qui n’est pas associativequi n’est pas associative– et la question de l’élément neutre ne se pose même pas !et la question de l’élément neutre ne se pose même pas !

Arbre ( A , Arbre ( B , C ) ) Arbre ( A , Arbre ( B , C ) ) == Arbre ( Arbre ( A , B ) , C )Arbre ( Arbre ( A , B ) , C )//

AA

BB CC

CC

AA BB

8 novembre 20068 novembre 2006 Cours d'algorithmique 2 - IntranetCours d'algorithmique 2 - Intranet 120120

Listes, arbres et le pointeur NULLListes, arbres et le pointeur NULL----------------------------------------------------------------------------------------------------------------------------------

• Un arbre n’est jamais NULL !Un arbre n’est jamais NULL !

• C’est juste le programmeur qui l’est ! ! !C’est juste le programmeur qui l’est ! ! !

• La raison profonde est le fait que l’opération de base est :La raison profonde est le fait que l’opération de base est :– la construction d’arbre,la construction d’arbre,– qui n’est pas associativequi n’est pas associative– et la question de l’élément neutre ne se pose même pas !et la question de l’élément neutre ne se pose même pas !

• Nous avons les fonctions suivantes :Nous avons les fonctions suivantes :

– cree_feuillecree_feuille– cree_noeudcree_noeud– est_feuilleest_feuille– fils_gauchefils_gauche– fils_droitfils_droit

8 novembre 20068 novembre 2006 Cours d'algorithmique 2 - IntranetCours d'algorithmique 2 - Intranet 121121

Listes, arbres et le pointeur NULLListes, arbres et le pointeur NULL----------------------------------------------------------------------------------------------------------------------------------

• Un arbre n’est jamais NULL !Un arbre n’est jamais NULL !

• C’est juste le programmeur qui l’est ! ! !C’est juste le programmeur qui l’est ! ! !

• La raison profonde est le fait que l’opération de base est :La raison profonde est le fait que l’opération de base est :– la construction d’arbre,la construction d’arbre,– qui n’est pas associativequi n’est pas associative– et la question de l’élément neutre ne se pose même pas !et la question de l’élément neutre ne se pose même pas !

• Nous avons les fonctions suivantes :Nous avons les fonctions suivantes :

– cree_feuillecree_feuille– cree_noeudcree_noeud– est_feuilleest_feuille– fils_gauchefils_gauche– fils_droitfils_droit

8 novembre 20068 novembre 2006 Cours d'algorithmique 2 - IntranetCours d'algorithmique 2 - Intranet 122122

Listes, arbres et le pointeur NULLListes, arbres et le pointeur NULL----------------------------------------------------------------------------------------------------------------------------------

• Je peux éventuellement écrire ceci :Je peux éventuellement écrire ceci :

typedef struct moi_memetypedef struct moi_meme

{ struct moi_meme fg , fd ; } . . .{ struct moi_meme fg , fd ; } . . .

ptr_arbre cree_feuille (int valeur)ptr_arbre cree_feuille (int valeur)

{{ptr_arbre arbre;ptr_arbre arbre;

arbre = (ptr_arbre)malloc(sizeof(t_arbre));arbre = (ptr_arbre)malloc(sizeof(t_arbre));

arbre->fg = NULL ;arbre->fg = NULL ;

arbre->fd = (int *) valeur ;arbre->fd = (int *) valeur ;

return ( arbre ) ;return ( arbre ) ;

}}

8 novembre 20068 novembre 2006 Cours d'algorithmique 2 - IntranetCours d'algorithmique 2 - Intranet 123123

Listes, arbres et le pointeur NULLListes, arbres et le pointeur NULL----------------------------------------------------------------------------------------------------------------------------------

• Je peux éventuellement écrire ceci :Je peux éventuellement écrire ceci :

typedef struct moi_memetypedef struct moi_meme

{ struct moi_meme fg , fd ; } . . .{ struct moi_meme fg , fd ; } . . .

ptr_arbre cree_feuille (int valeur)ptr_arbre cree_feuille (int valeur)

{{ptr_arbre arbre;ptr_arbre arbre;

arbre = (ptr_arbre)malloc(sizeof(t_arbre));arbre = (ptr_arbre)malloc(sizeof(t_arbre));

arbre->fg = NULL ;arbre->fg = NULL ;

arbre->fd = (int *) valeur ;arbre->fd = (int *) valeur ;

return ( arbre ) ;return ( arbre ) ;

}}

Nous utilisons le champ fgNous utilisons le champ fgpour indiquer que l’arbrepour indiquer que l’arbre

est une feuille,est une feuille,. . . et le fils droit pour. . . et le fils droit pourmémoriser sa valeur !mémoriser sa valeur !

8 novembre 20068 novembre 2006 Cours d'algorithmique 2 - IntranetCours d'algorithmique 2 - Intranet 124124

Listes, arbres et le pointeur NULLListes, arbres et le pointeur NULL----------------------------------------------------------------------------------------------------------------------------------

• Je peux éventuellement écrire ceci :Je peux éventuellement écrire ceci :

typedef struct moi_memetypedef struct moi_meme

{ struct moi_meme fg , fd ; } . . .{ struct moi_meme fg , fd ; } . . .

ptr_arbre cree_feuille (int valeur)ptr_arbre cree_feuille (int valeur)

{{ptr_arbre arbre;ptr_arbre arbre;

arbre = (ptr_arbre)malloc(sizeof(t_arbre));arbre = (ptr_arbre)malloc(sizeof(t_arbre));

arbre->fg = NULL ;arbre->fg = NULL ;

arbre->fd = (int *) valeur ;arbre->fd = (int *) valeur ;

return ( arbre ) ;return ( arbre ) ;

}}

Nous utilisons le champ fgNous utilisons le champ fgpour indiquer que l’arbrepour indiquer que l’arbre

est une feuille,est une feuille,. . . et le fils droit pour. . . et le fils droit pourmémoriser sa valeur !mémoriser sa valeur !

8 novembre 20068 novembre 2006 Cours d'algorithmique 2 - IntranetCours d'algorithmique 2 - Intranet 125125

SynthèseSynthèse----------------------------------------------------------------------------------------------------------------------------------

• Listes.Listes.

• Piles.Piles.

• Files.Files.

• Arbres.Arbres.

• Types de données abstraits.Types de données abstraits.

8 novembre 20068 novembre 2006 Cours d'algorithmique 2 - IntranetCours d'algorithmique 2 - Intranet 126126

m E r C i e Tm E r C i e Tb O n N e J o U r N é b O n N e J o U r N é

E ! ! !E ! ! !

n ‘ O u B l I e Z p A s D en ‘ O u B l I e Z p A s D ep R é P a R e R v O sp R é P a R e R v O s

T D ! ! !T D ! ! !

Recommended