Vous êtes sur la page 1sur 103

UNIVERSITE ABDELMALEK ESSAADI

FACULTE DES SCIENCES ET TECHNIQUES


TANGER

Dpartement de Gnie Informatique

Module : Algorithmes et Structures de donnes en C


Filire : MPIC Groupe : II-4
Encadr par :

Professeur Chakkor Saad


saadchakkor@gmail.com Anne Universitaire : 2011-2012
1 21/11/2012

Programme

2

Rappel gnral et mise niveau Tableaux Les fonctions Directives au pr processeur Type compos et structures Fichiers Pointeurs Rcursivit Listes chanes Arbres Tables de hachage Graphes
21/11/2012

Evaluation
Remarque !! : la prsence et la ralisation des Exos de TD & de TP & mini-projet seront pris en considration dans la note finale de module.

CC1 CC2 CC3 Examen de TP

Les tableaux

Un tableau reprsente selon ses dimensions, un vecteur ou une matrice d'lments d'un mme type. Un tableau est un ensemble fini d'lments de mme type, stocks en mmoire des adresses contigus.

21/11/2012

Les tableaux

Dclaration de tableaux en C : <TypeSimple> <NomTableau>[<Dimension>]; Les noms des tableaux sont des identificateurs

21/11/2012

Les tableaux
Les tableaux une dimension
Dclaration: type nom[dim];
Exemples: int compteur[10];

float nombre[20]; Utilisation: Un lment du tableau est repr par son indice. En langage C les tableaux commencent l'indice 0. L'indice maximum est donc dim-1. Appel: nom[indice] compteur[2] = 5; nombre[i] = 6.789; printf("%d",compteur[i]); scanf("%f",&nombre[i]);

Exemples:

Les tableaux
Les tableaux plusieurs dimensions:
Tableaux deux dimensions:
Dclaration: type nom[dim1][dim2]; Exemples: int compteur[4][5]; float nombre[2][10];

Utilisation: Un lment du tableau est repr par ses indices. En langage C les tableaux commencent aux indices 0. Les indices maximum sont donc dim1-1, dim2-1. Appel: nom[indice1][indice2] compteur[2][4] = 5; nombre[i][j] = 6.789; printf("%d",compteur[i][j]); scanf("%f",&nombre[i][j]);

Exemples:

