Creation arbre avec liste - C - Programmation
Marsh Posté le 27-12-2005 à 17:07:22
en clair, ce que tu veux, c'est un arbre dont les feuilles sont des lettres et dont le chemin d'accès correspond à leur code en morse ?
Marsh Posté le 27-12-2005 à 17:08:01
theshockwave a écrit : en clair, ce que tu veux, c'est un arbre dont les feuilles sont des lettres et dont le chemin d'accès correspond à leur code en morse ? |
Oui c'est exactement ça
Marsh Posté le 27-12-2005 à 17:14:40
Je ne m'y connais pas en morse, mais j'imagine qu'il n'y aura pas une lettre associée à chaque noeud ...
normalement, avec un algorithme récursif, tu devrais t'en sortir. Tu prends chacune des lettres et tu appliques ton algo à son chemin. Ton algo devra simplement s'assurer que tout noeud par lequel il passe est créé (et le créer s'il ne l'est pas) et positionner la lettre en question au bout du chemin.
essaye de faire les premiers pas, on t'aidera si tu as du mal
Marsh Posté le 27-12-2005 à 17:17:41
theshockwave a écrit : Je ne m'y connais pas en morse, mais j'imagine qu'il n'y aura pas une lettre associée à chaque noeud ... |
jvé essayé merci
Marsh Posté le 27-12-2005 à 17:40:01
theshockwave a écrit : Je ne m'y connais pas en morse, mais j'imagine qu'il n'y aura pas une lettre associée à chaque noeud ... |
J'ai un soucis j'arrive pas à continuer à partir d'ici en je ne sais pas comment faire pr extraire un caractere d'une chaine
voila ce que j'ai :
Code :
|
Marsh Posté le 27-12-2005 à 17:45:49
attention : NULL est une valeur particulière désignant une adresse invalide pour un pointeur. Dans ta fonction estVide, tu la compares à ta structure de noeud et ca n'a pas de sens.
là, tu pars sur une base itérative, je ne dis pas que c'est impossible à faire, mais ce sera probablement moins naturel que de l'écrire en récursif. quel est le type de l ? Liste n'est pas un type standard
(pour ton problème d'extraction, il s'agit simplement de parcourir la chaine, normalement : tu prends un pointeur sur le premier élément puis tu le fais avancer jusqu'à rencontrer le 0 terminal)
Marsh Posté le 27-12-2005 à 17:53:35
theshockwave a écrit : attention : NULL est une valeur particulière désignant une adresse invalide pour un pointeur. Dans ta fonction estVide, tu la compares à ta structure de noeud et ca n'a pas de sens. |
Code :
|
Le problème du estVide je ne voit pas comment faire pr le résoudre sinon pr le traitement récursif c'est un peu hard pr mon niveau.Dans ce cas, faudra que je modifie les valeurs en param. Je ne sais pas.
Pourrait tu me donnez un coup de main avec ce que je vbien de de présenter
Marsh Posté le 27-12-2005 à 18:03:21
le estVide comme tu le vois aurait plutôt cette forme là :
Code :
|
le récursif a un nom qui peut faire peur quand on n'en a pas fait, mais tu verras, ce n'est pas si compliqué que ca
sinon, diverses remarques :
* p n'est pas incrémenté dans el bon bloc => boucle infinie.
* ta liste de chaines de caractères n'est pas parcourue (pas d'incrémentation du pointeur sur le premier élément)
* il manque le return pour ton arbre
* acre vaut NULL quand tu t'embarques dans ta création d'arbre.
* Comment vas-tu remonter à la racine de l'arbre après avoir fait ton parcours pour la première lettre ?
Marsh Posté le 27-12-2005 à 18:05:30
Avec les modifs
Code :
|
Marsh Posté le 27-12-2005 à 18:10:04
pr remonter à la racine je ne compren pas le concept je sais pas comment faire.
Peut tu m'expliquer
Marsh Posté le 27-12-2005 à 18:14:14
ilf aut simplement que tu prévoies de garder un pointeur sur la racine de côté (ce que tu vas retourner) qui soit une variable différente de celle qui te sert à parcourir ton arbre ...
(note que ton appel à estVideA est invalide puisque l'argument que tu lui donnes est du type "Arbre" alors qu'il attent un "Arbre *" ... inutile de déréférencer ta variable a pour cet appel, donc)
essaye de découper un peu plus le procédé. Ca rendra ton code plus lisible. Avoir ta fonction de création qui itère sur les éléments de la liste et fait ensuite appel à une autre fonction pour l'insertion d'un élément de la liste dans l'arbre serait probablement une bonne chose, non ?
Marsh Posté le 27-12-2005 à 18:22:49
coup de pouce :
Arbre Creer(Arbre a, liste l) : |
voilà en gros le procédé que tu devrais avoir pour du récursif
Edit : je te l'accorde, ce n'est pas très formel ... mais c'est juste pour présenter brièvement l'idée. A toi d'écrire ca en C ... Attention aux types (je me suis permis quelques écarts de ce point de vue là)
Marsh Posté le 27-12-2005 à 18:33:36
theshockwave a écrit : coup de pouce :
|
Pourrais tu me dire à que représente creerArbre. A moins que ce soit la meme que creer
Merci pr le code
Marsh Posté le 27-12-2005 à 18:35:06
creerArbre serait en fait une méthode d'allocation et d'initialisation d'un arbre (mettre les fils à NULL est une étape à ne pas oublier )
Marsh Posté le 27-12-2005 à 18:53:37
theshockwave a écrit : creerArbre serait en fait une méthode d'allocation et d'initialisation d'un arbre (mettre les fils à NULL est une étape à ne pas oublier ) |
Voila j'ai fini peut tu y jeter un coup d'oeil STP
Code :
|
Merci
Marsh Posté le 27-12-2005 à 20:59:08
awww ... je me suis fourvoyé en relisant ton code ... Je me suis fait avoir par le typedef ... désolé
Erm, pour éviter les ennuis, soit tu remplaces Arbre par Noeud dans ce fichier, soit tu ajoutes en début de fichier (ou dans arbre.h) :
Code :
|
(auquel cas tu devras garder en tête la différence qu'il y a à mettre une majuscule à Arbre ou non, ce qui n'est pas terrible pour la lisibilité)
pour créerArbre, il faut que cette fonction puisse modifier l'argument qu'on lui passe dans le contexte de la fonction appelante. Il faut donc passer un pointeur sur le pointeur d'arbre que tu désires modifier :
Code :
|
j'en profite pour te refaire ta fonction estVide() :
Code :
|
Pour la fonction d'insertion, j'espère que tu as saisi le principe en l'écrivant ... En tout cas, on ne fait pas un strcmp pour voir si on a atteint la fin, mais on regarde simplement si la valeur pointée est nulle. Attention aux déréférencements, par contre : tu changes le type. Tu dois bien voir que p est du même type que morse, donc si tu déréférence p au moment où tu le passes en paramètre à ta fonction, alors tu n'as pas le type attendu
Ensuite, modifier morse directement ne modifiera pas les données du contexte appelant, donc créer une variable p ne sert pas vraiment
Code :
|
et maintenant, pour la fonction elle-même, j'ai de gros doute sur la manière dont tu parcours ta liste (et d'ailleurs, tu n'as toujours pas répondu à ma question à ce sujet : où est la définition de Liste ?)
Marsh Posté le 29-12-2005 à 17:24:48
theshockwave a écrit : awww ... je me suis fourvoyé en relisant ton code ... Je me suis fait avoir par le typedef ... désolé
|
Excuse je rempli ma liste a partir d'un fichier je v tenvoyé le code que j'ai reussi a faire pour la liste juste un soucis avec le ajout kant je le fait a part tu verra c un pe brouillon mais ca fontionne
fichier typeliste.h
Code :
|
fichier liste.c
Code :
|
fichier qui teste princliste.c
Code :
|
Il ya aussi le fichier liste.h mais bon tu sait que j'y ai mit seulement les entetes de fonctions voila mnt tu as tout ce que j'ai si tu ne compren pas di le moi pr la liste pr l'arbre par contre jai un blocage mais je verrai
Tiens moi o courant si ca ne tiens pas la route
Marsh Posté le 29-12-2005 à 17:29:39
Excuse moi en parlant de lhistoire du typedef j'ai ceci
fichier typearbre.h
#ifndef TYPEARBRE_H
#define TYPEARBRE_H
#include <stdio.h>
#include <stdlib.h>
struct noeud
{
char lettre;
struct noeud* fdroit;
struct noeud* fgauche;
};
typedef struct noeud Noeud;
typedef Noeud* Arbre;
#endif
tOn code ne fonctionnera pas il y aura des soucisde poiinteurs Type différents avec mon typedef
Marsh Posté le 27-12-2005 à 16:40:09
Bonjour
Je dois créer un arbre avec une liste contenant un code morse déja rempli.
Exemple:
Ma liste contient par exemple
A .-
B -...
C -.-.
etc ....
Déclaration de l'arbre
Avec cette déclaration, a chaque fois que je vais par exemple sur le fils gauche je dois l'aasocier à un "-" sous entendu pr pouvoir faire mes recherches sur la liste et récupérer la lettre correspondante.
Pour fils droit je dois "."
Je ne sait pas comment faire ou par ou commencé car je sui un peu perdu et compren pas comment faire pr sous entendre que droit c un "." et gauche "-"