Académique Documents
Professionnel Documents
Culture Documents
DONNEES LINEAIRES
Préparé par
Diomède NZISABIRA
ISCAM 2021
I. Rappel sur les structures
II. Listes
1. Les listes simplement chaînées ;
2. Les listes doublement chaînées.
III. Les piles
IV. Les files
Avec :
Exemple :
Définir une structure appelée Point et caractérisée
par : une abscisse, abs, et une ordonnée, ord, toutes
les deux de type entier.
Struct Point
{
1
int abs ;
int ord ;
};
Struct Point A ;
2
Struct Point A, P ;
Struct Point P ;
Struct Point
{
int abs ;
int ord ;
} A,P;
Afin d’alléger les notations, il peut être nécessaire de
créer des synonymes. Pour ce faire, on utilise le mot
clé typedef.
};
point A,B ;
akaburungu A,B ;
Exercices
NB :
On écrira simplement les instructions pour
définir le point et déclarer trois points.
10
Exemples :
11
PointColore Q ;
Q.Abs=P.Abs ;
Q.Ord=P.Ord ;
Strcpy(Q.T,P.T) ;
PointColore* ptr ;
ptr= &P ; /*Après cette instruction ptr pointe sur
P*/
12
Rmq :
ptr Abs =18 ; Cette instruction permet de mettre
la valeur 18 dans le champ Abs du point pointé par
ptr. C'est-à-dire le point P.
Cette instruction aura le même effet que
l’instruction P.Abs=18 ;
Ainsi, on peut déduire qu’il est possible de changer
(ou d’accéder à) la valeur d’un champ d’une
structure en utilisant un pointeur.
13
Exemple :
14
DatN D ; int An ;
}Etudiant ; }DatN ;
strcpy(E.pren, « Christophe ») ;
15
E.DatN.jr=25 ;
E.D.jr=25 ;
E.D.mois=10 ;
E.D.An=1990 ;
16
17
On vous demande de :
a. Définir un livre ;
b. Créer un tableau de 10 livres de telle sorte que deux
livres ne puissent jamais avoir le même ISBN ;
c. Afficher tous les livres ;
d. Afficher tous les livres ayant pour auteur « Ali » ;
e. Afficher tous les livres édités en 1980 ;
f. Afficher le nombre de livres édités chez ULBU 2nd
Form company.
18
19
20
II.1 Définition
Une liste est une structure de données composée essentiellement par deux catégories de champs :
une partie pour contenir la/les valeur(s) et une ou plusieurs partie pour indiquer où se trouve les
autres éléments. Cette/ces dernière(s) partie(s) contien(nen)t une/des adresses d’une /de liste(s) et
nous permet(tent) de distinguer deux catégories de listes : listes simplement chaînées et listes
doublement chaînées.
Une liste est simplement chaînée, lorsqu’elle est composée d’une partie pour contenir la valeur et
d’une partie pour contenir l’adresse du suivant. La partie pour contenir la valeur peut être composite.
Ces deux parties sont aussi appelées champs.
Remarque
21
NB : Pour cette section comme pour les suivantes, nous allons travailler sur les entiers pour les
différents exemples.
Val suiv
Liste A ;
A
Liste A ; struct liste A ;
L’accès aux champs d’une liste se fait comme celui sur les structures. Ainsi, on
utilisera les opérateurs point (.) et flèche ()
22
1. Liste*InserTete(Liste*Deb, int v)
2. {
Val suiv
3. Liste*Q ;
4. Q=(Liste*)malloc(sizeof(Liste)); Q
5. Qval=v ;/*mettre la valeur v dans le champ val de Q*/
6. Qsuiv=Deb ;
7. Deb=Q ;
8. return(Deb) ;/*return(Q) ;*/
9. }
1DEF
Deb 125 NULL
12
1DEF 1AEB
1AEB
12
Q 1DEF
23
Liste*Last ,*Q;
Last=Dernier(Deb);
Q=(liste*)malloc(sizeof(Liste));
Qval=V;
Qsuiv=NULL;
24
Last
Q 14
NB :
25
Prec
145
Remarque:
27
Liste*Recherche (Liste*Deb)
{
Liste*Q ;
Q=Deb ;
while(Q !=NULL&&Qval!=21)
Q=Qsuiv;
return(Q);
}
Liste*InsertMilieu(Liste*Deb, int v)
28
Else
Deb=InserMilieu(Deb,Prec,v) ;
return(Deb) ;
}
29
Liste* SupprimerEnQueue(Liste*Deb)
{
Liste*Der,*Prec;
Der=Dernier(Deb) ; /*recherche du dernier
élément*/
if(Der ==Deb)/*si la liste contient un seul élément*/
31
Exercices
Ex1 :
Ex2 :
Ex3 :
Ex4 :
Ex5 :
34
Ex6 :
Ecrire un programme permettant de :
1. Définir une liste d’ordinateurs. Chaque ordinateur
possède les caractéristiques suivantes :
Sa capacité de type entier ;
Sa vitesse de type entier ;
Sa fréquence de type entier ;
35
37
Une liste est doublement chaînée, quand elle possède deux champs d’adresse: l’un pour indiquer
l’adresse du précédent et l’autre pour indiquer l’adresse du suivant. Elle doit également avoir un ou
plusieurs champs caractéristiques des valeurs à mettre dans la liste.
On notera que, le précédent du premier et le suivant du dernier n’existent pas. Ces deux champs
contiendront la valeur : NULL.
Au cours de ce chapitre, nous apprendrons à définir une liste doublement chaînée et à manipuler
(faire quelques opérations sur) de telles listes.
Pour des questions de simplicité, on fera ces illustrations sur des listes d’entiers, les autres cas feront
objet des exercices.
II.2.1 Définition
Comme le montre les notations ci-dessus, l’ordre des champs importe peu. L’important est que les
champs caractéristiques aux éléments de la liste soient tous présents et que leurs types soient
clairement indiqués.
Les définitions précédentes permettent de créer un type appelé liste et ayant pour caractéristique les
trois champs indiqués. L’accès aux champs d’une telle structure est la même que pour une liste
simplement chaînée. C’est-à dire que l’on utilise les mêmes types d’opérateurs et leur
fonctionnement ne change pas.
38
Pour créer une liste vide, il suffit de déclarer un pointeur sur la liste, après sa définition, et
d’initialiser le pointeur à NULL ;
Ex : liste*Deb ;
Deb=NULL ;
Liste*CreerListeVide() Liste*CreerListeVide()
{ {
liste*Deb ;
Deb=NULL ; return(NULL);
return(Deb) ;
}
}
b. Insertion d’un élément au sein d’une liste doublement chaînée
Insérer un élément dans une liste, peut se faire en-tête, au milieu ou en queue.
39
40
Rappelons qu’un élément d’une liste est dernier s’il n’a pas de suivant (le champ destiné à
contenir l’adresse du suivant contient : NULL).
Liste*Dernier (liste*Deb)
{
Liste*Q ;
Q=Deb ;
while(Q !=NULL &&Qsuiv!=NULL)
Q=Qsuiv ; //Passer au suivant
return(Q) ;
}
ou
liste*Dernier (liste*Deb)
{
Liste*Q ;
Q=Deb ;
if(Q !=NULL)/*si la liste contient au moins un élément*/
while(Qsuiv!=NULL) //tant que le champ suiv ne contient pas NULL
Q=Qsuiv ; //Passer au suivant
return(Q) ;
}
liste*InserQueue(liste*Deb, int v)
{
Liste*Der,*Q ;
/*Recherche du dernier*/
Der=Dernier(Deb) ;
if(Der==NULL)
Deb=InserTete(Deb,v) ;
else
{
Q=(liste*)malloc(sizeof(liste));
Qval=v;
Qsuiv=NULL;
Qprec=Der;
Dersuiv=Q;
}
return(Deb);
}
41
10 NULL
Suivant
123
4
P
Q
T
42
Cette fonction n’est valide que si la liste n’est pas vide et que T est différent de suivant. T étant
considéré comme la tête de liste.
liste*InserMilieu2(liste*T,liste*Pr, int v)
liste*Q ,*P;
Q=(liste*)malloc(sizeof(liste));
Qsuiv=Prsuiv;
Qprec=Pr;
Qval=v;
P=Prsuiv ;
Prsuiv=Q;
Pprec=Q;
return(T);
}
Remarque :
Cette fonction n’est valide que si la liste n’est pas vide et que Pr est élément du milieu de la
liste. T étant considéré comme la tête de liste.
43
liste*SuppressionTete(liste*Deb)
liste*Q ;
Q=Deb ;
if(Q !=NULL)
Deb=Debsuiv ;
Debprec=NULL;
free(Q) ;
return(Deb) ;
44
liste*Q,*P ;
Q=Dernier(Deb) ;
if(Q==Deb)
Deb=NULL;
else
P=Qprec;
Psuiv=NULL;
free(Q) ;
return(Deb) ;
45
liste*Q,*P ;
Deb=SuppressionTete(Deb) ;
else
if(Ssuiv==NULL)
Deb= SuppressionQueue(Deb) ;
else
Q=Sprec;
P=Ssuiv;
Qsuiv=Ssuiv;
Pprec=Q;
free(S) ;
return(Deb) ;
46
P=Psuiv ;
47
P=Pprec ;
Exercices
Ex1 :
48
Ecrire un programme permettant de créer une liste doublement chaînée d’entiers. Définir
les fonctions permettant de :
a. Insérer un élément en-tête de liste ;
b. Afficher les éléments d’une liste ;
c. Compter le nombre de fois qu’un élément donné apparaît dans la liste ;
d. Saisir un entier >0 ;
Utiliser ces fonctions pour créer une liste de N éléments. Afficher le nombre de fois
qu’apparaît la valeur 123 et afficher les éléments de cette liste.
Ex3 :
Ecrire un programme permettant de :
a. Définir une liste de caractères ;
b. Créer une liste de N éléments, N étant un entier positif fourni par un utilisateur. Les
caractères de cette liste doivent être ordonnées de manière croissante au moment de la
saisie et ces caractères sont supposés être des minuscules;
c. Afficher les éléments de cette liste en commençant par le dernier de la liste ;
d. Insérer la lettre ‘g’ dans la liste, de telle sorte qu’elle reste ordonnée ;
e. Supprimer toutes les occurrences de la lettre ‘s’ ;
f. Afficher la nouvelle liste.
Ex4 :
Ecrire un programme permettant de :
a. Définir une liste de cours. Chaque cours possède un intitulé : tableau de 10
caractères, un volume horaire et un coefficient de type entier.
Le coefficient ne doit pas dépasser 9 et est >0 ;
b. Créer une liste de 15 cours ;
c. Afficher les volumes horaires de chaque cours ;
d. Changer le volume horaire du cours intitulé « Mode et système d’exploitation » pour
le rendre 45 ;
e. Insérer le cours intitulé « Audit Informatique » ayant un volume horaire de 45H et
un coefficient 3 dans la liste. Ce cours sera insérer immédiatement après le premier
cours ayant un volume horaire >45. Si aucun cours de la liste ne possède pas ce
volume horaire, il faudra alors l’insérer en tête de liste ;
49
Ex5 :
ULBUMan est une société spécialisée dans la production et la vente de téléphones portables. Cette
société désire un petit programme pour gérer ses produits. Ainsi, on vous demande de :
a. Définir une liste doublement chaînée de téléphones portables. chaque téléphone est
caractérisé par :
Sa marque : un tableau de 15 caractères ;
Numéro de série : un entier>0 ;
Date de fabrication et durée de vie qui sont toutes de type DATE. DATE est
composé par jr,mois, et an de type entier. L’année pour la durée de vie doit être
>à l’année de fabrication. La date de création de ULBUMan est : 3 mai 2000 ;
Prix qui est de type entier et > 10.000 BIF.
b. Créer une liste de X téléphones. X étant un entier >0 ;
c. Afficher la liste de téléphones ;
d. Eclater la liste précédente en deux listes : une contenant la liste des téléphones ayant un prix
<60.000 et une autre contenant le reste ;
e. Afficher les deux nouvelles listes ;
f. Au sein d’une même fonction, supprimer tous les téléphones, des deux listes précédentes,
fabriqués en 2005 ;
g. Afficher ces nouvelles listes.
50
}Pile ;
53
int EstVide(Pile*P)
{
if(P==NULL)
return(1) ;
else
return(0) ;
}
54
Pile*Empiler(Pile*P, int V)
{
Pile*Q ;
Q=(Pile*)malloc(sizeof (Pile));
Qval=V;
Qsuiv=P;
P=Q;
return(P);/*return(Q) ;*/
}
Le cas précédent est un passage par valeur. En utilisant un
passage par adresse, la fonction précédente deviendra :
55
Deb=Empiler(Deb,V) ;
Empiler1(&Deb,V) ;
56
57
int Depiler(Pile**P)
int V ;
Pile*Q ;
Q=*P ;
*P=*Psuiv ;
V=Qval ;
free (Q) ;
return(V) ;
Remarque :
Cette fonction ne doit pas être appelée en lui fournissant une
Pile vide. Il faudra alors tester l’état de la pile avant l’appel
d’une telle fonction sous peine de voir le programme se
planter.
58
59
/******************************************/
60
61
}Pile ;
62
63
int EstPleine(Pile*P)
{
if (Psommet==Pcourant)
return(1);
else
return(0);
}
64
Pile*Empiler(Pile*P, int V)
{
int ok;
ok =EstPleine(P) ;
if(ok==1)
printf(« Impossible d’ajouter un élément car elle est
pleine ») ;
else
{
PTab [Pcourant] =V;
Pcourant++;
}
return (P);
}
66
68
69
1
Travaux Dirigés
2
Travaux Pratiques
70
File*Enfiler(File*F, int v)
{
File*P ;
P=(File*)malloc(sizeof(File));
Pval=V;
Psuiv=F;
F=P;
return(F);
71
10 129
F
15
File*Precedent(File*P,file*K)
{
72
int Defiler(File**F)
File*Q ,*P;
int V ;
Q=Recherche(*F );/*premier venu*/
P=Precedent(*F,Q) ;
V=Qval ;
If(P !=NULL)
Psuiv=NULL;
free (Q) ;
73
NB :
int Defiler(File**F)
{
File*Q ;
int V ;
Q=*F ;
*F=(*F)->suiv ;
V=Qval ;
free (Q) ;
return(V) ;
}
74