Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1832 connectés 

  FORUM HardWare.fr
  Programmation
  C

  balayer liste chainée

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

balayer liste chainée

n°1381411
Liv83
Posté le 05-06-2006 à 16:14:42  profilanswer
 

>Boujour à tous je suis nouveau sur Hardware :hello:  
 
>Je suis entrain de faire un programme C qui creer un arbre genealogique a partir d'un ficchier texte.
 
>Je dois faire une fonction ref_personne(prenom, nom) qui doit retourner la référence de la personne de nom nom et de prenom prenom. J'ai une erreur dans ma fonction.
 
>Voila des extrait de mon programme qui vous serons utiles pour me répondre.
 
/* Structure de type personne "PERSONNE" */
 
typedef struct personne PERSONNE;
struct personne
{
        char nom[15];
        char prenom[15];
        char S;
        struct  
        {
               int jour;
               int mois;
               int annee;
        }date_naissance;
        PERSONNE * pere;
        PERSONNE * mere;
};
 
/* Structure de type element "ELEMENT" */
 
typedef struct element  ELEMENT;
struct element
{
        PERSONNE * personne;
        ELEMENT * suivant;
};
 
/* Structure de type ensemble "ENSEMBLE" */
 
typedef struct ensemble ENSEMBLE;
struct ensemble
{
        ELEMENT * premier;
};
 
>Et voici ma fonction
ref_personne[i]
 
/* Reference d'une personne */
 
PERSONNE ref_personne(char *nom, char* prenom)
{
     ELEMENT * tmp;
     PERSONNE * resultat;
     tmp = ENSEMBLE -> premier; /*expected primary-expression before '->' token
     int trouve = 0;              
     while (tmp != NULL && !trouve)
     {
           if ((strcmp(tmp->personne->nom, nom)==0) && (strcmp(tmp->personne->prenom, prenom)==0))
           {
              trouve = 1;
              resultat = tmp->personne;                    
           }
           tmp = tmp->suivant;
     }    
     return tmp;        
}
 
tmp doit parcourir ma chaine pour verifier si c'est le bon mon et prenom, or mon erreur si situe au debut (erreur en commentaire) ou je veux metre tmp au debut de ma liste.
 
>J'espere vous avoir fourni assez d'éléments pour me répondre sinon j'attends vos remarques. Merci d'avance.
 
Cordialement Liv.

mood
Publicité
Posté le 05-06-2006 à 16:14:42  profilanswer
 

n°1381456
simple_stu​pid
Keep It Simple Stupid
Posté le 05-06-2006 à 16:57:17  profilanswer
 

Ne mets pas d'espace entre ENSEMBLE et premier:


structure->membre


Et ne mets des noms en majuscule que pour les constantes (define), c'est pas très lisible.


Message édité par simple_stupid le 05-06-2006 à 17:01:06
n°1381501
Liv83
Posté le 05-06-2006 à 17:32:41  profilanswer
 

Meme en enlevant les espaces j'ai la meme erreur je mets les espaces afin de rendre mon programme plus lisible et pour les majuscules désolé mais j'ai apris comme ca.
 
J'ai fais une correction de ma fonction mais la meme erreur perciste, voila le nouvel algorithme :
 
PERSONNE * ref_personne(char * nom, char * prenom)
{
     ELEMENT * tmp;
     PERSONNE * resultat;
     tmp =  ENSEMBLE->premier; /* expected primary-expression before '->' token */
     int trouve = 0;              
     while (tmp != NULL && !trouve)
     {
           if ((strcmp(tmp -> personne -> nom, nom)==0) && (strcmp(tmp -> personne -> prenom, prenom)==0))
           {
              trouve = 1;
              resultat = tmp -> personne;                    
           }
           tmp = tmp -> suivant;
     }    
     return resultat;        
}
 
Voila.

n°1381552
simple_stu​pid
Keep It Simple Stupid
Posté le 05-06-2006 à 18:27:59  profilanswer
 

Bon.
Tu fais  


tmp =  ENSEMBLE->premier;  


C'est quoi ENSEMBLE?
C'est un type de de variable, que tu as défini avec typedef.
Mais tu n'as pas déclaré de variable de ce type.
Un peu comme si tu faisais int->premier.
 
Pour ton parcours, ce serait plus clair avec un for:
 


PERSONNE * ref_personne(char * nom, char * prenom)
{
     ELEMENT * tmp;
     PERSONNE * resultat;
     tmp =  ENSEMBLE->premier;  
 
     int trouve = 0;              
     for (;tmp && !trouve; tmp = tmp -> suivant;)
     {
           if ((strcmp(tmp -> personne -> nom, nom)==0) && (strcmp(tmp -> personne -> prenom, prenom)==0))
           {
              trouve = 1;
              resultat = tmp -> personne;                    
           }
      }    
     return resultat;    


Message édité par simple_stupid le 05-06-2006 à 18:59:40
n°1381563
Liv83
Posté le 05-06-2006 à 18:40:32  profilanswer
 

Merci, il me donne mal à la tête ce programme j'ai pas réflechi.

n°1381612
Liv83
Posté le 05-06-2006 à 19:37:49  profilanswer
 

J'ai un autre probleme.
Dans un fonction je fais un test pour savoir si un element appartient a un ensemble.Je fais ca avec un if/else or dans mon else une fois que j'ai je return 1 (vrai) je n'est plus besoin de continuer à chercher et j'aimerai savoir comme sortir de ma fonction en retournant 1.
Je pense que si je fais :
 
return 1;
return ();
 
cela va pas marcher, merci.

n°1381616
Sve@r
Posté le 05-06-2006 à 19:48:46  profilanswer
 

Liv83 a écrit :

J'ai un autre probleme.
Dans un fonction je fais un test pour savoir si un element appartient a un ensemble.Je fais ca avec un if/else or dans mon else une fois que j'ai je return 1 (vrai) je n'est plus besoin de continuer à chercher et j'aimerai savoir comme sortir de ma fonction en retournant 1.
Je pense que si je fais :
 
return 1;
return ();
 
cela va pas marcher, merci.


Dès que tu fais "return 1", tu sors de ta fonction. Donc le 2° return est inutile et ne veut absolument rien dire.
Tu devrais commencer par penser à ouvrir ton bouquin de C !!!


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
n°1381618
Liv83
Posté le 05-06-2006 à 19:51:31  profilanswer
 

A oui c'est vrai j'ai honte :$, merci.


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  balayer liste chainée

 

Sujets relatifs
liste d'achat denree alimentaire ou autres(tres urgent svp)Incrémenter une liste de facon ordonnée ?
[RESOLU] Changer largeur zone de liste accessListe Deroulante dans le genre barre d'adresse du navigateur
CHECKED et case à cocher : liste à partir d'une table [RESOLU]Rechercher dans une boite à liste
[PHP] alimenter une liste déroulante à partir d'une bd MySQL2 pbs : liste déroulante et microsoft jet
Spprimer une "liste" de repertoires ?(VBA Excel)recopier liste perso dans une formule
Plus de sujets relatifs à : balayer liste chainée


Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)