Vous êtes sur la page 1sur 3

Université de Tébessa Département des mathématiques et informatique

1 ére année MI, 2022/2023 Module: ASD2

TD/TP 2 (Les listes chainées)

Rappel :
Un type Liste d’entiers peut être déclaré comme suit : Dans un programme C, le type Liste (d’entiers) peut
Type Element = Enregistrement être déclaré comme suit :
Val : Entier typedef struct Element Element;
Suiv : ^Element typedef Element* Liste;
Fin-Element struct Element
Liste=^Element { int val; /* val Contient l’information utile */
Var L, P : Liste /* Deux variables de type Liste */ Liste suiv; /* suiv un pointeur vers l’élément
suivant */
};
Liste L, P ; /* L, P : des variables de type Liste ou
pointeur sur Element */

Opérations sur les pointeurs En C :


- Initialisation : On écrit P  Nil. Nil : est une - Initialisation : P=NULL ;
constante qui représente une adresse particulière qui - Création : P = malloc( sizeof( Element) ) ;
ne pointe vers aucune donnée. - Libération (destruction) : free(p) ;
- Allouer( P ) : permet de créer un nouvel élément (ou
cellule) pointé par le pointeur P.
- Liberer( P ) : permet de supprimer l’élément (ou la
cellule) pointé par le pointeur P.

Exercice 1 (TD) : 1. Déclarer des variables pointeurs sur : un entier, une chaîne de caractère, un tableau d’entiers (10
max), un enregistrement (étudiant).
2. Créer des variables dynamiques correspondantes.
3. Affecter des valeurs à chacune des variables dynamiques pointées par ces pointeurs.
- .
Exercice 2 (TD) :
On considère que les déclarations suivantes ont été faites : int a; char tab[10]; Une expression avec pointeurs (resp.
sans pointeurs) vous est donnée, vous devez la ré-écrire sans (resp. avec) l’usage explicite des pointeurs.
1. *(&a)
2. *tab3
3. *(tab + 0)
4. (*tab) + 1
5. &(tab[0])
6. &(tab[i])
7. ++tab[i]

Exercice 3 (TD) : Écrire un programme avec les pointeurs qui construit une matrice unitaire avec une dimension N
(fixé par l’utilisateur) Rem : une matrice unitaire est une matrice carrée dont les éléments de la diagonale sont égaux
à 1 les autres éléments sont nuls.

Exercice 4 (TD/TP): On utilise dans tout cet exercice des listes chaînées dont le type est le suivant :

Type Cellule= Enregistrement


info : Entier;
suivant :^Cellule;
FinEnreg
Liste = ^Cellule;
Q1) Écrire une procédure InsererTete(L, N) qui permet d’insérer l’entier N au début de la liste L (La liste L peut être
vide).
Q2) Utiliser la procédure InsererTete pour écrire une autre procédure CreerListe qui permet de créer une liste
d’entiers positifs à partir du clavier. Si une valeur négative est saisie, l’insertion à la liste s’arrête.

Q3) Écrire une procédure AfficherListe(L) qui permet d’afficher les éléments de la liste L. Si L est vide, la procédure
doit afficher le message ‘* Liste vide *’.

Q4) Écrire l’algorithme principal qui permet de tester les procédures écrites dans les questions précédentes.

Q5) Écrire une procédure InsererQueue(L, N) qui permet d’insérer l’entier N à la fin de la liste L (La liste L peut être
vide).

Q6) Modifier la procédure écrite à la question Q2 pour utiliser la procédure InsererQueue.

Q7) Écrire une fonction Longueur(L) qui permet de calculer la longueur (nombre d’éléments) de la liste L.

Q8) Écrire une procédure récursive AfficherListeREC(L) qui permet d’afficher les éléments de la liste L.

Q9) Modifier la procédure AfficherListeREC(L) pour qu’elle affiche les éléments de la liste L dans l’ordre inverse.

Q10) Réécrire la fonction Longueur et la procédure InsererQueue sous forme récursive.

Q11) On suppose, cette fois-ci, que les éléments de la liste sont triés. Écrire une procédure InsererListeTriee(L, N) qui
permet d’insérer un entier N de telle sorte que la liste reste toujours triée. Remarque : Cette liste triée accepte les
doublons.

Q12) Écrire une procédure InsererPos(L, N, pos) qui permet d’insérer l’entier N dans la liste L à la position pos. Si la
position pos n’existe pas, l’insertion n’est pas effectuée. Exemple : Si la liste contient 2 éléments, il est possible
d’insérer un nouvel élément à la position 1, 2 ou 3. Cependant, Il est impossible d’insérer un nouvel élément à la
position 4.

