Date de première publication : 2015/10/06
Nous continuons le TP Hall of fame. Les données seront stockées dans une liste chaînée et non plus dans un tableau
L'idée est d'utiliser ce que vous avez fait dans la partie précédente mais SANS perdre ce travail.
#include<stdio.h>
#include<stdio.h>
#include<string.h>
// recopier votre code de structure
struct donnee {
// les champs necessaires
}
typedef struct donnee donnee_t ; // alias de type
int main() {
return 0;
}
Choix du type de liste
Pour manipuler une liste chaînée, vous devez choisir si vous la définissez avec une tête réelle ou une tête fictive.
donnee_t * tr; // tete reelle
donnee_t tf; // tete fictive
- Documenter impérativement le choix retenu pour la tête de la liste
- Modifier la structure
struct donnee
dans le fichier d'entête en ajoutant un champ "suivant". La structure est désormais de type autoréférentielle. - Initialiser la liste chaînée dans le
main()
(fichiermain.c
). Dans le cas d'une liste à tête fictive, il peut être opportun d'écrire une fonctioncreerListe()
qui renvoie une liste vide.
donnee_t creerListe(void);
Premières manipulations
- Ajouter à la liste à la main un premier élément alloué dynamiquement et l’afficher.
- Insérer à la main en fin de liste un deuxième élément créé dynamiquement et afficher la liste
- Insérer à la main en tête un autre élément créé dynamiquement et afficher la liste
- Afficher la liste en écrivant une boucle dans la fonction
main()
- Écrire maintenant une fonction
afficherListe()
qui affiche la liste et vérifier que cela marche toujours !
afficherListe(struct donnee tetefictive);
afficherListe(struct donnee * tetereelle);
Vous avez une liste à 3 éléments, vous devez donc avoir 3 allocations dynamiques - valgrind power
- Écrire une fonction pour insérer un élément en tête de liste
insererListe()
insererListe(struct donnee * tetefictive, DONNEES);
insererListe(struct donnee ** tetereelle, DONNEES);
- Écrire le code pour rendre la mémoire associée à la liste chaînée. Vérifier avec valgrind
- Écrire maintenant une fonction pour rendre la mémoire associée à la liste chaînée
libererListe()
. Cette fonction devra être testée sur une liste vide, sur une liste à un élément et une liste à un nombre quelconque d'éléments. Chaque test est validé par valgrind
valgrind est un véritable couteau suisse : il est impératif d'utiliser ce programme pour vérifier le rendu mémoire, mais vous devez aussi l'utiliser pour éliminer les erreurs de contexte. Si vous avez un segfault, c'est une bonne habitude de le lancer pour voir ce que le programme vous dit !
Un programme complet
Si tout s'est bien passé, on peut maintenant faire un programme complet (et utiliser la compilation séparée pour ce faire).
La structure est placée dans le fichier d'entête accompagnée des déclarations de fonctions
concernant la liste chaînée. L'implémentation des fonctions de liste chaînée est dans un fichier c particulier.
Le programme principal est dans un dernier fichier de code
et propose un menu à base de switch
pour réaliser les opérations suivantes (que vous venez plus ou moins de coder)
- Afficher les données (la liste chaînée)
- Insérer (en tête) un nouvel élément
- Modifier un élément existant
- Lire ou sauvegarder à partir d'un fichier texte
- Quitter (et rendre la mémoire)
L'exécution du programme sera vérifiée avec valgrind.