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 :

pointeur vers noeud parent dans un arbre


Sujet :

C++

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 299
    Points : 140
    Points
    140
    Par défaut pointeur vers noeud parent dans un arbre
    Bonjour,

    je travaille avec les arbres en c++, j'ai du mal à voir comment créer un pointeur vers le parent. Je travaille avec une plateforme donc mon code est différent d'un code normal en c++.

    Dans une classe j'ai :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Element { //Classe représentant l'arbre
    	Element * STr; //pointeur vers sous arbre droit
    	Element * STl; //pointeur vers sous arbre gauche
    	Element * nodeFather;//pointeur vers le père
    	int posGap; //position o๠les gaps commencent
    	int lengthGap; //nombre gaps [nbSequence]
    	int indexSequence; //numero de la séquence pour la feuille
    	int sizeTab;//taille du tableau tabSequenceInST
    	//int *tabSequenceInST;//index des séquences dans le sous arbre
    	int tabSequenceInST[50];
     
    }
    Je ne vois pas du tout comment créé le pointeur vers le noeud parent.

    Pour plus d'info sur le code demander moi, car avec le format de fichier de la plateforme c'est pas évident de voir.

    Merci

    Alaninho

  2. #2
    Membre confirmé Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    Points : 616
    Points
    616
    Par défaut
    Pourquoi est-ce que tu as besoin de pointer vers le parent au juste?

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 113
    Points : 32 958
    Points
    32 958
    Billets dans le blog
    4
    Par défaut
    Bonjour,

    en quoi ton code est "particulier" ?

    Le pointeur vers le noeud parent, c'est nodeFather.
    Il faut "juste" lui assigner la bonne valeur.
    Où se situe le problème ?
    Comment tu crées les fils ?
    C'est une information à fournir aux enfants à leur création.
    De quelle interface disposes-tu autour de ça ?
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 299
    Points : 140
    Points
    140
    Par défaut
    En faite, je dois réaliser des croisements dans l'arbre, c'est à dire échangé 2 nœuds. Jusqu'ici tout va bien, mais ensuite je dois changer les caractéristiques des Eléments du dessus en fonction des nœuds échangés.

    Voici mon code pour la construction de mon arbre :

    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
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    void fullTreeInit(Element * elt, int depthTreeCurrent, int randDepth, vector<Element*>& leaves, int nbSeqByST, int *tabSeq, string * aligt, int racine){ //si le noeud est la racine, racine=0 sinon racine=1
    	//cout<<"nbSeqByST : "<<nbSeqByST<<endl;
    	//cout<<"randDepth : "<<randDepth<<endl;
    	if(depthTreeCurrent==randDepth){
    		elt->STl=NULL;
    		elt->STr=NULL;
    		elt->posGap=-1;
    		elt->lengthGap=-1;
    		//elt->tabSequenceInST=NULL;
    		elt->sizeTab = nbSeqByST;
    		if(nbSeqByST==1){
    			elt->indexSequence=tabSeq[0];
    			//elt->tabSequenceInST=(int*)malloc(elt->sizeTab*sizeof(int));
    			memcpy( elt->tabSequenceInST, tabSeq,  sizeof(elt->tabSequenceInST) );
    			//elt->tabSequenceInST=tabSeq;
    		}
    		else{
    			elt->indexSequence=-1;
    			//elt->tabSequenceInST=NULL;
    		}
    	}
    	else{
    		//création des 2 sous arbres
    		elt->STl = new Element();
    		elt->STr = new Element();
    		elt->sizeTab = nbSeqByST;
    		elt->indexSequence=-1;
    // 		cout<<"test"<<endl;
    // 		for(int i=0;i<elt->sizeTab;i++){
    // 			cout<<"tabSeq : "<<tabSeq[i]<<endl;
    // 		}
     
     
     
    		if(nbSeqByST!=0){
    			memcpy( elt->tabSequenceInST, tabSeq,  sizeof(elt->tabSequenceInST));
    		}
     
    		//on n'ajoute pas de gap sur un noeud contenant toutes les séquences
    		if(nbSeqByST==nbSequence){
    			elt->posGap=-1;
    			elt->lengthGap=-1;
    		}
    		else{
    			int minLength=min(nbSeqByST, tabSeq);
    			if(tossCoin(1.0)){
    				elt->posGap=random(0, minLength+1);//choix au hasard d'un nombre pour la position des gaps
    				elt->lengthGap=rand() %10+1;//nombre au hasard pour le nombre de gaps ajoutés
    				for(int j=0;j<nbSeqByST;j++){
    					int idSeq = tabSeq[j];
    					string seqGap=aligt[idSeq];
    					string newSeqGap="";
    					aligt[idSeq]=addGap(seqGap, seqGap.size(), elt->posGap, elt->lengthGap, newSeqGap);
    				}
    			}
    			else{
    				elt->posGap=-1;
    				elt->lengthGap=-1;
    			}
    		}
     
    		int sizeTabL=0;
    		int sizeTabR=0;
    		int nbLeavesCurrent = expo(2, randDepth-depthTreeCurrent);//nombre de feuilles à* la fin du sous arbre
     
    		sizeTabL=random(0, nbSeqByST+1);
    		sizeTabL=seqShareRandom(nbLeavesCurrent, nbSeqByST, sizeTabL);
    		sizeTabR=nbSeqByST-sizeTabL;
     
    		//tableau avec les séquences se trouvant dans le sous arbre
    		int tabSTr[sizeTabR];
    		int tabSTl[sizeTabR];
     
     
    		//ajout au hasard des séquences dans les tableaux contenant les séquences dans le sous arbre
    		int r=0;
    		int l=0;
    		for(int i=0; i<nbSeqByST; i++){
    			int a=random(0,2);
    			if(a==0 && l<sizeTabL){
    				tabSTl[l]=tabSeq[i];
    				l++;
    			}
    			else{
    				if(r<sizeTabR){
    					tabSTr[r]=tabSeq[i];
    					r++;
    				}
    				else{
    					tabSTl[l]=tabSeq[i];
    					l++;
    				}
    			}
    		}
     
     
    		//initialisation noeud père
     
    		//~ cout<<"ELEMENT"<<endl;
    		//~ cout<<"elt->posGap :"<<elt->posGap<<endl;
    		//~ cout<<"elt->lengthGap : "<<elt->lengthGap<<endl;
    		//~ cout<<"elt->indexSequence : "<<elt->indexSequence<<endl;;
    		//~ cout<<"elt->sizeTab :"<<elt->sizeTab<<endl;
    		//~ cout<<"tabSequenceInST : ";
    		//~ for(int i=0;i<elt->sizeTab;i++){
    			//~ cout<<elt->tabSequenceInST[i]<<"  ";
    		//~ }
    		//~ cout<<endl;
     
    		if(racine==0){
    			elt->STl->nodeFather=NULL;
    			elt->STr->nodeFather=NULL;
    		}
    		else{
     
    			elt->STl->nodeFather=new Element();
    			elt->STl->nodeFather->posGap=elt->posGap;
    			elt->STl->nodeFather->lengthGap=elt->lengthGap;
    			elt->STl->nodeFather->indexSequence=elt->indexSequence;
    			elt->STl->nodeFather->sizeTab=elt->sizeTab;
    			memcpy( elt->STl->nodeFather->tabSequenceInST, elt->tabSequenceInST,  sizeof(elt->STl->nodeFather->tabSequenceInST));
    			elt->STl->nodeFather->STl = new Element();
    			elt->STl->nodeFather->STl->sizeTab=elt->STl->sizeTab;
    			cout<<"elt->STl->nodeFather->STl->sizeTab : "<<elt->STl->nodeFather->STl->sizeTab<<endl;
    			memcpy(elt->STl->nodeFather->STl->tabSequenceInST, elt->STl->tabSequenceInST, sizeof(elt->STl->nodeFather->STl->tabSequenceInST));
    			cout<<"tabSequenceInST : ";
    			for(int j=0;j<elt->STl->nodeFather->STl->sizeTab;j++){
    				cout<<elt->STl->nodeFather->STl->tabSequenceInST[j]<<"  ";
    			}
    			cout<<endl;
     
    			//~ cout<<"NODE FATHER ENFANT LEFT"<<endl;
    			//~ cout<<"elt->STl->nodeFather->posGap :"<<elt->STl->nodeFather->posGap<<endl;
    			//~ cout<<"elt->STl->nodeFather->lengthGap : "<<elt->STl->nodeFather->lengthGap<<endl;
    			//~ cout<<"elt->STl->nodeFather->indexSequence : "<<elt->STl->nodeFather->indexSequence<<endl;;
    			//~ cout<<"elt->STl->nodeFather->sizeTab :"<<elt->STl->nodeFather->sizeTab<<endl;
    			//~ cout<<"tabSequenceInST : ";
    			//~ for(int j=0;j<elt->STl->nodeFather->sizeTab;j++){
    				//~ cout<<elt->STl->nodeFather->tabSequenceInST[j]<<"  ";
    			//~ }
    			//~ cout<<endl;
     
     
     
    			//elt->STr->nodeFather=&*elt;
     
    			elt->STr->nodeFather=new Element();
    			elt->STr->nodeFather->posGap=elt->posGap;
    			elt->STr->nodeFather->lengthGap=elt->lengthGap;
    			elt->STr->nodeFather->indexSequence=elt->indexSequence;
    			elt->STr->nodeFather->sizeTab=elt->sizeTab;
    			memcpy( elt->STr->nodeFather->tabSequenceInST, elt->tabSequenceInST,  sizeof(elt->STr->nodeFather->tabSequenceInST));
    			elt->STr->nodeFather->STr = new Element();
    			elt->STr->nodeFather->STr->sizeTab=elt->STr->sizeTab;
    			memcpy(elt->STr->nodeFather->STr->tabSequenceInST, elt->STr->tabSequenceInST, sizeof(elt->STr->nodeFather->STr->tabSequenceInST));
     
     			//~ cout<<"NODE FATHER ENFANT RIGHT"<<endl;
      			//~ cout<<"elt->STr->nodeFather->posGap :"<<elt->STr->nodeFather->posGap<<endl;
      			//~ cout<<"elt->STr->nodeFather->lengthGap : "<<elt->STr->nodeFather->lengthGap<<endl;
      			//~ cout<<"elt->STr->nodeFather->indexSequence : "<<elt->STr->nodeFather->indexSequence<<endl;;
    			//~ cout<<"elt->STr->nodeFather->sizeTab :"<<elt->STr->nodeFather->sizeTab<<endl;
     			//~ cout<<"tabSequenceInST : ";
      			//~ for(int i=0;i<elt->STr->nodeFather->sizeTab;i++){
      				//~ cout<<elt->STr->nodeFather->tabSequenceInST[i]<<"  ";
     			//~ }
      			//~ cout<<endl;
     
    		}	
     
     
    		fullTreeInit(elt->STl, depthTreeCurrent+1, randDepth, leaves, sizeTabL, tabSTl, aligt, 1);
    		fullTreeInit(elt->STr, depthTreeCurrent+1, randDepth, leaves, sizeTabR, tabSTr, aligt, 1);
    	}
    }
    Désolé c'est un peu long. J'ai pas d'interface car la plateforme qui est EASEA me permet pas de la faire.

    Est ce que vous y voyez plus clair?
    Je me demandais si il était possible de copier un pointeur dans un autre?

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 113
    Points : 32 958
    Points
    32 958
    Billets dans le blog
    4
    Par défaut
    Beaucoup trop de code et la lisibilité est pas évidente.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    //création des 2 sous arbres
    		elt->STl = new Element();
    		elt->STr = new Element();
    Tu crées des fils là, pourquoi tu ne leur assignes pas directement leur parent ..?

    Je pense que tu as plus un problème de logique à suivre tes opérations qu'autre chose.
    Mais normalement (et si c'est pas le cas.. wtf ?!), le parent de elt->STx est.. elt.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 299
    Points : 140
    Points
    140
    Par défaut
    Oui, je peux le faire la. Je vais essayer de revoir mon code et ma logique j'y verrai sûrement plus clair. Merci de ton aide, je ferai peut être de nouveau appel à toi demain.

    Merci

    Alaninho

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

Discussions similaires

  1. Sélection du noeud root dans un arbre vide
    Par DaveShot dans le forum SWT/JFace
    Réponses: 0
    Dernier message: 25/05/2010, 15h07
  2. Recuperer les enfants d'un noeud parent dans un treeview
    Par skunkies dans le forum Windows Forms
    Réponses: 8
    Dernier message: 20/01/2009, 15h31
  3. Pointeur vers une table dans une fonction
    Par Chatbour dans le forum Oracle
    Réponses: 2
    Dernier message: 03/05/2007, 13h28
  4. [JTree]noeud parent dans un jtree
    Par wassimb dans le forum Composants
    Réponses: 5
    Dernier message: 22/03/2004, 15h06

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