1
IN4R11 2020-2021 TP 2 : LES LISTES.
LIRE et TOUT LIRE
Avertissement :
- Le type abstrait (vu en cours) doit être utilisé dans ce TP.
Consignes :
- Pour implémenter le type abstrait reprendre le code (.c) vu en cours des opérations : cliquez ici
2 Type liste
Utilise typeElem, booleen,int, etc..
Opérations
listevide :
→
listeest_vide : liste
→
booleencons : liste x element
→
listesuite : liste
→
listetête : liste
→
typeElemaxiomes
tete(cons(e,l)) = e suite(cons(e,l)) = l
avec : liste l, element e préconditions
tête(l) et suite(l) sont définies
ssi est_vide(l) est faux
On utilisera le type liste suivant pour la représentation chaînée.
typedef struct ll { typeElem e;
struct ll *suiv;
} typeListe ;
typedef typeListe *liste ; /* liste est un pointeur !*/
liste est un pointeur ??: pour éviter la présence d’opérateurs tels que : ‘
→
’, ‘*’ et ‘&’ qui rendent illisible.#define liste_vide NULL /* pour déclarer liste vide */
Le type typeElem de la structure peut être n’importe quel type. Dans notre TP on choisira le type entier pour typeElem :
#define typeElem int /* à déclarer avant la structure */
#define booleen int /* on définit le type booléen */
On réutilisera, autant que possible, les opérations du type abstrait pour la suite du TP.
3
Partie 1. Opérations simples.
Ecrire les fonctions | procédures suivantes:
1- int longueur(liste L)qui retourne la longueur de la liste ( c-a-d le nombre d’éléments), 2- void afficher(liste L). affiche à l’écran les éléments de L
3- booleen isLast(liste L) qui teste si on est sur le dernier élément de L.
4- typeElem Last (liste L) qui retourne le dernier élément de la liste L.
5- typeElem maxL( liste L) qui retourne l’élément maximal d’une liste non vide (en itératif),
6- typeElem rec_maxL( liste L) qui retourne l’élément maximal d’une liste non vide (en récursif),
7- booleen recherche(typeElem X ,liste L) :
retourne VRAI si X est dans la liste L ; FAUX sinon
Partie 2.
Ecrire les fonctions | procédures suivantes :8- int nb_Occu(typeElem X ,liste L) qui retourne le nombre d’occurrence d’un élément donné dans une liste.( nombre de fois o% X apparait dans la liste L)
9- typeElem kieme(liste L, int k): retourne le kième élément de la liste sinon -1
10- int ieme(liste L, typeElem E) :
retourne la position de l’ élément E
sinon -1 (cas de liste vide, ou i > taille de liste..)
Partie 3
Ecrire les procédures suivantes : (attention !!!: liste *L)4 11. Écrire un algorithme qui inverse une liste chaînée sans recopier ses éléments. Réaliser une version itérative : void iter_inverse(list *);
et une autre récursive. list * rec_inverse(list* pl)
**** traiter les différents cas de listes vides et|non vides, k >
taille de la liste ..
12 -Ajouter un élément en position k :
void ajoutAukieme(liste *L, int k, typeElem e);
13- Suppression d'un élément en début de liste : void supprime_debut(liste *L);
14- Ajouter un élément en fin de liste :
void ajout_fin(liste *L, typeElem X);
15- Supprimer un élément en position k :
void supprimekieme(liste *L, int k);
Partie 4. Ecrire les procédures suivantes : 16- Concaténer deux listes :
void catenate(liste *L1, liste *L2) concatène L2 à L1 :
***** traiter les différents cas listes vide et|non vides etc..
- ne pas oublier le cas L1 = L2 (c’est-à-dire même liste ) concat(L,L), dans ce cas que faut-il choisir copies (2 fois la liste L ) ou références (liste circulaire)?
On optera pour la liste circulaire.
17- void couper(liste *L1, liste *L2, liste *L3)Obtenir deux listes L1, L2 à partir d’une liste L3 en préservant les éléments de cette dernière.(les nombres positifs dans L1 , les négatifs dans L2, les nuls seront ignorés.
18 - void fusion(liste *L1, liste *L2, liste *L3) Obtenir une 3ème liste L3 triée à partir de deux L1 et L2 triées. (par ordre croissant).