Q13) Réécrire les deux procédures des questions Q11, Q12 sous forme récursive.

Exercice 5 (TD): Consultation

Écrire une fonction (itérative puis récursive) en algorithmique et en C qui permet de :

a. Vérifier si une valeur N existe dans la liste. Elle retourne Vrai, si N existe, sinon elle retourne Faux (Fonction
Existe(L, N)).

b. Vérifier si une valeur N existe dans la liste. Elle retourne l’adresse de l’élément contenant la valeur N. Sinon, elle
retourne Nil (Fonction Adresse1(L, N)).

c. Retourner un pointeur sur l’élément qui se trouve à la position pos. Si la position pos n’existe pas, la fonction
retourne Nil (Fonction Adresse2(L, pos))

d. Calculer le nombre d’occurrence d’un entier N dans la liste.

e. Chercher le Maximum (Fonction Max(L)). On suppose que la liste n’est pas vide.

f. Vérifier si la liste est triée

Exercice 6 (TD): Mise à jour

Q1) Écrire une procédure SupprimerTete(L) qui permet de supprimer le premier élément de la liste L, s’il existe.

Q2) Écrire une procédure SupprimerListe(L) qui permet de supprimer tous les éléments de la liste L. Q3) Écrire une
procédure SupprimerValeur(L, N) qui permet de supprimer toutes les occurrences d’une valeur N.

Q4) Écrire une procédure SupprimerPos(L, pos) qui permet de supprimer l’élément qui se trouve à la position pos.

Q5) Écrire une procédure Fusion(L1, L2, L3) qui permet de fusionner deux listes triées L1 et L2 et créer la liste triée
L3.
Q6) Écrire une procédure Eclater(L, L1, L2) qui permet d’éclater la liste L en deux listes L1 et L2. La liste L1 contient
les nombres impairs et la liste L2 les nombres pairs.

Q7) Écrire une procédure Inverser(L) qui permet d’inverser une liste L. Le premier élément devient le dernier, le
deuxième devient l’avant dernier et ainsi de suite. Remarque : Il est interdit de créer de nouveaux éléments.

Exercice 7 (TP): Dans cet exercice on souhaite modéliser un train. Un train est représenté par : – Une suite de
wagons (au maximum NB_MAX wagons) représentée par une liste statique. – Une taille (entier correspondant au
nombre de wagons). Un wagon est représenté par : – Un numéro (entier) – Un nombre de places assises (entier) –
Un nombre de places debout (entier) – Un identifiant permettant de savoir s’il s’agit d’un wagon restaurant (=1 si
restaurant, =0 sinon) – Un identifiant permettant de savoir s’il s’agit d’une locomotive (=1 si locomotive, =0 sinon)

Q1 : Ecrire en C la structure wagon (struct wagon) comprenant les variables numero, nbPlacesAssises,
nbPlacesdebout, restaurant, locomotive, puis définir la structure train. Créer une variable globale "monTrain" qui
sera utilisée pour la suite du TP.

Q2 : Ecrire en C les fonctions et procédures suivantes :


– wagon creerWagon(entier, entier, entier, entier, entier)
– insererLocomotive(wagon)
– insererWagonEnTete(wagon)
– insererWagonEnFin(wagon)
– afficherTrain()
– verifierCoherenceTrain()

La procédure insererLocomotive insère le wagon “locomotive” en début de train.


La procédure wagonEnTete insère le wagon en début de train s’il n’y a pas de locomotive, et juste derrière la
locomotive si elle est présente.
La procédure afficherTrain affichera :

– le numéro du wagon – le nombre de places totales s’il s’agit d’un wagon voyageur – "locomotive" s’il s’agit d’une
locomotive – "restaurant" s’il s’agit d’un wagon restaurant – Les wagons sont séparés par "–"

Exemple d’affichage : 12 locomotive – 11 54 – 34 restaurant – 9 43 – 7 54.


La procédure verifierCoherenceTrain vérifiera : – que la locomotive est bien en tête de train – qu’il y a une et une
seule locomotive – que pour chaque wagon, le nb de places est >0 – que le nb de places pour le wagon restaurant
est de 0 – que le nb de places pour la locomotive est de 0 – qu’un wagon est soit voyageur, soit une locomotive, soit
un wagon restaurant Si tout est bon la valeur de retour est de 1 sinon 0. 4

Q3 : Ecrire un programme principal permettant d’utiliser et de vérifier les fonctions précédentes.

Vous aimerez peut-être aussi