Supprimer un noeud d'un arbre / problème de déclaration
Répondre à la discussion
Affichage des résultats 1 à 21 sur 21

Supprimer un noeud d'un arbre / problème de déclaration



  1. #1
    VeryCuriousMan

    Supprimer un noeud d'un arbre / problème de déclaration


    ------

    Bonsoir à tous.
    Voici la fonction pour supprimer un noeud d'un arbre binaire de recherche:

    Code:
    noeud Supprimer(noeud **arbre, int info){
    >-------noeud *noeud = arbre;
    >-------noeud *pere = &arbre;
    >-------noeud *nouveau_noeud;
    >-------noeud *nouveau_pere;
    >-------while(noeud != NULL){
    >------->-------if(info == noeud->info){
    >------->------->-------break;
    >------->------->-------}
    >------->------->-------if(info < noeud->info){
    >------->------->------->-------pere = &noeud->left;
    >------->------->------->-------noeud = noeud->left;
    >------->------->-------}else
    >------->------->-------{
    >------->------->------->-------pere = &noeud->right;
    >------->------->------->-------noeud = noeud->right;
    >------->------->-------}
    >------->-------}
    >------->-------if (noeud != NULL){
    >------->------->-------if (noeud->left == NULL){
    >------->------->------->-------if (noeud->right == NULL){
    >------->------->------->------->-------*pere = NULL;
    >------->------->------->------->-------free(noeud);
    >------->------->------->-------}
    >------->------->------->-------else
    >------->------->------->-------{
    >------->------->------->------->-------*pere =noeud -> right;
    >------->------->------->------->-------free(noeud);
    >------->------->------->-------}
    >------->------->-------}
    >------->------->-------else{
    >------->------->------->-------if (noeud->right == NULL){
    >------->------->------->------->-------*pere = noeud->left;
    >------->------->------->------->-------free(noeud);
    >------->------->------->-------}
    >------->------->-------else
    >------->------->-------{
    >------->------->------->-------nouveau_noeud = noeud->right;
    >------->------->-------nouveau_pere= &noeud->right;
    >------->------->-------while(nouveau_noeud!= NULL)
    >------->------->------->-------if (nouveau_noeud->left != NULL){
    >------->------->------->------->-------nouveau_pere = &nouveau_noeud->left;
    >------->------->------->------->-------nouveau_noeud = nouveau_noeud->left;
    >------->------->------->-------}
    >------->------->-------noeud->info = nouveau_noeud->info;
    >------->------->-------*nouveau_pere = nouveau_noeud->right;
    >------->------->-------free(nouveau_noeud);
    >------->-------}
    >-------}
    }
    return arbre;
    }
    Seulement dès que je compile j'ai ce message:
    binaire.c:94: warning: initialization from incompatible pointer type
    binaire.c:95: error: ‘pere’ undeclared (first use in this function)
    binaire.c:95: error: (Each undeclared identifier is reported only once
    binaire.c:95: error: for each function it appears in.)
    binaire.c:96: error: ‘nouveau_noeud’ undeclared (first use in this function)
    binaire.c:97: error: ‘nouveau_pere’ undeclared (first use in this function)

    Je ne comprends pas d'où viennent ces problèmes de déclaration, sachant qu'au début j'ai bien déclaré pere, nouveau_noeud et nouveau_pere de type noeud ..
    Merci d'avance pour votre aide

    -----

  2. #2
    Chanur

    Re : Supprimer un noeud d'un arbre / problème de déclaration

    Bonjour,
    Ce serait bien que tu postes effectivement le code que tu as compilé.
    Parce que là :
    - il n'y a pas 94 lignes et on ne peut donc pas savoir quel ligne ton compilateur indique
    - moi, si je met des >------- dans un programme, mon compilateur va avoir une crise cardiaque
    - on n'a pas la définition de "noeud"
    - dès la deuxième et la troisième ligne il y a des erreurs :
    ligne 2 tu affectes un pointeur noeud** à un pointeur noeud*
    ligne 3 tu affectes un pointeur noeud*** à un pointeur noeud*
    Ce qui se conçoit bien s'énonce clairement ; et les mots pour le dire arrivent aisément.

  3. #3
    VeryCuriousMan

    Re : Supprimer un noeud d'un arbre / problème de déclaration

    Re,
    Je rajoute le typedef pour la définition de "nœud" ainsi que les lignes correspondantes.

    Structure :
    Code:
    typedef struct noeud
    {
    int info;
    struct noeud * left; 
    struct noeud * right;
    }noeud;
    fonction supprimer noeud:
    Code:
    1.noeud Supprimer(noeud **arbre, int info){
    2.noeud *noeud = arbre;
    3.noeud *pere = &arbre;
    4.noeud *nouveau_noeud;-
    5.noeud *nouveau_pere;
    6.while(noeud != NULL){
    7.if(info == noeud->info){
    8.break;
    9.}
    10.if(info < noeud->info){
    11.pere = &noeud->left;
    12.noeud = noeud->left;
    13.}else
    14.{
    15.pere = &noeud->right;
    16.noeud = noeud->right;
    17.}
    18.}
    19.if (noeud != NULL){
    20.if (noeud->left == NULL){
    21.if (noeud->right == NULL){
    22.*pere = NULL;
    23.free(noeud);
    24.}
    25.else
    26.{
    27.*pere =noeud -> right;
    28.free(noeud);
    29.}
    30.}
    31.else{
    32.if (noeud->right == NULL){
    33.*pere = noeud->left;
    34.free(noeud);
    35.}
    36.else
    37.{
    38.nouveau_noeud = noeud->right;
    39.nouveau_pere= &noeud->right;
    40.while(nouveau_noeud!= NULL)
    41.if (nouveau_noeud->left != NULL){
    42.nouveau_pere = &nouveau_noeud->left;
    43.nouveau_noeud = nouveau_noeud->left;
    44.}
    45.noeud->info = nouveau_noeud->info;
    46.*nouveau_pere = nouveau_noeud->right;
    47.free(nouveau_noeud);
    48.}
    49.}
    50.}
    51.return arbre;
    52.}
    Et voici les erreurs de compilations:
    Code:
    binaire.c: In function ‘Supprimer’:
    binaire.c:2: warning: initialization from incompatible pointer type
    binaire.c:3: error: ‘pere’ undeclared (first use in this function)
    binaire.c:3: error: (Each undeclared identifier is reported only once
    binaire.c:3: error: for each function it appears in.)
    binaire.c:4: error: ‘nouveau_noeud’ undeclared (first use in this function)
    binaire.c:5: error: ‘nouveau_pere’ undeclared (first use in this function)
    binaire.c:51: error: incompatible types when returning type ‘struct noeud **’ but ‘noeud’ was expected
    J'avoue ne pas être vraiment à l'aise avec les pointeurs donc ça ne m'étonnerait pas d'avoir fait pas mal d'erreur là dessus

    Merci d'avance

  4. #4
    Jack
    Modérateur

    Re : Supprimer un noeud d'un arbre / problème de déclaration

    pas d'indentation: c'est iilisible!

    Code:
    noeud *noeud = arbre;
    Quelle drôle d'idée de donner le même nom à un type et une variable ...

  5. A voir en vidéo sur Futura
  6. #5
    VeryCuriousMan

    Re : Supprimer un noeud d'un arbre / problème de déclaration

    Ah excusez moi, j'avais supprimer l'indentation à cause de la remarque sur le >--------

    Code:
    noeud Supprimer(noeud **arbre, int info){
            noeud *node = arbre;
            noeud *pere = &arbre;
            noeud *nouveau_noeud;-
            noeud *nouveau_pere;
            while(noeud != NULL){
                    if(info == node->info){
                            break;
                    }
                    if(info < node->info){
                            pere = &node->left;
                            node = node->left;
                    }else
                    {
                            pere = &node->right;
                            noeud = node->right;
                    }
            }
            if (node != NULL){
                    if (node->left == NULL){
                            if (node->right == NULL){
                                   *pere = NULL;
                                   free(node);
                            }
                            else
                            {
                            *pere =node -> right;
                                    free(node);
                            }
      }
                     else{
                            if (node->right == NULL){
                                    *pere = node->left;
                                    free(node);
                            }
                            else
                            {
                                    nouveau_noeud = node->right;
                                    nouveau_pere= &node->right;
                                    while(nouveau_noeud!= NULL)
                                            if (nouveau_noeud->left != NULL){
                                                    nouveau_pere = &nouveau_noeud->left;
                                                    nouveau_noeud = nouveau_noeud->left;
                                            }
                                    node->info = nouveau_noeud->info;
                                    *nouveau_pere = nouveau_noeud->right;
                                    free(nouveau_noeud);
                           }
                    }
               }
            return arbre;
    }

  7. #6
    Jack
    Modérateur

    Re : Supprimer un noeud d'un arbre / problème de déclaration

    binaire.c:2: warning: initialization from incompatible pointer type
    Le message est clair: les types sont incompatible. un noeud** est d'un type différent de noeud*

  8. #7
    VeryCuriousMan

    Re : Supprimer un noeud d'un arbre / problème de déclaration

    Alors je fais: noeud *node = *arbre et le message ne s'affiche plus ... mais j'ai toujours ce problème de valeurs indéclarées

  9. #8
    Jack
    Modérateur

    Re : Supprimer un noeud d'un arbre / problème de déclaration

    pour quelle ligne?

  10. #9
    VeryCuriousMan

    Re : Supprimer un noeud d'un arbre / problème de déclaration

    Pour la ligne 3,4 et 5 (pere, nouveau_pere nouveau_noeud)

  11. #10
    Jack
    Modérateur

    Re : Supprimer un noeud d'un arbre / problème de déclaration

    il n'y a pas de raison évidente car tu es justement en train de déclarer ces variables. Il y a moyen d'avoir le code complet?

  12. #11
    VeryCuriousMan

    Re : Supprimer un noeud d'un arbre / problème de déclaration

    Je vous l'envoie par contre pardonnez moi pour les >------- mais c'est la manière d'indenter sur le terminal sur ubuntu

  13. #12
    Jack
    Modérateur

    Re : Supprimer un noeud d'un arbre / problème de déclaration

    ???
    gedit indente très bien sans ces artifices

  14. #13
    VeryCuriousMan

    Re : Supprimer un noeud d'un arbre / problème de déclaration

    En fait c'est bon j'ai réussi à obtenir le code sans les >------
    Voici le code pour créer un arbre binaire et un arbre binaire de recherche avec certaines manipulations (retrait, ajout, ...).
    La fonction qui pose problème est donc la fonction Supprimer

    Code:
    #include <stdio.h>
    #include <stdlib.h>
    typedef struct noeud
    {
    	int info;
    	struct noeud * left;
    	struct noeud * right;
    }noeud;
    
    noeud *cree_noeud(int valeur)
    {
    	noeud *nd=(noeud *)malloc(sizeof(noeud));
    
    	nd->info=valeur;
    	nd->left=NULL;
    	nd->right=NULL;
    
    	return nd;
    }
    
    void insere(noeud **arbre, noeud *nd, char c)
    {
    	noeud *p=*arbre;
    	if (*arbre==NULL) *arbre=nd;
    	else
    	{
    		if (c=='g')
    		{ while (p->left!=NULL) p=p->left;
    			p->left=nd;
    		}
    		if (c=='d')
    		{
    			while(p->right!=NULL) p=p->right;
    			p->right = nd;
    		}
    	}
    }
    
    
    
    void addNode(noeud **tree, int info)
    {
    	noeud *tmpNode;
    	noeud *tmpTree = *tree;
    
    	noeud *elem = malloc(sizeof(noeud));
    	elem->info = info;
    	elem->left = NULL;
    	elem->right = NULL;
    
    	if(tmpTree)
    		do
    		{
    			tmpNode = tmpTree;
    			if(info > tmpTree->info )
    			{
    				tmpTree = tmpTree->right;
    				if(!tmpTree) tmpNode->right = elem;
    			}
    			else
    			{
    				tmpTree = tmpTree->left;
    				if(!tmpTree) tmpNode->left = elem;
    			}
    		}
    		while(tmpTree);
    	else  *tree = elem;
    }
    
    
    int Recherche(noeud *arbre, int info)
    {
    	while(arbre != NULL)
    	{
    		if(info == arbre->info)
    		{
    			return 1;
    		}
    		if(info > arbre->info)
    		{
    			arbre = arbre->right;
    		}
    		else
    		{
    			arbre = arbre->left;
    		}
    	}
    	return 0;
    
    }
    
    
    noeud Supprimer(noeud **arbre, int info){
    	noeud *noeud = *arbre;
    	noeud *pere = &arbre;
    	noeud *nouveau_noeud; 
    	noeud *nouveau_pere;
    	while(noeud != NULL){
    		if(info == noeud->info){
    			break;
    		}
    		if(info < noeud->info){
    			pere = &noeud->left;
    			noeud = noeud->left;
    		}else
    		{
    			pere = &noeud->right;
    			noeud = noeud->right;
    		}
    	}
    	if (noeud != NULL){
    		if (noeud->left == NULL){
    			if (noeud->right == NULL){
    				*pere = NULL;
    				free(noeud);
    			}
    			else
    			{
    				*pere =noeud -> right;
    				free(noeud);
    			}
    		}
    		else{
    			if (noeud->right == NULL){
    				*pere = noeud->left;
    				free(noeud);
    			}
    			else
    			{
    				nouveau_noeud = noeud->right;
    				nouveau_pere= &noeud->right;
    				while(nouveau_noeud!= NULL)
    					if (nouveau_noeud->left != NULL){
    						nouveau_pere = &nouveau_noeud->left;
    						nouveau_noeud = nouveau_noeud->left;
    					}
    				noeud->info = nouveau_noeud->info;
    				*nouveau_pere = nouveau_noeud->right;
    				free(nouveau_noeud);
    			}
    		}
    	}
    	return arbre;
    }
    
    	void afficherArbre(noeud *arbre){  /*Le noeud est affiché sous la forme suivante [g,v,d] g étant le sous arbre gauche, d le sous arbre droit et v la valeur du noeud qui est le parent des 2 sous arbres.*/
    		if(arbre == NULL) 
    			printf("_"); /*Quand un noeud n'a pas de sous arbre, on affiche "_"*/
    		else{
    			printf("[");
    			afficherArbre(arbre->left);
    			printf(",%d,",arbre->info);
    			afficherArbre(arbre->right);
    			printf("]");
    		}
    	}
    
    int main()
    {
    	noeud *arbre = NULL;
    	int choix;
    	int info = 0;
    	int i = 0;
    	char reponseUtilisateur;
    	int valeurAsupprimer = 0;
    	printf("Voulez-vous :\n");
    	printf("1. Générer et afficher un AB ?\n");
    	printf("2. Générer et afficher un ABR et procéder aux diverses manipulations ?\n");
    	scanf("%d",&choix);
    	printf("\n");
    	switch(choix)
    	{
    		case 1:
    			for(i = 0; i < 12; i++){
    				printf("Nous allons donc générer un arbre binaire de recherche (ici à partir de 12 noeuds)\n");
    				do
    				{
    					printf("Voulez vous placez votre noeud à gauche 'g' ou à droite 'd'?\n");
    					scanf("%c",&reponseUtilisateur);
    				}
    				while(reponseUtilisateur != 'g' && reponseUtilisateur!='d');
    				printf("Quelle valeur pour votre noeud: ");
    				if (scanf("%d",&info)!= 1){
    					exit(-1);
    				}
    				noeud *nd=cree_noeud(info);
    				insere(&arbre,nd,reponseUtilisateur);
    			}
    			afficherArbre(arbre);
    			return 0;
    
    			break;
    		case 2:
    			printf("Nous allons donc générer un arbre binaire de recherche (ici à partir de 12 noeuds)\n");
    			printf("Tapez 12 valeurs pour nos noeuds:\n");
    
    			for(i = 0; i < 12; i++)
    			{
    				if(scanf("%d",&info)!= 1){
    					exit(-1);
    				}
    				addNode(&arbre, info);
    			}
    
    			printf("\n");
    			afficherArbre(arbre);
    			printf("\n");
    
    
    			printf("Tapez une valeur afin de vérifier si elle se trouve dans l'arbre ou non");
    			scanf("%d",&info);
    			if(Recherche(arbre, info))
    			{
    				printf("%d existe bien dans l'arbre.\n", info);
    
    			}
    			else
    			{
    				printf("%d n'existe pas dans l'arbre.\n", info);
    			}
    			printf("\n");
    			printf("Quel noeud voulezvous supprimer ?\n");
    			if(scanf("%d",&valeurAsupprimer)!=1){
    				exit(-1);
    			}
    			Supprimer(&arbre, valeurAsupprimer);
    	}
    	return 0;
    }

  15. #14
    Jack
    Modérateur

    Re : Supprimer un noeud d'un arbre / problème de déclaration

    tu as encore laissé noeud *noeud = *arbre; dans la fonction Supprimer()

  16. #15
    VeryCuriousMan

    Re : Supprimer un noeud d'un arbre / problème de déclaration

    ah zut désolé je change ça

  17. #16
    VeryCuriousMan

    Re : Supprimer un noeud d'un arbre / problème de déclaration

    Code:
    #include <stdio.h>
    #include <stdlib.h>
    typedef struct noeud
    {
    	int info;
    	struct noeud * left;
    	struct noeud * right;
    }noeud;
    
    noeud *cree_noeud(int valeur)
    {
    	noeud *nd=(noeud *)malloc(sizeof(noeud));
    
    	nd->info=valeur;
    	nd->left=NULL;
    	nd->right=NULL;
    
    	return nd;
    }
    
    void insere(noeud **arbre, noeud *nd, char c)
    {
    	noeud *p=*arbre;
    	if (*arbre==NULL) *arbre=nd;
    	else
    	{
    		if (c=='g')
    		{ while (p->left!=NULL) p=p->left;
    			p->left=nd;
    		}
    		if (c=='d')
    		{
    			while(p->right!=NULL) p=p->right;
    			p->right = nd;
    		}
    	}
    }
    
    
    
    void addNode(noeud **tree, int info)
    {
    	noeud *tmpNode;
    	noeud *tmpTree = *tree;
    
    	noeud *elem = malloc(sizeof(noeud));
    	elem->info = info;
    	elem->left = NULL;
    	elem->right = NULL;
    
    	if(tmpTree)
    		do
    		{
    			tmpNode = tmpTree;
    			if(info > tmpTree->info )
    			{
    				tmpTree = tmpTree->right;
    				if(!tmpTree) tmpNode->right = elem;
    			}
    			else
    			{
    				tmpTree = tmpTree->left;
    				if(!tmpTree) tmpNode->left = elem;
    			}
    		}
    		while(tmpTree);
    	else  *tree = elem;
    }
    
    
    int Recherche(noeud *arbre, int info)
    {
    	while(arbre != NULL)
    	{
    		if(info == arbre->info)
    		{
    			return 1;
    		}
    		if(info > arbre->info)
    		{
    			arbre = arbre->right;
    		}
    		else
    		{
    			arbre = arbre->left;
    		}
    	}
    	return 0;
    
    }
    
    
    noeud Supprimer(noeud **arbre, int info){
    	noeud *node = *arbre;
    	noeud *pere = &arbre;
    	noeud *nouveau_noeud; 
    	noeud *nouveau_pere;
    	while(node != NULL){
    		if(info == node->info){
    			break;
    		}
    		if(info < node->info){
    			pere = &node->left;
    			node = node->left;
    		}else
    		{
    			pere = &node->right;
    			node = node->right;
    		}
    	}
    	if (node != NULL){
    		if (node->left == NULL){
    			if (node->right == NULL){
    				*pere = NULL;
    				free(node);
    			}
    			else
    			{
    				*pere =node -> right;
    				free(node);
    			}
    		}
    		else{
    			if (node->right == NULL){
    				*pere = node->left;
    				free(node);
    			}
    			else
    			{
    				nouveau_noeud = node->right;
    				nouveau_pere= &node->right;
    				while(nouveau_noeud!= NULL)
    					if (nouveau_noeud->left != NULL){
    						nouveau_pere = &nouveau_noeud->left;
    						nouveau_noeud = nouveau_noeud->left;
    					}
    				node->info = nouveau_noeud->info;
    				*nouveau_pere = nouveau_noeud->right;
    				free(nouveau_noeud);
    			}
    		}
    	}
    	return arbre;
    }
    
    	void afficherArbre(noeud *arbre){  /*Le noeud est affiché sous la forme suivante [g,v,d] g étant le sous arbre gauche, d le sous arbre droit et v la valeur du noeud qui est le parent des 2 sous arbres.*/
    		if(arbre == NULL) 
    			printf("_"); /*Quand un noeud n'a pas de sous arbre, on affiche "_"*/
    		else{
    			printf("[");
    			afficherArbre(arbre->left);
    			printf(",%d,",arbre->info);
    			afficherArbre(arbre->right);
    			printf("]");
    		}
    	}
    
    int main()
    {
    	noeud *arbre = NULL;
    	int choix;
    	int info = 0;
    	int i = 0;
    	char reponseUtilisateur;
    	int valeurAsupprimer = 0;
    	printf("Voulez-vous :\n");
    	printf("1. Générer et afficher un AB ?\n");
    	printf("2. Générer et afficher un ABR et procéder aux diverses manipulations ?\n");
    	scanf("%d",&choix);
    	printf("\n");
    	switch(choix)
    	{
    		case 1:
    			for(i = 0; i < 12; i++){
    				printf("Nous allons donc générer un arbre binaire de recherche (ici à partir de 12 noeuds)\n");
    				do
    				{
    					printf("Voulez vous placez votre noeud à gauche 'g' ou à droite 'd'?\n");
    					scanf("%c",&reponseUtilisateur);
    				}
    				while(reponseUtilisateur != 'g' && reponseUtilisateur!='d');
    				printf("Quelle valeur pour votre noeud: ");
    				if (scanf("%d",&info)!= 1){
    					exit(-1);
    				}
    				noeud *nd=cree_noeud(info);
    				insere(&arbre,nd,reponseUtilisateur);
    			}
    			afficherArbre(arbre);
    			return 0;
    
    			break;
    		case 2:
    			printf("Nous allons donc générer un arbre binaire de recherche (ici à partir de 12 noeuds)\n");
    			printf("Tapez 12 valeurs pour nos noeuds:\n");
    
    			for(i = 0; i < 12; i++)
    			{
    				if(scanf("%d",&info)!= 1){
    					exit(-1);
    				}
    				addNode(&arbre, info);
    			}
    
    			printf("\n");
    			afficherArbre(arbre);
    			printf("\n");
    
    
    			printf("Tapez une valeur afin de vérifier si elle se trouve dans l'arbre ou non");
    			scanf("%d",&info);
    			if(Recherche(arbre, info))
    			{
    				printf("%d existe bien dans l'arbre.\n", info);
    
    			}
    			else
    			{
    				printf("%d n'existe pas dans l'arbre.\n", info);
    			}
    			printf("\n");
    			printf("Quel noeud voulezvous supprimer ?\n");
    			if(scanf("%d",&valeurAsupprimer)!=1){
    				exit(-1);
    			}
    			Supprimer(&arbre, valeurAsupprimer);
    	}
    	return 0;
    }

  18. #17
    VeryCuriousMan

    Re : Supprimer un noeud d'un arbre / problème de déclaration

    Oula ! à présent il n'y a plus les problèmes de déclaration mais c'est bourré de fautes d'incompatibilité de types :
    Code:
    binaire.c: In function ‘Supprimer’:
    binaire.c:95: warning: initialization from incompatible pointer type
    binaire.c:103: warning: assignment from incompatible pointer type
    binaire.c:107: warning: assignment from incompatible pointer type
    binaire.c:114: error: incompatible types when assigning to type ‘noeud’ from type ‘void *’
    binaire.c:119: error: incompatible types when assigning to type ‘noeud’ from type ‘struct noeud *’
    binaire.c:125: error: incompatible types when assigning to type ‘noeud’ from type ‘struct noeud *’
    binaire.c:131: warning: assignment from incompatible pointer type
    binaire.c:134: warning: assignment from incompatible pointer type
    binaire.c:138: error: incompatible types when assigning to type ‘noeud’ from type ‘struct noeud *’
    binaire.c:143: error: incompatible types when returning type ‘struct noeud **’ but ‘noeud’ was expected

  19. #18
    Jack
    Modérateur

    Re : Supprimer un noeud d'un arbre / problème de déclaration

    Code:
    	noeud *node = *arbre;	noeud *pere = &arbre;
    Je te laisse méditer sur ceci ...
    Il me semble évident qu'il y a un problème de compatibilité pour au moins une des 2 lignes.

  20. #19
    VeryCuriousMan

    Re : Supprimer un noeud d'un arbre / problème de déclaration

    Je pense que c'est &arbre qui pose problème. J'ai retiré "&" et j'ai du coup modifié quelques lignes dans la fonction:
    Code:
    noeud Supprimer(noeud **arbre, int info){
    	noeud *node = *arbre;
    	noeud *pere = arbre;
    	noeud *nouveau_noeud; 
    	noeud *nouveau_pere;
    	while(node != NULL){
    		if(info == node->info){
    			break;
    		}
    		if(info < node->info){
    			pere = node->left;
    			node = node->left;
    		}else
    		{
    			pere = node->right;
    			node = node->right;
    		}
    	}
    	if (node != NULL){
    		if (node->left == NULL){
    			if (node->right == NULL){
    				pere = NULL;
    				free(node);
    			}
    			else
    			{
    				pere =node -> right;
    				free(node);
    			}
    		}
    		else{
    			if (node->right == NULL){
    				pere = node->left;
    				free(node);
    			}
    			else
    			{
    				nouveau_noeud = node->right;
    				nouveau_pere= node->right;
    				while(nouveau_noeud!= NULL)
    					if (nouveau_noeud->left != NULL){
    						nouveau_pere = nouveau_noeud->left;
    						nouveau_noeud = nouveau_noeud->left;
    					}
    				node->info = nouveau_noeud->info;
    				nouveau_pere = nouveau_noeud->right;
    				free(nouveau_noeud);
    			}
    		}
    	}
    	return arbre;
    }
    J'ai déjà moins d'erreur mais toujours cette erreur d'incompatibilité au début :'(:
    Code:
    binaire.c: In function ‘Supprimer’:
    binaire.c:95: warning: initialization from incompatible pointer type
    binaire.c:143: error: incompatible types when returning type ‘struct noeud **’ but ‘noeud’ was expected
    J'ai vraiment du mal avec les pointeurs donc je vois vraiment pas pourquoi ça ne marche pas :

  21. #20
    Jack
    Modérateur

    Re : Supprimer un noeud d'un arbre / problème de déclaration

    il faut que tu te prennes en mains. Encore une fois, c'est clairement expliqué dans les messages générés par le compilateur.

  22. #21
    VeryCuriousMan

    Re : Supprimer un noeud d'un arbre / problème de déclaration

    Bon j'ai essayé de résoudre le problème en fonction des messages et je n'ai plus d'erreur:

    Code:
    #include <stdio.h>
    #include <stdlib.h>
    typedef struct noeud
    {
    	int info;
    	struct noeud * left;
    	struct noeud * right;
    }noeud;
    
    noeud *cree_noeud(int valeur)
    {
    	noeud *nd=(noeud *)malloc(sizeof(noeud));
    
    	nd->info=valeur;
    	nd->left=NULL;
    	nd->right=NULL;
    
    	return nd;
    }
    
    void insere(noeud **arbre, noeud *nd, char c)
    {
    	noeud *p=*arbre;
    	if (*arbre==NULL) *arbre=nd;
    	else
    	{
    		if (c=='g')
    		{ while (p->left!=NULL) p=p->left;
    			p->left=nd;
    		}
    		if (c=='d')
    		{
    			while(p->right!=NULL) p=p->right;
    			p->right = nd;
    		}
    	}
    }
    
    
    
    void addNode(noeud **tree, int info)
    {
    	noeud *tmpNode;
    	noeud *tmpTree = *tree;
    
    	noeud *elem = malloc(sizeof(noeud));
    	elem->info = info;
    	elem->left = NULL;
    	elem->right = NULL;
    
    	if(tmpTree)
    		do
    		{
    			tmpNode = tmpTree;
    			if(info > tmpTree->info )
    			{
    				tmpTree = tmpTree->right;
    				if(!tmpTree) tmpNode->right = elem;
    			}
    			else
    			{
    				tmpTree = tmpTree->left;
    				if(!tmpTree) tmpNode->left = elem;
    			}
    		}
    		while(tmpTree);
    	else  *tree = elem;
    }
    
    
    int Recherche(noeud *arbre, int info)
    {
    	while(arbre != NULL)
    	{
    		if(info == arbre->info)
    		{
    			return 1;
    		}
    		if(info > arbre->info)
    		{
    			arbre = arbre->right;
    		}
    		else
    		{
    			arbre = arbre->left;
    		}
    	}
    	return 0;
    
    }
    
    
    noeud Supprimer(noeud **arbre, int info){
    	noeud *node = *arbre;
    	noeud **pere = arbre;
    	noeud *nouveau_noeud; 
    	noeud *nouveau_pere;
    	while(node != NULL){
    		if(info == node->info){
    			break;
    		}
    		if(info < node->info){
    			*pere = node->left;
    			node = node->left;
    		}else
    		{
    			*pere = node->right;
    			node = node->right;
    		}
    	}
    	if (node != NULL){
    		if (node->left == NULL){
    			if (node->right == NULL){
    				*pere = NULL;
    				free(node);
    			}
    			else
    			{
    				*pere =node -> right;
    				free(node);
    			}
    		}
    		else{
    			if (node->right == NULL){
    				*pere = node->left;
    				free(node);
    			}
    			else
    			{
    				nouveau_noeud = node->right;
    				nouveau_pere= node->right;
    				while(nouveau_noeud!= NULL)
    					if (nouveau_noeud->left != NULL){
    						nouveau_pere = nouveau_noeud->left;
    						nouveau_noeud = nouveau_noeud->left;
    					}
    				node->info = nouveau_noeud->info;
    				nouveau_pere = nouveau_noeud->right;
    				free(nouveau_noeud);
    			}
    		}
    	}
    	return **arbre;
    }
    
    	void afficherArbre(noeud *arbre){  /*Le noeud est affiché sous la forme suivante [g,v,d] g étant le sous arbre gauche, d le sous arbre droit et v la valeur du noeud qui est le parent des 2 sous arbres.*/
    		if(arbre == NULL) 
    			printf("_"); /*Quand un noeud n'a pas de sous arbre, on affiche "_"*/
    		else{
    			printf("[");
    			afficherArbre(arbre->left);
    			printf(",%d,",arbre->info);
    			afficherArbre(arbre->right);
    			printf("]");
    		}
    	}
    
    int main()
    {
    	noeud *arbre = NULL;
    	int choix;
    	int info = 0;
    	int i = 0;
    	char reponseUtilisateur;
    	int valeurAsupprimer = 0;
    	printf("Voulez-vous :\n");
    	printf("1. Générer et afficher un AB ?\n");
    	printf("2. Générer et afficher un ABR et procéder aux diverses manipulations ?\n");
    	scanf("%d",&choix);
    	printf("\n");
    	switch(choix)
    	{
    		case 1:
    			for(i = 0; i < 12; i++){
    				printf("Nous allons donc générer un arbre binaire de recherche (ici à partir de 12 noeuds)\n");
    				do
    				{
    					printf("Voulez vous placez votre noeud à gauche 'g' ou à droite 'd'?\n");
    					scanf("%c",&reponseUtilisateur);
    				}
    				while(reponseUtilisateur != 'g' && reponseUtilisateur!='d');
    				printf("Quelle valeur pour votre noeud: ");
    				if (scanf("%d",&info)!= 1){
    					exit(-1);
    				}
    				noeud *nd=cree_noeud(info);
    				insere(&arbre,nd,reponseUtilisateur);
    			}
    			afficherArbre(arbre);
    			return 0;
    
    			break;
    		case 2:
    			printf("Nous allons donc générer un arbre binaire de recherche (ici à partir de 12 noeuds)\n");
    			printf("Tapez 12 valeurs pour nos noeuds:\n");
    
    			for(i = 0; i < 12; i++)
    			{
    				if(scanf("%d",&info)!= 1){
    					exit(-1);
    				}
    				addNode(&arbre, info);
    			}
    
    			printf("\n");
    			afficherArbre(arbre);
    			printf("\n");
    
    
    			printf("Tapez une valeur afin de vérifier si elle se trouve dans l'arbre ou non");
    			scanf("%d",&info);
    			if(Recherche(arbre, info))
    			{
    				printf("%d existe bien dans l'arbre.\n", info);
    
    			}
    			else
    			{
    				printf("%d n'existe pas dans l'arbre.\n", info);
    			}
    			printf("\n");
    			printf("Quel noeud voulezvous supprimer ?\n");
    			scanf("%d",&valeurAsupprimer);
    			Supprimer(&arbre, valeurAsupprimer);
    			printf("\n");
    printf("Voici le nouvel arbre avec le noeud supprimé\n");
    afficherArbre(arbre);
    }
    	return 0;
    }
    Au moins ça compile même si maintenant dans mon programme quand je rentre la valeur à supprimer, j'ai l'impression qu'il y a une boucle infinie car je dois re rentrer une nouvelle valeur à supprimer et ce à chaque fois jusqu'à ce que je cesse le programme

Discussions similaires

  1. probleme de declaration des timers et des interruption
    Par elmhamdi dans le forum Électronique
    Réponses: 1
    Dernier message: 07/04/2012, 18h52
  2. problème de dimensionnement d'arbre en torsion
    Par invite07508323 dans le forum Physique
    Réponses: 0
    Dernier message: 29/04/2010, 15h35
  3. programmation C++, problème déclaration de string
    Par invite1bc1ddb5 dans le forum Logiciel - Software - Open Source
    Réponses: 4
    Dernier message: 10/01/2009, 19h34