Les tableaux
Initialisation des tableaux On peut initialiser les tableaux au moment de leur dclaration: Exemples: int liste[10] = {1,2,4,8,16,32,64,128,256,528}; float nombre[4] = {2.67,5.98,-8,0.09}; int x[2][3] = {{1,5,7},{8,4,3}}; /* 2 lignes et 3 colonnes * /

Les tableaux
Si la dimension n'est pas indique explicitement lors de l'initialisation, alors le compilateur rserve automatiquement le nombre d'octets ncessaires.
Exemples : int A[] = {10, 20, 30, 40, 50}; ==> rservation de 5*sizeof(int) octets (dans notre cas: 10 octets) float B[] = {-1.05, 3.33, 0.87, -12.3}; ==> rservation de 4*sizeof(float) octets (dans notre cas: 16 octets)

21/11/2012

Les tableaux
Affichage et affectation :
Ecrire un programme qui permet de saisir N valeurs entires dans un tableau puis de les afficher horizontalement.

Calculer et afficher la somme des lments de ce tableau.

10

21/11/2012

Les tableaux
Exercices sur les tableaux :
Exercice 1 : Ecrire un programme qui lit la dimension N d'un tableau T du type int (dimension maximale: 50 composantes), remplit le tableau par des valeurs entres au clavier et affiche le tableau. Effacer ensuite toutes les occurrences de la valeur 0 dans le tableau T et tasser les lments restants. Afficher le tableau rsultant.

11

21/11/2012

Les tableaux
Exercice 2 : Ecrire un programme qui lit la dimension N d'un tableau T du type int (dimension maximale: 50), remplit le tableau par des valeurs entres au clavier et affiche le tableau.

Ranger ensuite les lments du tableau T dans l'ordre inverse sans utiliser de tableau d'aide. Afficher le tableau rsultant.

12

21/11/2012

Les tableaux
Exercice 3 : Ecrire un programme qui lit la dimension N d'un tableau T du type int (dimension maximale: 50), remplit le tableau par des valeurs entres au clavier et affiche le tableau.

Copiez ensuite toutes les composantes strictement positives dans un deuxime tableau TPOS et toutes les valeurs strictement ngatives dans un troisime tableau TNEG. Afficher les tableaux TPOS et TNEG.

13

21/11/2012

Les tableaux
Exercice 4: Ecrire un programme qui permet dinsrer une valeur entre au clavier dans un tableau dentiers. Exercice 5: Rechercher dans un tableau d'entiers une valeur VAL entre au clavier. Afficher la position de VAL si elle se trouve dans le tableau, sinon afficher un message correspondant. La valeur POS qui est utilise pour mmoriser la position de la valeur dans le tableau, aura la valeur -1 aussi longtemps que VAL n'a pas t trouve.
14 21/11/2012

Les tableaux
Exercice 6 : Ecrire un programme qui permet de supprimer une valeur dun tableau dentiers en indiquant sa position dans ce tableau. Exercice 7 : Ecrire un programme qui permet de modifier une valeur dun tableau dentiers en indiquant sa position dans ce tableau.

15

21/11/2012

Les tableaux
Sujet de Travaux Pratiques N : 1 On se propose de raliser un rpertoire dadresses : un rpertoire est un ensemble dinformation dont chaque lment possde les informations suivantes : Contact : Nom*, Prnom*, Lien de parent, adresse, Tl.dom, Tl.entreprise, GSM*, email* Avec Adresse : Numro, Nom Rue, Code Postal, Ville, Pays.
Le lien de parent est un indice de la liste suivante : 0 : Mre 1 : Pre 2 : Sur
16

3 : Frre 4 : cousin 5 : Parent

6 : Ami 7 : Relation personnelle 8 : Relation professionnelle


21/11/2012

Les tableaux
Les informations indiques par * sont obligatoires 1) 2) 3) 4) 5) 6) 7) 8) 9) Fonctions programmer : Ajouter un contact Afficher la liste des contacts Consulter un contact Modifier un contact Supprimer un contact Recherche par Nom Recherche multicritre : Nom, Prnom, Ville, Amlioration : lajout doit vrifier si le contact existe dj.

17

21/11/2012

Les fichiers
Un fichier (file) est un ensemble structur de donnes stock en gnral sur un support externe (disque dur, disque optique, ...). Un fichier structur contient une suite d'enregistrements homognes, qui regroupent le plus souvent plusieurs composantes.

18

21/11/2012

Les fichiers
Oprations possibles avec les fichiers: Crer - Ouvrir - Fermer - Lire - Ecrire - Dtruire Renommer. La plupart des fonctions permettant la manipulation des fichiers sont ranges dans la bibliothque <STDIO.H>, certaines dans <IO.H>. Dclaration: FILE *fichier; /* majuscules obligatoires pour FILE */ La dclaration des fichiers doit figurer AVANT la dclaration des autres variables.
19 21/11/2012

Les fichiers
Ouverture: FILE *fopen(char *nom, char *mode); FILE *fopen(filename, mode) /* dclaration dans stdio.h */ char filename[], mode[]; On passe donc 2 chanes de caractres nom: celui figurant sur le disque, exemple: C :\test.dat
20 21/11/2012

Les fichiers
fopen a pour argument deux chanes de caractres, le nom du fichier et le mode d'ouverture. donne comme rsultat un pointeur NULL si l'ouverture a chou sinon le pointeur renvoy est utilis dans les critures, les lectures et les dplacements ultrieurs.

