no save
Assistance
Achat
News

Forum | programmation
Langage C pointeurs, creation de liste.
mamiemando, le dim. 02 avr. 2006 à 21:17:33
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 ^^
PrécédentUn Gars
mars 06
Drayell / Ank[58]f1x : Webmaster, Coder(C/C++, Asm), Designer
avr. 06
Suivant
REPONSES
mamiemando
mars 06
Un Gars
mars 06
mamiemando
mars 06
Un Gars
mars 06
mamiemando
mars 06
Un Gars
mars 06
mamiemando
mars 06
Un Gars
mars 06
mamiemando
avr. 06
Drayell / Ank[58]f1x : Webmaster, Coder(C/C++, Asm), Designer
avr. 06
Version Web
Réalisé par RedShift
no save