Ok, bon déjà ça me fait plaisir que mes réponses t'aident ;-)
Quelques rappels théoriques
En fait les pointeurs c'est vraiment très simple comme notion. Un pointeur de type plop * est une adresse sur un objet plop. Les différents pointeurs ne se distinguent que sur la notion de type (ie à la compilation) mais c'est vraiment juste une adresse complètement indépendant de l'objet qu'elle pointe. L'adresse la plus générique étant un void *. Ainsi tu pourrais (mais ce ne serait pas très lisible) utiliser uniquement des pointeurs de type void *.
Cependant, si un pointeur n'est pas initialisé, l'adresse qu'il contient ne veut rien dire, ce qui conduit au fameux "segmentation fault". Les fonctions calloc et malloc servent donc à reserver un espace mémoire de la bonne taille, et retourne l'adresse de cet espace. Cet espace étant libéré à l'aide d'un free ;-)
Erratum
Je viens de m'apercevoir que j'avais fait une petite erreur sur les boucles avec les parcours de liste, c'est que la boucle for s'arrête avant de traiter le dernier élément. Ce qui donne après correction :
void show_fiches(struct Liste l){
struct Maillon *m_it;
struct Maillon *m_fin=fin(l);
for(m_it=debut(l) ; ; m_it=m_it->suite)
{
struct Fiche *f=(struct Fiche *) m_it->data;
printf("%s\n",f->Nom);
if (m_it==m_fin) break;
}
}
unsigned int size_list(struct Liste l){
struct Maillon *m_it;
struct Maillon *m_fin=fin(l);
unsigned int taille=0;
for(m_it=debut(l) ; ; m_it=m_it->suite)
{
++taille;
if (m_it==m_fin) break;
}
return taille;
}
Corrigé du main
Bon ensuite il suffit de corriger le main pour faire appel à tout le bazar :
int main()
{
int arret;
char reponse[256];
int nombre;
arret = 1;
nombre = 0;
struct Liste l=nliste();
do{
printf("Entrer le nom de la fiche.\n\nEntrer ''Fin'' pour terminer le programme.\n\n");
gets (reponse);
printf("\n\n\n");
if (strcmp(reponse,"Fin"))
{
struct Fiche * pf=CreerFiche(reponse);
struct Maillon *m=(struct Maillon *)malloc(sizeof(struct Maillon));
m->data=pf;
add(&l,m);
++nombre;
}
else arret=0;
}while(arret);
if(nombre>1){
printf("Vous avez cree %d fiches.\n",nombre);
printf("Mon dossier contient les %d fiches suivantes :\n",size_list(l));
show_fiches(l);
}
else printf("Vous avez cree %d fiche.\n",nombre);
getchar();
return 0;
}
Exercices
Voilà, et tout marche ;-) Quelques petits exercices pour t'entraîner :
- afficher la nième fiche. Vérifier au préalable que cette fiche existe.
- creer une fonction qui libère la mémoire occupée par la liste et chacun de ses maillons, à l'aide de la fonction free
- supprimer la nième fiche.
- rechercher l'index d'une fiche à partir du nom qu'elle contient.
- en stockant l'ensemble des fiches dans un tableau (struct Fiche *) et en utilisant la fonction qsort, trier les fiches par ordre alphabétique
- rajouter un champ age dans une fiche. Corriger CreerFiche en conséquence ainsi que la saisie d'une fiche
- proposer la correction de la ième fiche (Nom+Age)
Après ça tu seras un pro du C ;-)
Signé une fille ^^