Les fichiers
Mode (pour les fichiers TEXTES) : r : lecture seule w : criture seule (destruction de l'ancienne version si elle existe) w+ : lecture/criture (destruction ancienne version si elle existe) r+ : lecture/criture d'un fichier existant (mise jour), pas de cration d'une nouvelle version. a+ : lecture/criture d'un fichier existant (mise jour), pas de cration d'une nouvelle version, le pointeur est positionn la fin du fichier.
22 21/11/2012

Les fichiers
Mode (pour les fichiers BINAIRES) : On ajoute b devant les modes quon a vu : rb wb

Exemple : FILE *fichier ; fichier = fopen( C:\test.dat, rb ) ;

23

21/11/2012

Les fichiers
#include <stdio.h> /* Inclusion de la biblio standard */ int main() { /* Dclaration d'un fichier */ FILE* fichier; /* Ouverture du fichier test en lecture */ fichier = fopen("/home/users/manouvrier/test","r"); /* Test de l'ouverture pour vrifier les ventuels problmes */ if (fichier== NULL) /* Il y a eu un problme */ { /* Affichage d'un message d'erreur */ printf("Erreur ouverture fichier "); } /* Si l'ouverture a pu se faire */ else ... }
24 21/11/2012

Les fichiers
Fermeture: Int fclose(FILE *fichier); Retourne 0 si la fermeture sest bien passe, EOF en cas derreur. Il faut toujours fermer un fichier la fin d'une session. mode (pour les fichiers TEXTE) : Exemple : FILE *fichier ;
25

fichier = fopen( C:\test.dat , rb ) ; /* Ici instructions de traitement */ fclose(fichier) ;


21/11/2012

Les fichiers
Destruction: int remove(char *nom); Retourne 0 si la fermeture sest bien passe. Exemple : remove( C:\test.dat ) ; Renommer: int rename(char *oldname, char *newname); Retourne 0 si la fermeture sest bien passe.
26 21/11/2012

Les fichiers
Positionnement du pointeur au dbut du fichier : void rewind(FILE *fichier);
int feof(FILE *id) dit si on est en fin de fichier ou non (0).

Rcupration de la position du curseur dans le fichier : int ftell (FILE * fichier) ; Exemple :

27

#include <stdio.h> FILE* fichier; int pos; ... pos=ftell(fichier);


21/11/2012

Les fichiers
Ecriture dans le fichier texte: int putc(char c, FILE *fichier); Ecrit la valeur de c la position courante du pointeur , le pointeur avance d'une case mmoire. Retourne EOF qui marque la fin de fichier, en cas derreur. Exemple : putc(A, fichier) ;

28

21/11/2012

Les fichiers
int putw(int n, FILE *fichier); le pointeur avance du nombre de cases correspondant la taille d'un entier (4 cases). Retourne n si lcriture sest bien passe. int fputs(char *chane, FILE *fichier); le pointeur avance de la longueur de la chaine ('\0' n'est pas rang dans le fichier). signifie "met une chane dans un fichier" Retourne EOF en cas derreur. Exemple : fputs( BONJOUR ! , fichier) ;
29 21/11/2012

Les fichiers
fputc : ce qui signifie "met un caractre dans un fichier". Comme son nom l'indique, cette fonction crit un octet dans un fichier. Exemple : char erreur; erreur = fputc('x', Pointeur_sur_fichier); putc putc(caractre, pointeur_sur_fichier) crit le caractre dans un fichier la position pointeur_sur_fichier (et renvoie le caractre).

Les fichiers
Ecriture dans le fichier binaire:
int fwrite(void *p,int taille_bloc,int nb_bloc,FILE *fichier);

p crit partir de la position courante du pointeur fichier nb_bloc X taille_bloc octets lus partir de l'adresse p. Retourne le nombre de blocs crits. Exemple : taille_bloc=4 (taille d'un entier en C), nb_bloc=3, criture de 3 octets. int tab[10] ; fwrite(tab,4,3,fichier) ;
31 21/11/2012

Les fichiers
fwrite : crit dans un fichier des objets d'un type quelconque. Il faut prciser la taille d'un objet (par exemple avec sizeof(objet)), le nombre d'objets crire et le pointeur du fichier destination. la fonction renvoie le nombre d'lments effectivement crits.

