Voila, j'ai un problème pour afficher une liste doublement chaîné donc le but est de faire de tri numérique dont voici le code
#include <stdio.h>
#include <stdlib.h>
typedef struct node
{
int info;
struct node *left;
struct node *right;
}Noeud;
Noeud *head,*courant;
int push(int);
int InsertRight(Noeud *);
int InsertLeft(Noeud *);
int push(int data)
{
Noeud *Nn;
int res = 0;
Nn =(Noeud *)malloc(1*sizeof(Noeud));
Nn -> left = Nn -> right = NULL;
Nn -> info = data;
if (head == NULL)
{
head = Nn;
return 1;
}
res = head -> info;
if ( res > data )
{
if ( head -> left == NULL )
{
head -> left = Nn;
return 1;
}
res = InsertLeft(Nn);
}
if ( res < data )
{
if ( head -> right == NULL )
{
head -> right = Nn;
return 1;
}
res = InsertRight(Nn);
}
return 0;
}
int InsertRight(Noeud *fils)
{
Noeud *courant;
for(courant = head; courant ->right; courant = courant -> right )
;
courant -> right = fils;
return 1;
}
int InsertLeft(Noeud *fils)
{
Noeud *courant;
for(courant = head; courant ->left; courant = courant -> left )
;
courant -> left = fils;
return 1;
}
void Is_Vide()
{
if ( head == NULL )
{
puts("Liste est vide \n");
exit(0);
}
}
void print()
{
Noeud *run = head;
Is_Vide();
if (run != NULL)
{
print(run ->left);
printf("%d \n", run -> info);
print(run-> right);
}
}
int main()
{
head = courant = NULL;
push(5); push(9); push(3); push(7);
push(4); push(8); push(2); push(6);
push(2);
print();
puts("\n");
return 0;
}
Comme vous pouvez le voir, on place le 5, puis on compare ce dernier et le nouveau arrivé à savoir le 9 et comme le 9 est plus grand, on le branche
sur le right sinon vers left
On tient ainsi l'arbre suivant
5
3 9
2 4 7 N
1 N 6 8
Le 1, 4, 6 et 8 ont leurs pointeurs à NULL . Le 2 a son left vers 1 mais le right sur Null
Je sais que l'affichage doit se faire en récursive pour avoir en ordre 1,2,3, ....9 mais Erreur de segmentation (core dumped)
Premièrement, ce n'est pas une liste doublement chaînée mais un arbre binaire de recherche. Tu définis une fonction print sans paramêtre et tu l'appelles récursivement avec des paramètres.
Tu dois avoir le noeud courant comme paramètre et tu commences dans le main avec la racine.
- Edité par PierrotLeFou 12 août 2022 à 20:26:54
Le Tout est souvent plus grand que la somme de ses parties.
Revoir aussi ton algo d'insertion : Ce qu'il fait actuellement c'est mettre le premier nœud à la racine puis les plus grands tout à gauche et les plus petits tout à droite. Ce qui fait comme si tu avait deux listes qui partent de la racine.
De plus ligne 39 tu affectes la valeur 1 à res (C'est ce que retourne InsertLeft). Ça risque de fausser le test suivant ligne 42.
Si si avec ton Way, tu es même mon copain maintenant à condition que tu fasse mieux, si si tu peux le faire . Voila un peu d'explication.
On sait que la liste contient des Noeud avec deux pointer next et back, ou right ou left.
Si tu prends un autre Struct disons Info
typedef struct node
{
int info;
struct node *next;
struct node *back;
}Noeud;
typedef struct nodeinfo
{
int tri; /* 0 defaut 1 incr 2 desc */
int total; /* nombre maillon */
Noeud * head, *fin;
}NoeudInfo;
NoeudInfo Info;
NoeudInfo *root = NULL;
Hein, pas mal, non. L'info tient la liste avec ses deux pointers comme qu'on tient une accordéon et mémorise le nombre de maillon de la liste et le type de trie
Tu devrais décider si tes variables ont un nom français ou anglais. next, back, fin, Noeud, NoeudInfo, tri, cela fait brouillon. Choisis-toi un langage, et n'emploie que celui-là.
Pourquoi la variable tri dans struct nodeinfo ? Tu as une liste doublement chaînée: si tu la parcours de head vers fin, tu as l'ordre croissant, de fin vers head l'ordre décroissant.
Edit: le contraire de next c'est previous (celui de back c'est forward)
- Edité par edgarjacobs 15 août 2022 à 0:11:26
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent
Vrai pour le choix de langue mais bon, il se trouve que la copie/coller n'a pas encore l’intelligence de faire la traduction
L’intérêt de NoeudInfo est justement entre autre de ne pas parcourir la liste pour connaitre les nombre des éléments puisqu'il ne te coûte qu'une addition
à chaque insertion ou son contraire. De même, avec le flag tri, tu as pas besoin de relancer la fonction si la liste est déjà dans ce mode
Bon, l'heure de dodo, je vais mettre un peu de l'ordre dans tout ça avant de te le partager en Chinois
L’intérêt de NoeudInfo est justement entre autre de ne pas parcourir la liste pour connaitre les nombre des éléments puisqu'il ne te coûte qu'une addition à chaque insertion ou son contraire.
Je n'ai pas parlé de la variable total, mais pour moi la variable tri n'est pas nécessaire.
Bonne nuit avec les chinois
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent
Remarques que la structure ne fait pas tout. J'ai utilisé ma structure ici pour un arbre binaire. Je l'ai déjà utilisé pour une liste doublement chaînée. C'est plus qu'une simple question de noms de variables. J'avais appelé le tableau "ways" du nom "links".
Pour être efficace, un arbre binaire de recherche (ABR) doit être balancé.
C'est-à-dire que la différence de profondeur de tous les sous-arbres doit être au plus de 1.
Ton champs tri pourrait servir pour les arbres bicolores:
Le recherche dans les arbres binaires est également efficace dans les arbres quasi-équilibrés, où les hauteurs des sous-arbres gauche et droite d'un noeud sont presque de la même longueur (à un facteur constant près, pas forcément 1). Et le quasi-équilibre est moins coûteux à maintenir dans les ajouts et supressions.
Et oui, google n'est plus mon ami sur un simple problème de makefile.
Oser demander pourquoi et vous allez le payer de votre temps
Merci
Print d'une liste doublement chaîné
× 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.
Le Tout est souvent plus grand que la somme de ses parties.
Le Tout est souvent plus grand que la somme de ses parties.
Le Tout est souvent plus grand que la somme de ses parties.
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent
Le Tout est souvent plus grand que la somme de ses parties.
Le Tout est souvent plus grand que la somme de ses parties.