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 :

probleme avec des pointeurs dans une liste chainee


Sujet :

C

  1. #1
    Membre confirmé Avatar de KindPlayer
    Profil pro
    Inscrit en
    Février 2007
    Messages
    471
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 471
    Points : 477
    Points
    477
    Par défaut probleme avec des pointeurs dans une liste chainee
    Bonjour a tous

    Je voudrais implémenter un tri en utilisant des arbres binaires de recherche. J'ai donc créé une liste chainée comportant une structure arbre. Mais j'ai des problèmes de pointeur dès que je veux ajouter un élément.
    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
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <stddef.h>
     
    typedef struct Noeud
    {
    	int valeur;
    	struct Noeud* filsGauche;
    	struct Noeud* filsDroit;
    }Noeud;
    typedef Noeud* Arbre;
     
    void Ajouter(int valeur,Arbre* arbre)
    {
    	//on construit le nouveau noeud
    	Arbre nouveau = (Arbre)malloc(sizeof(Noeud));
    	nouveau->valeur = valeur;
    	nouveau->filsDroit= NULL;
    	nouveau->filsGauche = NULL;
     
    	//on le place
    	Noeud* courant = (Arbre)malloc(sizeof(Noeud));
    	Noeud* precedent = NULL;
     
    	if(*arbre == NULL)
    	{
    		*arbre = (Arbre)malloc(sizeof(Noeud));
    		*arbre=nouveau;
    	}
    	courant=*arbre;
    	precedent = (Arbre)malloc(sizeof(Noeud));
     
    	while (courant)
    	{
     
    		precedent = courant;
     
    		if(nouveau->valeur < courant->valeur)
     
    			courant = courant->filsGauche;
     
    		else
    			printf("%d",courant->valeur);
    			courant = courant->filsDroit;
    	}
     
    	//maintenant qu'on a trouve une place libre on place correctement le nouveau noeud
    	if(noeud->valeur < precedent->valeur)
    		precedent->filsGauche = noeud;
    	else
    		precedent->filsDroit = noeud;
     
    }
     
    int main()
    {
            Arbre arbre=NULL;
    	Ajouter(15,&arbre);
    	Ajouter(2,&arbre);
            return 0;
    }
    le premier élement est bien ajouté mais j'ai une erreur de segmentation pour le deuxieme noeud.

    Mon probleme est sans doute simple a résoudre mais je débute.

  2. #2
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Points : 17 916
    Points
    17 916
    Billets dans le blog
    2
    Par défaut
    1) pense à la balise code

    2) tu as tout faux sur les alloc de l'arbre

    regardes attentivement le code et vérifie ce que tu fais...

    Ce que tu devrais faire :

    allouer 1 élément
    si c'est le premier c'est le début de l'arbre, son précdent et son suivant son nuls.
    si c'est le dernier, son précédent est le dernier de l'arbre, son suivant est nul
    si c'est au milieu, il faut trouver entre lesquels il se place, puis
    ajuster son précedent et son suivant
    ajuster le suivant de son précédent
    ajuster le précédent de son suivant

    il n'y a qu'une seule allocation....

  3. #3
    Membre confirmé Avatar de KindPlayer
    Profil pro
    Inscrit en
    Février 2007
    Messages
    471
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 471
    Points : 477
    Points
    477
    Par défaut
    C bon g rectifié en créant une fonction ajouter qui alloue et crée le nouveau noeud et une fonction qui place le noeud au bon endroit.

Discussions similaires

  1. [XSLT] probleme avec les doublons dans une liste deroulante
    Par mikooo dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 02/04/2007, 15h37
  2. Réponses: 5
    Dernier message: 12/01/2007, 11h39
  3. Réponses: 2
    Dernier message: 10/10/2005, 02h25
  4. [LG]probleme d'ajout dans une liste chainée...
    Par misteryann dans le forum Langage
    Réponses: 5
    Dernier message: 08/03/2004, 20h28
  5. [langage] Comment rajouter des champs dans une liste
    Par toto_titi dans le forum Langage
    Réponses: 4
    Dernier message: 28/08/2003, 14h09

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