Les fichiers
int fprintf(FILE *fichier, char *format, liste d'expressions);

rserve plutt aux fichiers ASCII. Retourne EOF en cas derreur. Exemples: fprintf(fichier,"%s","il fait beau"); fprintf(fichier,%d,n); fprintf(fichier,"%s%d","il fait beau",n);

33

21/11/2012

Les fichiers
getc getc(pointeur_sur_fichier) renvoie le caractre lu dans un fichier l'endroit point par le pointeur_sur_fichier et incrmente ce pointeur, ou renvoie EOF si on est la fin du fichier.

Les fichiers
Exemple : copier un fichier dans un autre
void main(int argc, char *argv[] ) /* copier le fichier en premier argument dans le fichier en 2me argument */ { FILE *fopen(), *pf1, *pf2 ; int c ; if (argc <= 2) printf(" deux arguments SVP...") ; else { pf1 = fopen(argv[1] , "r") ; /* uverture du premier fichier en lecture */ pf2 = fopen(argv[2] , "w") ; /* ouverture du deuxime fichier en criture */ while ( (c = getc(pf1)) != EOF ) putc(c, pf2) ; fclose(pf1) ; fclose(pf2) ; } }

Les fichiers
Lecture dans un fichier : fscanf : lecture analogue scanf. Syntaxe : Nb_lu = fscanf(Pointeur_sur_fichier, format, liste de pointeurs); Nb_lu est le nombre d'arguments lus et accepts. Exemple : Nb_lu = fscanf(Pointeur_sur_fichier, "%s", Chane);

Les fichiers
Dans un fichier texte fgetc : ce qui signifie "prend un caractre dans un fichier". Exemple : int caractere; caractere = fgetc(Pointeur_sur_fichier);

Les fichiers
fgets : ce qui signifie "prend une chane dans un fichier". Lit un certain nombre de caractres dans un fichier et les met dans une chane en ajoutant le caractre nul la fin. Exemple : fgets(Chaine, 10, Pointeur_sur_fichier); Lit 10 caractres dans le fichier et les crits dans Chaine. Un dernier caractre nul est ajout. Si une fin de ligne (EOL) est rencontre avant le dixime caractre lu, seuls les caractres avant la fin de ligne seront lus et ils seront suivis dans la chane par EOL et NULL

Les fichiers
Dans un fichier binaire Syntaxe : Nb_lu = fread(pointeur_sur_tableau, taille_element, nb_elements, fichier); Nb_lu est gal nb_elements si l'criture s'est passe correctement.

Les fichiers
Exemple: #include <stdio.h> FILE *Pointeur_sur_fichier; fopen("C:\FSTT\essai.dat", "wb"); int tableau[5]; nb = fread(tableau, sizeof(int), 3, Pointeur_sur_fichier); Lit des nombres entiers et les range dans les trois premires cellules du tableau ; nb a pour valeur le nombre d'lments crits, 3 si tout s'est bien pass.

Les fichiers
Exercice 1: Ecrire un programme qui permet de crer un fichier dtudiants. Exercice 2 : Ecrire une procdure qui permet de modifier les informations dun tudiant.

Les piles
Une pile est un type de donnes abstrait bas sur le modle de donnes liste, dans lequel les oprations sont ralises une extrmit de la liste, appel sommet de la pile. Le terme LIFO (Last-In-First-out) est synonyme de pile.

Les piles
Les oprations sur une pile : Empiler(p) : ajout dun lment au sommet de la pile. Dpiler() : enlve un lment de la pile, retourne le sommet de la pile. EstVide(P) retourne vrai si P est vide.
Empiler Dpiler

Les piles
Une pile peut tre reprsente sous forme d'un tableau : 3 sommet de la pile 4 5 6 7 8

Les piles
Empiler :

Dpiler :

Les piles
Implantation dune pile par un tableau : Dclaration : #define maxpile 100 Typedef struct { Int tableau[maxpile] ; Int sommet ; } pile ;

Les piles
Initialisation : Pile initialiser() { Pile p ; p.sommet=0 ; return p ; }

Les piles
Empiler : Void empiler(pile *p,int x) { p.tableau[p.sommet]=x ; p.sommet+ +; }

Les piles
Dpiler : Int Dpiler(pile p) { int x=p.tableau[p.sommet] ; p.sommet-- ; return x ; } Remarque : les piles peuvent tre implmentes par des listes.

Les piles
Exercice :
Amliorer la fonction empiler pour quelle affiche un message derreur si le sommet dpasse la taille maximum de la pile. Ecrire une fonction menu() dont la structure est la suivante : Printf_______menu principal__________\n Printf( Printf( Printf( Printf( empiler _____________ e\n) ; dpiler _____________ d\n) ; afficher _____________ a\n) ; Quitter _____________ Q\n) ;

Ecrire la fonction qui fait appel ces fonctions. Rcrire les fonctions en utilisant le formalisme pointeur.

Les listes
Dfinitions : Une liste est une squence finie de zro, un, ou plusieurs lments d'un type donn. Si les lments sont de type E, on dit que le type de la liste est "liste de E' : listes d'entiers, des listes de nombres rels, des listes de structures, etc. Une liste est souvent crite comme une squence d'lments spars par des virgules et entoure par des parenthses : (a1,a2, ...an) o les ai sont les lments de la liste.

Les listes
Longueur d'une liste : La longueur d'une liste est le nombre d'lments (mme les doublons) dans la liste. Si le nombre d'occurrences est zro, on dit que la liste est vide. EXEMPLES : L = (a,b,t,y,a,u) de longueur 6. L = (1,2,3,6) de longueur 4

Les listes
Parties d'une liste : Si la liste n'est pas vide, alors elle comprend un premier lment, appel la tte. Le reste de la liste est appel la queue. Si L=(a1,a2, ...an) est une liste, alors pour tous i et j tels que 1 i j n, (ai,ai+1, ...aj) est une sous-liste de L.

Les listes
Position d'un lment :
A chaque lment de la liste est associ une position. Si (a1,a2, ...an) est une liste et n 1, alors on dit que a1 est le premier lment de la liste, a2 le second, et ainsi de suite, an tant le dernier. On dit que ai est de position i. De plus, on dit que ai suit ai-1 et prcde ai+1. Une position contenant l'lment a est une occurrence de a. Le nombre de positions dans une liste est gal sa longueur. Il est possible qu'un mme lment apparaisse plusieurs positions. Il ne faut donc pas confondre position et lment de la liste.

Les listes
Oprations sur les listes : a) Insertion : On peut insrer un lment x la position i d'une liste L. Cette action consiste placer x dans la liste L la ime place, et de dcaler les lments de la liste partir de la position i d'une position dans la liste (le ime lment devient le ime+1, etc.).

