Académique Documents
Professionnel Documents
Culture Documents
Classe : TI1x
En informatique, une structure de données est une structure logique destinée à contenir des données, afin
de leur donner une organisation permettant leur traitement. On appelle les différentes utilisations possibles
de la structure de données des opérations. Une opération courante est la lecture : récupérer un élément
stocké dans la structure. L’insertion, la suppression, la recherche, etc. sont aussi des opérations de
manipulation des structures de données.
Lorsqu’on crée un algorithme utilisant des conteneurs, il existe différentes manières de les implémenter
(tableaux, listes, piles, files, etc.), la façon la plus courante étant les tableaux.
Lorsqu’on crée un tableau, les éléments de celui-ci sont placés de façon contiguë en mémoire. Pour
pouvoir le créer, il faut connaître sa taille. Si on veut supprimer un élément au milieu du tableau, il faut
recopier les éléments temporairement, réallouer de la mémoire pour le tableau, puis le remplir à partir de
l'élément supprimé. Ce sont beaucoup de manipulations et qui sont coûteuses en ressources.
Une liste chaînée est différente puisque les éléments de la liste sont répartis dans la mémoire et reliés
entre eux par des pointeurs. On peut ajouter et enlever des éléments d'une liste chaînée à n'importe quel
endroit, à n'importe quel instant, sans devoir recréer la liste entière.
1.1 Définition
Une liste simplement chaînée est un ensemble d’objets dynamiques liés entre eux récursivement par des
pointeurs, définie par l’adresse de son premier objet. Chaque objet contient l’adresse de son suivant.
On utilise les listes simplement chaînées pour construire une structure de données dont la taille est
inconnue à l’avance.
1.2 Caractéristiques
Une liste simplement chaînée est caractérisée par :
Un élément tête qui désigne le premier élément de la liste
Tout élément de la liste est composé de deux parties :
o La première partie contient un ou plusieurs champs qui forment les informations des
éléments à traiter
1
Cours : Algorithmique et programmation II Année universitaire : 2019-2020
Classe : TI1x
o La deuxième partie contient un champ permettant de faire le lien avec l’élément suivant
dans la liste. Ce champ est un pointeur.
Le pointeur du dernier élément de la liste doit contenir la valeur NULL qui signifie la fin de la
liste.
1.4 Déclaration
typedef struct cellule {
int information ;
struct cellule * suivant ;
} cellule ;
On crée le type cellule qui est une structure contenant un champ (information) de type entier (dans
cet exemple) et un pointeur sur cellule (suivant), qui contiendra l'adresse de la cellule suivante.
On crée le type liste qui est un pointeur sur le type cellule.
On déclare une variable de type liste ;
nomListe=NULL ;
Exemple
int main(){
liste ma_liste1 = NULL;
cellule *ma_liste2 = NULL;
liste ma_liste3 ;
creerListe(&ma_liste3) ;
return 0;
}
2
Cours : Algorithmique et programmation II Année universitaire : 2019-2020
Classe : TI1x
3
Cours : Algorithmique et programmation II Année universitaire : 2019-2020
Classe : TI1x
Application 1 :
Créer une liste contenant les entiers 5, 7 et 2 successivement.
int main(){
liste L1 ;
//création d’une liste chaînée vide
creerListe(&L1) ;
ajouterEnTete(&L1,5) ;
ajouterEnFin(&L1,7) ;
ajouterEnFin(&L1,2) ;
}
4
Cours : Algorithmique et programmation II Année universitaire : 2019-2020
Classe : TI1x
Fonction récursive :
void afficherListeRec(liste L)
{
if(L !=NULL)
{
/* On affiche le champ information du premier de la liste*/
printf("%d\t", L->information);
/* On appelle la fonction pour afficher le reste de la liste */
afficherListeRec(L->suivant);
}
}
6
Cours : Algorithmique et programmation II Année universitaire : 2019-2020
Classe : TI1x
if(p1->suivant == NULL)
{
/* On le libère et on la liste prend NULL (la liste est maintenant
vide) */
free(p1) ;
*L=NULL ;
return ;
}
/* Si la liste contient au moins deux éléments */
p2=*L ;
/* Tant qu'on n'est pas au dernier élément */
while(p1->suivant != NULL)
{ //on avance les pointeur vers les cases suivantes
p2=p1 ;
p1=p1->suivant ;
}
/* A la sortie de la boucle, p1 pointe sur le dernier élément,
et p2 sur l'avant-dernier. On indique que l'avant-dernier devient
la fin de la liste et on supprime le dernier élément */
p2->suivant = NULL;
free(p1);
}
p2=*L;
//parcourir jusqu’à trouver x ou fin de la liste
while(p1 !=NULL &&p1->information !=x)
{
p2=p1 ;
p1=p1->suivant;
}
if(p1!=NULL)
{/*il existe une cellule qui contient comme information la valeur
de x cad p1->information = =x*/
p2->suivant=p1->suivant;
free(p1);
}
Application 2
Ecrire une fonction qui retourne le nombre d'occurrences d'une valeur x dans une liste chaînée.
8
Cours : Algorithmique et programmation II Année universitaire : 2019-2020
Classe : TI1x
nb++;
}
return nb;
}
2.1 Définition
Il arrive parfois qu’on ait besoin de parcourir une liste à l’envers, ou bien de donner les précédents et
suivant d’un même élément d’une liste. Pour ce faire, on peut ajouter dans chaque élément de la liste un
deuxième pointeur qui contient l’adresse de son précédent. Ainsi, le précédent du premier élément
contient la valeur NULL.
2.3 Déclaration
typedef struct cellule {
int information ;
struct cellule * precedent ;
struct cellule * suivant ;
} cellule;
typedef struct{
cellule *premier;//pointeur sur le début de la liste
cellule *dernier;//pointeur sur la fin de la liste
} listeD;
9
Cours : Algorithmique et programmation II Année universitaire : 2019-2020
Classe : TI1x
10
Cours : Algorithmique et programmation II Année universitaire : 2019-2020
Classe : TI1x
if(q!=NULL){
q->suivant =NULL;
11
Cours : Algorithmique et programmation II Année universitaire : 2019-2020
Classe : TI1x
L->dernier=q ;
}
else
{
L->premier=NULL ;
L->dernier=NULL ;
}
free(p);
}
}
12
Cours : Algorithmique et programmation II Année universitaire : 2019-2020
Classe : TI1x
2.4 Définition
Une liste circulaire est une sorte de liste simplement chainée ou doublement chaînée qui n’a pas de fin
càd le pointeur suivant du dernier élément de la liste pointera sur le premier élément de la liste au lieu de
la valeur NULL.
2.6 Déclaration
La syntaxe de déclaration sera la même pour une liste simplement chainée circulaire ou non et pour une
liste doublement chainée circulaire ou non.
La seule différence réside dans les opérations de manipulation de listes. En fait, il faut remplacer toute
instruction mettant la valeur NULL dans le champ suivant du dernier élément par affectation de l’adresse
du premier élément au champ suivant du dernier élément.
13