Liste chainéés

Signaler
Messages postés
34
Date d'inscription
dimanche 23 novembre 2003
Statut
Membre
Dernière intervention
6 juillet 2008
-
Messages postés
34
Date d'inscription
dimanche 23 novembre 2003
Statut
Membre
Dernière intervention
6 juillet 2008
-
Bonjour a tous
Enfaite il y a déà eu un poste sur le site sur ce sujet mais ayant le mm tp a faire je me suis rendu compte ke sa fonction quitter ne marchait pas, biensur je tiens a dire que je n'ai pas fait du copier coller mais que j'ai bien fait mon tp et j'ai chercher de l'aide sur ce site :).
C'est un programme qui fait un agenda,

Mais j'ai un prob avec ma fonction quitter elle efface le nom seulement et laisse le numero de tel.
Alors je poste

#include
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#define N 40
#define T 10
struct personne
{
char nom[N+1];
char tel[T+1];
};
struct fiche
{
struct personne p;
struct fiche * p_suivant;
};
void ajouter(struct fiche **pp_liste)
{
char name[N+1];
char phone[T+1];
struct fiche *p_nouv;
printf("Tapez le nom: ");
scanf("%s",&name);
printf("Tapez le numero de tel: ");
scanf("%s",&phone);
p_nouv=(struct fiche *)malloc(sizeof(struct fiche));
strcpy((*p_nouv).p.nom,name);
strcpy((*p_nouv).p.tel,phone);
p_nouv->p_suivant=*pp_liste;
*pp_liste=p_nouv;
}
void afficher(struct fiche *p_liste,int compteur)
{
int a;
a=0;
struct fiche *p_look;
p_look=(struct fiche *)malloc(sizeof(struct fiche));
p_look=p_liste;
if(p_look==NULL)
{
printf("Personne pour l'instant dans l'agenda!\n");
}
while(p_look!=NULL)
{

printf("%s : %s\n",(*p_look).p.nom,(*p_look).p.tel);
p_look=(*p_look).p_suivant;
a++;
}

}
void quitter(struct fiche **pp_liste)
{
int fin_free=0;
int search=0;
struct fiche *p_look; //variable qui contient
// la liste des personnes
struct fiche *p_suiv;
struct fiche *p_temp;
p_look=(struct fiche*)malloc(sizeof(struct fiche));
p_suiv=(struct fiche*)malloc(sizeof(struct fiche));
p_temp=(struct fiche*)malloc(sizeof(struct fiche));
p_look=*pp_liste;
while(search==0)
{
if(p_look==NULL) //verifie si l'agenda n'est pas vide
{
printf("Espace deja libre\n");
search=1;
}
if((p_look!=NULL)&&(p_look->p_suivant==NULL))
search=2; //verifie si l'agenda contient 1 seule personne
if((p_look!=NULL)&&(p_look->p_suivant!=NULL))
/*verifie si l'agenda contient plus d'une personne*/
{
search=3;
fin_free=0;
}
}
printf("%d\n",search);
if(search==3)// si plusieurs personne dans l'agenda
{
while(fin_free==0)/*plus loin free prendra une autre valeur et indiquera qu'il n' y a plus personne */
{
if(p_look!=NULL)/* si l'agenda n'est pas vide*/
{
p_suiv=p_look->p_suivant;/*on met la fiche suivante ds p_suiv*/
free(p_look);/* on libere la place*/
p_look=NULL;/*ca j'ai vu ca ds un de mes boukins :)*/
p_look=p_suiv;/*ensuite on met p_look au suivant*/
}
if(p_look==NULL)/*si plus personne dans l'agenda */
{
fin_free=4;/*fin_free change de valeur ainsi on sor de la condition*/
}

}
if(search==2)/*si une personne ds l'agenda seulement*/
{
/*pareil que pour l'autre sauf ke la on a pas besoin du suivant*/
free(p_look);
p_look=NULL;


}
}
}
int main(void)
{
int compteur=0;
int choix;
struct fiche *p_liste=NULL;
free(p_liste);
do
{
printf("Vous pouvez:\n");
printf(" 1-Ajouter une personne.\n");
printf(" 2-Afficher le contenu de l'agenda.\n");
printf(" 3-Retirer une personne.\n");
printf(" 4-Trier les personnes.\n");
printf(" 0-quitter l'application.\n");
printf("\nVotre choix: ");
scanf("%d",&choix);
if(choix==1)
compteur++;
if((compteur>0)&&(choix==3))
compteur=compteur-1;
if(choix==0)
compteur=0;
switch(choix)
{
case 0:quitter(&p_liste);
break;
case 1:ajouter(&p_liste);
break;
case 2:afficher(p_liste,compteur);
break;
case 3:retirer(&p_liste,compteur);
break;
case 4:trier(&p_liste,compteur);
break;
}
printf("vous avez entrez: %d personne(s)\n",compteur);
}
while(choix!=5);

}
J'ai pas mis le reste parceke ca marche enfin aumoins al fonction retirer ou je ne rencontre pas ce porbleme la.
désolé si le poste est long, et merci d'avance :blush)

1 réponse

Messages postés
34
Date d'inscription
dimanche 23 novembre 2003
Statut
Membre
Dernière intervention
6 juillet 2008

heu un dernier truc a search=2
dans le if j'ai mis
if(search==2)
{
p_suiv=p_look->p_suivant;
free(p_look);
p_look=NULL;
p_look=p_suiv;

}
et la ca m'affiche tjs rien ou des caractere bizzare pr le nom du genre 1$. :(