Les listes
EXEMPLE : L=(2,3,4,2,6,7) 1 - Insertion de l'lment 7 la position 3. L=(2,3,7,4,2,6,7) 2 - Insertion de l'lment 1 la position 1. L=(1,2,3,7,4,2,6,7) 3 - Insertion de l'lment 7 la fin de la liste. L=(1,2,3,7,4,2,6,7,7)

Les listes
b) Suppression : supprimer l'occurrence de position i d'une liste, signifie que l'lment de position i dans la liste va tre enlev de la liste. Il est galement possible de supprimer un lment x de la liste : Cette opration consiste supprimer toutes les occurrences x apparaissant dans la liste. Si x n'est pas dans la liste, la suppression est sans effet.

Les listes
EXEMPLE : L=(1,2,3,7,4,2,6,7,7) 1 - Suppression de l'occurrence de position 2. L=(1,3,7,4,2,6,7,7) 2 - Suppression de l'lment 7. L=(1,3,4,2,6) 3 - Suppression de l'lment 5. L=(1,3,4,2,6)

Les listes
c) Recherche : La recherche d'un lment x dans une liste est une opration qui retourne VRAI ou FAUX en fonction de la prsence ou non de l'lment x dans la liste. Cette opration peut galement retourner la position du premier lment d'occurrence x rencontr dans la liste, et 0 si l'lment n'existe pas dans la liste.

