IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

Arbre binaire


Sujet :

C

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    104
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2008
    Messages : 104
    Points : 54
    Points
    54
    Par défaut Arbre binaire
    Bonjour,

    J'ai un petit soucis en C, je dois faire un arbre binaire !
    En C++ avec des classes je n'ai aucun soucis, mais ici je dois faire ça en C !
    Je veux explique mon soucis:
    Mon arbre binaire trie des personnes par ordre alphabétique, lorsque que j'ajoute mon premier membre, dans la fonction d'ajout tout se fait nikel, et lorsque que je sors de cette fonctionne, mon element reste null, comme si je n'avais rien fait ! je passe bien par pointeur, je ne comprends pas vraiment pourquoi ca ne fonctionne pas ! Voici mon code :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    struct s_personne {
    	char* nom;
    	char* prenom;
    	struct s_personne* gauche;
    	struct s_personne* droite;
    	struct s_livre *livre;
    };
     
    struct s_livre {
    	char* nom;
    	char* date;
    	struct s_livre *next;
    };
     
    void ajouter_membre(struct s_personne* base, char* nom, char* prenom);
    void afficher(struct s_personne* base);
    void ajouter_livre(struct s_personne* membre, char* nomLivre, char* date);
    int moyenne_livre(struct s_personne* base);
     
    void main() {
    	struct s_personne* base;
    	base = NULL;
    	printf("1\n");
    	afficher(base);
    	printf("2\n");
    	ajouter_membre(base, "Jean-Guy", "Toto");
    	printf("3\n");
    	afficher(base);
    }
     
    void ajouter_membre(struct s_personne* base, char* nom, char* prenom) {
    	int nbr, nbr2;
    	struct s_personne test;
    	// Si l'element n'existe pas, on le créé
    	printf("20\n");
    	if (base==NULL) {
    		printf("21\n");
    		base = (struct s_personne*) malloc(sizeof(struct s_personne));
    		printf("211\n");
    		base->nom = (char*) malloc(sizeof(nom)*sizeof(char));
    		strcpy(base->nom, nom);
    		printf("212\n");
    		base->prenom = (char*) malloc(sizeof(prenom)*sizeof(char));
    		strcpy(base->prenom, prenom);
    		base->gauche=NULL;
    		base->droite=NULL;
    		base->livre=NULL;
    		printf("213");
    	} else {
    		printf("22\n");
    		// Sinon on compare les noms
    		nbr = strcmpi(base->nom, nom);
    		// Ajout a gauche : comparaison négative
    		if (nbr < 0) {
    			ajouter_membre(base->gauche, nom, prenom);
    		}
    		printf("23\n");
    		// Ajout a droite : comparaison positive
    		if (nbr > 0) {
    			ajouter_membre(base->droite, nom, prenom);
    		}
    		printf("24\n");
    		// Les noms sont identique
    		if (nbr == 0) {
    			// On compare les prénoms
    			nbr2 = strcmpi(base->prenom, prenom);
    			// Ajout a gauche : comparaison négative
    			if (nbr2 < 0) {
    				ajouter_membre(base->gauche, nom, prenom);
    			}
    			// Ajout a droite : comparaison positive
    			if (nbr2 > 0) {
    				ajouter_membre(base->droite, nom, prenom);
    			}
    			// Prénoms aussi identique: erreur ! on ne fait rien
    			if (nbr2 == 0) {
    				printf("Erreur, le nom et le prenom existent deja");
    			}
    		}
    	}
    }
     
    void afficher(struct s_personne* base) {
    	struct s_livre* livre;
    	printf("11\n");
    	if (base != NULL) {
    		printf("12\n");
    		if (base->gauche != NULL) {
    			afficher(base->gauche);
    		}
    		printf("13\n");
    		printf("Nom : %s - Prenom: %s\n", base->nom, base->prenom);
    		livre = base->livre;
    		// Affichage des livres tant que next != null
    		while(livre != NULL) {
    			printf("-> Livre : nom: %s - date: %s", livre->nom, livre->date);
    			// On définit le livre suivant => livre->next
    			livre = livre->next;
    		}
    		if (base->droite != NULL) {
    			afficher(base->droite);
    		}
    		printf("14\n");
    	}
    	printf("15\n");
    }
    Faites pas trop attention aux printf c'est juste pour vérifier par où il passe !
    Voici le résultat de l'execution:

    1
    11
    15
    2
    20
    21
    211
    212
    2133
    11
    15

    Merci d'avance pour votre aide !

  2. #2
    Membre éprouvé Avatar de orfix
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 707
    Points : 1 132
    Points
    1 132
    Par défaut
    Quelque chose qui me saute aux yeux (sans trop regarder les algorithmes utilisés) il est normal qu'après appel à ajouter_membre, base reste à NULL, si tu veux qu'elle soit modifiée il faut envoyer son adresse comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    void ajouter_membre(struct s_personne **base, char* nom, char* prenom);
    <...>
    ajouter_membre(&base, "Jean-Guy", "Toto");
    Bonne continuation.

  3. #3
    Membre émérite Avatar de SofEvans
    Homme Profil pro
    Développeur C
    Inscrit en
    Mars 2009
    Messages
    1 078
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 078
    Points : 2 339
    Points
    2 339
    Par défaut
    Je regarde ton code :

    une astuce :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    struct s_personne 
    {
        ...
    };
    Tu fais cette structure, et ensuite dans ton code, pour utiliser ta structure tu ecrit

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    struct s_personne  Someone;
    Utilise un typedef :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    typedef struct s_personne personne;
    struct s_personne 
    {
        ...
    };
    Ainsi, tu aura juste a ecrire
    sans devoir re-ecrire struct a chaque fois.



    Bon, la norme veut que main renvoie un int pour savoir le resultat du deroulement du programme. Je sais qu'avec 'void' ca passe, mais ca devrait pas.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    int main()
    {
            ...
    	return EXIT_SUCCESS;
    }

    sinon pour ton erreur, soit tu renvoi un pointeur dans ta fonction un pointeur qui correspond a la base que tu stockera dans base, soit tu applique la solution precedemment proposé. Dans tout les cas, fais tres attention a ce que tu fais (surtout que tu fais du recursif alors que ca pourrait certainement aussi bien passer en iteratif).


    Petit bonus, la fonction afficher re ecrite :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    void afficher(Personne* base)
    {
    	if (base != NULL)
    	{
    	    Livre *livres = NULL;
     
            afficher(base->gauche);
     
            /* Affichage de la personne et de tout ses livre */
    		printf("Nom : %s - Prenom: %s\n", base->nom, base->prenom);
    		for (livres=base->livre ; livres!=NULL ; livres = livres->next)
    			printf("-> Livre : nom: %s - date: %s", livres->nom, livres->date);
     
            afficher(base->droite);
    	}
    }

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    104
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2008
    Messages : 104
    Points : 54
    Points
    54
    Par défaut
    Merci ca fonctionne bien maintenant

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Afficher un arbre binaire avec sa structure
    Par PhoneKilleR dans le forum C
    Réponses: 7
    Dernier message: 23/04/2008, 23h24
  2. suppression d'un arbre binaire
    Par NomUtilisateurDejaPris dans le forum C
    Réponses: 11
    Dernier message: 16/02/2004, 10h05
  3. [Arbre binaire de Recherche]
    Par Giovanny Temgoua dans le forum Algorithmes et structures de données
    Réponses: 11
    Dernier message: 06/02/2004, 11h45
  4. Arbre binaire
    Par Heaven dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 02/02/2004, 19h01
  5. [LG]probleme de creation arbre binaire
    Par jsaviola dans le forum Langage
    Réponses: 2
    Dernier message: 06/01/2004, 20h57

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo