CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

[C]Creation arborescence

Arabemechant
Arabemechant
Niveau 10
11 décembre 2011 à 12:57:43

Bonjour,

Je fais actuellement un projet en C,qui consiste à créer une arborescence en invite de commande,dans ce genre la :
http://www.generationcyb.net/IMG/jpg/Capturer.jpg
en utilisant des listes doublement chainées.

J'ai donc une structure comme ceci :

typedef struct Elt{
string info;
struct Elt *ps;
struct Elt *ppr;
struct Elt *enfant;
struct Elt *parent;
struct Elt *prof;
}TElt;

Je crée d'abord l’élément racine et le premier élément
pour insérer des éléments dans l'arborescence,je me déplace donc sur un des pointeurs avec une procédure.

Comme par exemple (*pointeur) = (*pointeur) -> ps.

Ensuite,j'alloue de la mémoire a cet emplacement,donc (*pointeur) = (TElt*)malloc(sizeof(TElt))

Puis je met une string dans le champ info,avec strcpy.
Mais la,je suis bloqué,car je ne sais pas comment relier l'élément que je viens de créer sur l’élément duquel je suis parti avec un seul pointeur(ma procédure ne prend qu'un seul pointeur).

Donc ma question est : est-ce que je suis obligé de créer localement un autre pointeur,ou bien est-ce que je peux faire autrement,et si oui comment? :question:
Si vous êtes arrivés jusque la,merci d'avoir lu en tout cas. :hap:

godrik
godrik
Niveau 30
11 décembre 2011 à 18:46:44

Je n'ai pas bien compris ce que tu fais parceque tu ne donnes pas de code. Mais basiquement quand tu as une liste chaine, tu as besoin de conserver un pointeur sur le maillon precedent le maillon que tu cree.

Arabemechant
Arabemechant
Niveau 10
11 décembre 2011 à 22:57:10

Je crois que mon code est trop bordélique pour être analysé,c'est pour ca que j'en ai pas donné de morceaux.
Sinon,y'a pas moyen de faire ca avec 1 seul pointeur? :question:
Du coup je vais être obligé d'en crée un localement... :-(

PS : Ma procédure ressemble a ca :
void Insert(TElt **pi){
int choixInsert = 0;
string y = {0};
while(choixInsert != 5){
printf("\n Tapez 1 pour vous deplacer sur le precedent,2 sur le suivant,3 sur le pere et 4 sur le fils.0 pour inserer,5 pour fermer \n");
scanf("%d",&choixInsert);
switch(choixInsert){
case 0 :

scanf("%s",&y);
strcpy((*pi) -> info,y); //Rentre une string dans le champ info

break;
case 1 :

if((*pi) -> ppr == NULL){
printf("Pas d'element");
(*pi) -> ppr = (TElt*)malloc(sizeof(TElt)); //Crée une case mémoire

}
else{
printf("\n %s ",(*pi) -> info);
(*pi) = (*pi) -> ppr;
(*pi) = (TElt*)malloc(sizeof(TElt));
}
break;

case 2 :
if((*pi) -> ps == NULL){
printf("Pas d'element");
(*pi) -> ps = (TElt*)malloc(sizeof(TElt));
(*pi) = (*pi) -> ps;
}
else{
printf("\n %s ",(*pi) -> info);
(*pi) = (*pi) -> ps;
(*pi) = (TElt*)malloc(sizeof(TElt));
}
break;

case 3 :
if((*pi) -> parent == NULL){
printf("Pas d'element");
(*pi) -> parent = (TElt*)malloc(sizeof(TElt));
}

else{
printf("\n %s ",(*pi) -> info);
(*pi) = (*pi) -> parent;
(*pi) = (TElt*)malloc(sizeof(TElt));
}
break;

case 4 :
if((*pi) -> enfant == NULL){
printf("Pas d'element");
(*pi) -> enfant = (TElt*)malloc(sizeof(TElt));
//(*pi) -> enfant -> parent = (*pi);

(*pi) = (*pi) -> enfant;
}
else{
printf("\n %s ",(*pi) -> info);
while((*pi) -> enfant != NULL){
(*pi) = (*pi) -> enfant;
}
}

break;

default :
break;
}

}

}

La ligne mise en commentaire est un essai malheureux. :hap:

Arabemechant
Arabemechant
Niveau 10
14 décembre 2011 à 13:46:38

j'ai essayé avec un pointeur nul,mais ca marche pas :-(
case 1 :
pN = pi;
if((*pi) -> ppr == NULL){
printf("Pas d'element");
(*pi) -> ppr = (TElt*)malloc(sizeof(TElt)); //Crée une case mémoire
(*pi) = (*pi) -> ppr;
(*pN) -> ps = (*pi);
}
else{
printf("\n %s ",(*pi) -> info);
(*pi) -> ppr = NULL;
(*pi) = (*pi) -> ppr;
(*pi) = (TElt*)malloc(sizeof(TElt));
(*pN) -> ps = (*pi);
(*pi) -> ppr = (*pN);
}

break;

Il rentre bien une string dans le champ info,mais si je fais (*pi) = (*pi) -> ppr puis printf("%s",(*pi) -> info),ca crash. :-(

Arabemechant
Arabemechant
Niveau 10
18 décembre 2011 à 17:23:47

En fait,j'ai un autre problème : comment fait on pour parcourir complètement une arborescence? :doute:
J'ai bien quelques pistes,dont l'utilisation de la profondeur ,mais concrètement je ne sais pas trop comment m'y prendre :(

godrik
godrik
Niveau 30
19 décembre 2011 à 15:33:11

hint: recursivite.

Arabemechant
Arabemechant
Niveau 10
27 décembre 2011 à 23:49:37

Ca m'aide beaucoup. :hap:
Enfin c'est déjà ça,merci quand même.

Sous forums
  • Aide à l'achat Mac
  • Création de sites web
  • Internet
  • Macintosh
  • Création de Jeux
  • Linux
  • Programmation
  • Steam Deck
  • Hardware
La vidéo du moment