Les listes
d) Concatnation : On concatne deux liste L et M en formant une liste commenant par les lments de L et se poursuivant avec les lments de M. EXEMPLE : L=(5,6,7,89) M=(3,5,6,7,8,9,0,23,4) La liste rsultat de la concatnation de L et M est : (5,6,7,89,3,5,6,7,8,9,0,23,4) On peut concatner plus de deux listes.

Les listes
e) Autres oprations: L'opration first retourne le premier lment de la liste. Le type retour de first est un lment de la liste. EXEMPLE : L=(5,6,7,89) first(L)=5

L'opration last retourne la queue de la liste. Le type retour de last est une liste. EXEMPLE : L=(5,6,7,89) last(L)=(6,7,89)

Ces deux oprations provoquent une erreur si la liste est vide. Il est possible de les combiner. EXEMPLE : L=(5,6,7,89) first(last(L))=6

Les listes
Une manire d'implanter une liste en C est d'utiliser un tableau pour stocker les lments. Il est possible de maintenir un compteur du nombre d'lments de la liste dans une variable spare, et de stocker les lments dans des emplacements contigus du tableau. Ce type dimplantation nest pas pratique utiliser pour insrer ou supprimer des lments dans la liste. Il faut chaque fois dcaler tous les lments du tableau.

chan es Les listes cha nes


Une liste chane est une structure qui permet de grer un ensemble d'objet en les chanant les uns aux autres. L'adresse du premier lment appel tte de la liste permet d'accder au premier lment. Chaque lment est ensuite chan au suivant par un pointeur. Le dernier lment est associ un pointeur contenant la valeur NULL, il est appel queue de la liste.

chan es Les listes cha nes


Chaque lment de la liste chane est compos de deux informations. La valeur de llment. Un pointeur vers l'lment suivant Il n'existe pas de structure prdfinie dans C pour grer une liste. Il est donc ncessaire de la construire partir d'autres lments: les types structurs et les pointeurs.

chan es Les listes cha nes


Pointeurs dune liste chane :

chan es Les listes cha nes


Dclaration dune structure liste : Typedef struct element *PElement; Typedef struct element { PElement suivant; /* informations spcifiques lapplication*/ } Element; Le type Element est une structure contenant au moins un pointeur sur un autre lment.

chan es Les listes cha nes


Typedef struct { PElement premier; PElement dernier; PElement courant; } liste;

chan es Les listes cha nes


Oprations usuelles sur les listes : Initialisation : Void initialiser(liste *L) { L->premier=NULL; L->dernier=NULL; L->courant=NULL; }

chan es Les listes cha nes


Test si vide : Booleen listevide(liste *L) { Return L->premier==NULL; }

chan es Les listes cha nes


Insertion dun lment : L'insertion d'un lment dans une liste chane, peut se faire aprs l'lment courant de la liste. Trois cas se prsentent alors : La liste est vide : dans ce cas, les pointeurs premier, courant et dernier pointent, aprs insertion de l'lment X, sur X.

chan es Les listes cha nes


La liste est non vide, et l'lment courant est un lment interne la liste (courant ne pointe pas sur le dernier lment de la liste). Aprs insertion de l'lment X, l'lment suivant de X sera le suivant de l'lment courant (point par courant), l'lment suivant de l'lment courant sera X, et l'lment courant sera X.

chan es Les listes cha nes


3 oprations effectuer :

Remarque : Lordre des oprations est important !!!

chan es Les listes cha nes


La liste est non vide, et l'lment courant est le dernier lment. Aprs insertion de l'lment X, le suivant du dernier lment sera X, l'lment suivant de X sera nul, et le dernier lment, ainsi que l'lment courant seront X.

chan es Les listes cha nes


3 oprations effectuer :

Remarque : Lordre des oprations est important !!!

chan es Les listes cha nes


Ajout en tte de liste : Void insererentete(liste *L, PElement Nouveau) { Nouveau->suivant=L->premier; L->premier=Nouveau; If(L->dernier==NULL) L->dernier=Nouveau; }

chan es Les listes cha nes


Ajout aprs llment prcdent :
Void insererapres(liste *L, PElement Nouveau, PElement precedent) { If(precedent ==NULL) { insererentete(L,Nouveau); } Else { Nouveau->suivant=precedent->suivant; precedent->suivant=Nouveau; If(precedent==L->dernier) } } L->dernier=Nouveau;

