Partage
  • Partager sur Facebook
  • Partager sur Twitter

Erreur de segmentation

    19 août 2017 à 1:26:14

    bonjour  svp j'ai un probleme avec mon programme

    il marche tres bien mais quand j'ajoute les deux instrucitons au main :

    addElement( a, 14);
      addElement( a, 15);

    il me donne segment fault

    le problem vient de la fonction qui fait le parcour par largeur

    void LevelOrderTraversal(tree a)

    svp aidez moi a touver un solution

    voici le code

    #include<stdio.h>
    #include<stdlib.h>
    typedef struct queueElement
    {
        int value;
        struct queueElement *next ;
    }queueElement , *Queue;
    
    
    typedef struct node
    {
        int value ;
        struct node *left;
        struct node *right;
    }node, *tree , *tree;
    
    
    
    Queue create_Queue()
    {
        return NULL;
    }
    /*--------------------------*/
    int is_emptyQ(Queue f)
    {
        if(f==NULL)
            return !0;
        return 0;
    }
    
    /*--------------------------*/
    int FullQ(Queue f)
    {
        return 1 ;
    }
    /*--------------------------*/
    Queue enQueue(Queue g,int x)
    {
        queueElement *e =(queueElement *)malloc(sizeof(queueElement));
        queueElement *f = g ;
    
        if(e==NULL)
        {
            printf("Allocation failed\n");
            exit(EXIT_FAILURE);
        }
        else
        {
            if(is_emptyQ(f))
            {
                e->value = x;
                e->next = f;
                return e;
            }
            else
            {
                while(f->next != NULL)
                    f= f->next;
                e->value =x;
                f->next =e;
                e->next=NULL;
                return g;
            }
        }
    }
    
    /*--------------------------*/
    Queue dequeue(Queue f)
    {
        if(is_emptyQ(f))
    
        {
            puts("The queue is empty\n");
            return f;
        }
        queueElement *e = f ;
        f=f->next;
        e->next =NULL;
        free(e);
        return f;
    }
    /*-----------------------*/
    int vertexQ(Queue f)
    {
        return f->value;
    }
    
    
    /*-----------------------*/
    
    void printQ(Queue p)
    {
       if(is_emptyQ(p))
        {
            puts("The queue is empty\n");
            return;
        }
        while(p != NULL)
        {
            printf("%d > ",p->value);
            p=p->next;
        }
        printf(" nil\n");
    }
    
    /*-----------------------*/
    
    tree create_tree(int val)
    {
        node *e =(node *)malloc(sizeof(node));
        if(e==NULL)
        {
            fprintf(stderr,"allocation failed");
            return NULL;
        }
        e->value = val ;
        e->right = NULL;
        e->left = NULL;
    
    
        printf("create node : %d\n",val);
        return e;
    }
    
    /*-------------------------------------------------*/
    
    tree getRight(tree a)
    {
        if( a == NULL )
            return NULL;
        else
    		return a->right;
    }
    /*------------------------------*/
    
    tree getLeft(tree a)
    {
        if(a == NULL)
            return NULL;
        else
    		return a->left;
    }
    /*--------------*/
    
    int isLeaf(tree a)
    {
        if (getRight(a)== NULL && getLeft(a)== NULL)
            return !0;
        return 0;
    }
    /*------------------------------*/
    int isNode(tree a)
    {
        if(isLeaf(a))
            return 0;
        return !0;
    }
    
    /*--------------------------------*/
    
    
    void addElement(tree a ,int x)
    {
        if (a== NULL)    {
            a = create_tree(x);
        }
        else if (a->value != x)
        {
    
            if(x > a->value){
    
                    if (a->right != NULL){
                        addElement(a->right,x);
                    } else {
                        a->right = create_tree(x);
                    }
    
            } else if(x < a->value){
    
                if (a->left != NULL){
                        addElement(a->left,x);
                    } else {
                        a->left = create_tree(x);
                    }
            }
    
        }
    
        return;
    }
    
    /*--------------------------------*/
    
    tree searchNode(tree a, int x)
    {
        if (a== NULL){
            //printf("node %d doesn't exist\n",x);
            return a;
        }
    
        else if (a->value == x)
        {
            //printf("node %d exist\n",x);
            return a;
        }
        else if (a->value < x)
        {
            return searchNode(getRight(a),x);
        }
        else
        {
            return searchNode(getLeft(a),x);
        }
    }
    
    /*--------------------------------*/
    
    
    void LevelOrderTraversal(tree a)
    {
       // creer une file
         Queue f = create_Queue();// create queue
    
         tree tmp = a;  // current tree
    
         int x;
    
         if (a!= NULL){
    
         f= enQueue(f,tmp->value); // enqueue
         //printQ(f);
    
         while(!is_emptyQ(f))  // if not empty queue
         {
            x= vertexQ(f);
            tmp = searchNode(a,x);
            //printf("sommet arbre : %d\n",tmp->value);
            //printf("tmp->value : %d\n",tmp->value);
            //printf("sommet file : %d\n",vertexQ(f));
            printf("%d ",vertexQ(f));
            f= dequeue(f);  //dequeue
            if(isNode(tmp)){
    
                f= enQueue(f,tmp->left->value); // enqueue left child
               //  printQ(f);
                f= enQueue(f,tmp->right->value);  // enqueue  right child
            }
    
            //printQ(f);  //print queue
    
         }
    
         }
    }
    
    
    
    
    int main()
    {
        int x = 10;
    
        tree a = create_tree( x );
    
    	addElement( a, 8 );
    	addElement( a, 12 );
    	addElement( a, 9 );
        addElement( a, 7);
        addElement( a, 11);
        addElement( a, 13);
     addElement( a, 14); addElement( a, 15); LevelOrderTraversal(a); return 0; }



    -
    Edité par MamchaouiBenaouda 19 août 2017 à 1:42:50

    • Partager sur Facebook
    • Partager sur Twitter
      19 août 2017 à 17:59:20

      Hello,

      Tu devrais faire ça autrement, plutôt que balancer un pavé comme le tien, que peu de gens auront envie de lire: * écrire une fonction, la tester et, après être certain qu'elle est sure, écrire la suivante, et retour en *

      De plus, cacher des pointeurs derrière des typedef, c'est la merde mouise assurée rapidement.

      -
      Edité par edgarjacobs 19 août 2017 à 18:02:31

      • Partager sur Facebook
      • Partager sur Twitter

      On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

        22 août 2017 à 16:11:45

        ec ce que t'as esseyer de executer le programe

        donc le probleme c lorque je cache les pointeur ?

        • Partager sur Facebook
        • Partager sur Twitter
          22 août 2017 à 16:19:19

          MamchaouiBenaouda a écrit:

          ec ce que t'as esseyer de executer le programe → non. Et toi, as-tu suivi mon conseil ?

          donc le probleme c lorque je cache les pointeur ? → pas spécialement, mais c'est à mon sens une mauvaise pratique.



          • Partager sur Facebook
          • Partager sur Twitter

          On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

            22 août 2017 à 16:39:30

            Bonjour,

            Teste si tes tmp->left et tmp->right existent avant de faire des opérations dessus (après le if(isNode(tmp)), l'erreur vient probablement de là.

            • Partager sur Facebook
            • Partager sur Twitter
              25 août 2017 à 15:53:54

              j'ai fait undbuggage est sa ma donnée un résulta j'usqu'a 11 c-a-d  10 8 12 9 7 11 est apres u e fait l'erreur je ne peut pas comprendre pourquoi tmp->rirght et tmp->left marche pour les premier noeud et donne une erreur pour les autres
              • Partager sur Facebook
              • Partager sur Twitter

              Erreur de segmentation

              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
              • Editeur
              • Markdown