chan es Les listes cha nes


Ajout en fin de liste : Void insererenfin(liste *L, PElement Nouveau) { Insererapres(L,L->dernier,Nouveau); }

chan es Les listes cha nes


Retrait dun lment de la liste : Retrait en tte dun lment : Retirer llment en tte de la liste pointe par L. PElement extraireentete(liste *L) { PElement extrait; extrait =L->premier; If(!listevide(L)) { L->premier= L->premier->suivant; If(L->premier==NULL) L->dernier=NULL; } Return extrait; }

chan es Les listes cha nes


Retrait suivant prcdent :
PElement extraireapres(Liste *L, PElement precedent) { PElement extrait; If(precedent == NULL) { extrait =extraireentete(L); } else { extrait= precedent->suivant; If(extrait!=NULL) { precedent->suivant=extrait->suivant; If(extrait==L->dernier) L->dernier=precedent; } } Return extrait; }

chan es Les listes cha nes


Retrait en fin :
PElement extraireenfin(Liste *L) { PElement extrait,ptc; If(listevide(L)) { Extrait=NULL; } else if(L->premier==L->dernier) { Extrait=L->premier; L->premier=NULL; L->dernier=NULL; } else { Ptc=L->premier; While(ptc->suivant !=L->dernier) /* extrait = extraireapres(L,ptc) */ Extrait= ptc->suivant; ptc->suivant=NULL; L->dernier=ptc; } return extrait; } ptc->ptc->suivant; /* un seul lment */ /* pointeur courant */

chan es Les listes cha nes


Parcours de liste : Fonction ouvrirliste() permet de se positionner sur le premier lment de la liste : Void ouvrirliste(liste *L) { L->courant=L->premier; } Fonction boolenne finliste() permet de savoir si on a atteint la fin de la liste ouverte : Booleen finliste(liste *L) { Return L->courant==NULL; }

chan es Les listes cha nes


Fonction elementcourant() fournit un pointeur sur llment courant de la liste et se positionne sur llment suivant qui devient llment courant : PElement elementcourant() { PElement ptc; Ptc=L->courant; If(L->courant !=NULL) { L->courant=L->courant->suivant; } Return ptc; }

chan es Les listes cha nes


Destruction de liste : Il faut faire un parcours de liste avec destruction de chaque lment. La tte de liste est rinitialiser. Il faut se positionner en dbut de liste tant quon na pas atteint la fin de la liste, il prendre llment courant et le dtruire. Le pointeur sur le prochain lment est conserv dans le champs courant de la tte de liste.

chan es Les listes cha nes


Void detruireliste(liste *L) { PElement ptc; Ouvrirliste(L); While(!finliste(L)) { Ptc=elementcourant(L); Free(ptc); } Initialiser(L); }

chan es Les listes cha nes


Recopie de liste : Transfert la liste L2 dans la liste L1 en rinitialisant L2. Void recopieliste(liste *L1,liste *L2) { Detruireliste(L1); *L1=*L2; Initialiser(L2); }

chan es Les listes cha nes


Exercice dapplication 1 : On se propose de grer une liste de personnes avec un programme interactif utilisant un menu et le formalisme liste :
1- Insertion en tte de liste. 2- Insertion en fin de liste. 3- Retrait en tte de liste. 4- Retrait en fin de liste. 5- Parcours de liste. 6- Recherche dans la liste. 0- Quitter.

chan es Les listes cha nes


Exercice dapplication 2 : On se propose de mmoriser des polynmes dune variable relle et de raliser des oprations sur ces polynmes avec un programme interactif utilisant un menu et le formalisme liste : 1- Insertion en tte de liste. 7- Insertion ordre croissant 2- Insertion en fin de liste. 8- Insertion ordre dcroissant 3- Retrait en tte de liste. 4- Retrait en fin de liste. 5- Parcours. 6- Recherche dans la liste. 0- Quitter. 9- Valeur P(X) = ?

chan es Les listes cha nes


Exercice dapplication 2 : La reprsentation dun monme est vue comme suit : Exemple : P(X) = 3X5+2X3+1
Coefficient Exposant
Pointeur vers le monme suivant

P(X)

chan es Les listes cha nes


Exercice dapplication 3 : Implmenter en C une pile en se basant sur une liste chane ? Oprations sur une pile : Empiler : ajouter un lment en tte de la liste. Dpiler : enlever un lment en tte de la liste.

Les files
Dfinition : Une file dattente est une structure de donnes telle que : Lajout dun lment se fait en fin de file dattente. La suppression dun lment se fait en dbut de file dattente. Cette structure de donnes est appele aussi FIFO : First in First out.

Les files
Oprations sur une file : Enfiler : ajouter un lment en fin de la liste. Dfiler : enlever un lment en tte de la liste. Implmenter en C une file en se basant sur une liste chane ?

chan e Liste doublement cha ne


Une liste doublement chane(appele aussi symtrique) est une liste telle que chaque lment pointe sur llment suivant et sur llment prcdent.

92

21/11/2012

chan e Liste doublement cha ne


Lintrt majeur des listes symtriques rside dans le fait quil est facile dextraire un lment partir dun pointeur sur llment extraire. Il ny a pas besoin de parcourir la liste pour retrouver le prcdent. La liste symtrique peut se trouver en mmoire centrale ou en mmoire secondaire (fichier en accs direct).

chan e Liste doublement cha ne


Chaque lment de la liste contient un pointeur sur lobjet de la liste, un pointeur sur llment suivant comme pour les listes simples, et un pointeur sur llment precedent. Un pointeur sur le premier et un pointeur sur le dernier lment de la liste symtrique. On peut parcourir la liste dans les deux sens.

94

21/11/2012

chan e Liste doublement cha ne


La fonction void extraireListeSym (ListeS* ls, Element* extrait) ; extrait llment point par extrait de la liste symtrique ls. Dans le cas gnral o llment extraire se trouve entre deux autres lments (donc pas en dbut ou fin de liste), on peut facilement dfinir un pointeur sur le prcdent et un pointeur sur le suivant comme lindique la Figure, et en consquence, modifier le pointeur precedent du suivant et le pointeur suivant du prcdent.
95 21/11/2012

chan e Liste doublement cha ne

96

21/11/2012

chan e Liste doublement cha ne


void insererEnFinDeListeSym (ListeS* ls, PElement nouveau) {
nouveau->suivant = NULL; if (listeVide(ls)) { ls->premier = nouveau; } else { nouveau->precedent = ls->dernier; ls->dernier->suivant = nouveau; }
97

// liste symtrique vide

nouveau->precedent = NULL;

ls->dernier = nouveau; }

21/11/2012

chan e Liste doublement cha ne


void extraireListeSym (ListeS* ls, PElement* extrait) { if ( (ls->premier==extrait) && (ls->dernier==extrait) ) { // suppression de l'unique lment de ls ls->premier = NULL; ls->dernier = NULL; }

98

21/11/2012

chan e Liste doublement cha ne


else if (ls->premier == extrait) { // suppression du premier de la liste ls ls->premier->suivant->precedent = NULL; ls->premier = ls->premier->suivant; }

99

21/11/2012

chan e Liste doublement cha ne


else if (ls->dernier == extrait) { // suppression du dernier de la liste ls ls->dernier->precedent->suivant = NULL; ls->dernier = ls->dernier->precedent; }

100

21/11/2012

chan e Liste doublement cha ne


else { // suppression de extrait entre 2 lments non nuls extrait->suivant->precedent = extrait->precedent; extrait->precedent->suivant = extrait->suivant; } }

101

21/11/2012

chan e Liste doublement cha ne


void extraireElement (ListeS* ls, float objet) { PElement* element = chercherElement (ls, objet); if (element != NULL) extraireListeSym (ls, element); }

102

21/11/2012

chan e Liste doublement cha ne


Exercice dapplication : Raliser un programme de gestion dune liste symtrique de relles ?

103

21/11/2012

Vous aimerez peut-être aussi