Accueil > Forum > > > > Sérialiser un arbre et sauver dans un fichier
Sérialiser un arbre et sauver dans un fichier
samedi 24 avril 2010 à 23:54:37 |
Sérialiser un arbre et sauver dans un fichier

youscoul
|
Bonjour,
Je suis debutant à ce que je vais vous demander. Ne soyez pas étonner si vous me trouvez pas trop clair.
En effet, je dispose d'un arbre N aire très complexe(chq Noeud a 500 fils eux aussi ont 500 fils chacun ainsi de suite), On me demande de serialiser cet arbre et le stocker dans un fichier sur le disque. Si quelqu'un a une idée de ce genre d'algorithme en C.
Voila mon idée:
typedef struct noeud{
int element;//contenu du noeud
struct noeud**pfils;
/* tableau de pointeur vers les 500 fils possibles de ce noeud*/
} noeud;
struct noeud* Arbre;
Je fais une fonction de Creer_Noeud() et une fonction Creer_Fils();
Mon probleme est que je n'ai aucune idée, sur comment construire cet arbre complexe, après le parcourir et le sauver. Merci pour vos aides.
|
|
dimanche 25 avril 2010 à 11:31:05 |
Re : Sérialiser un arbre et sauver dans un fichier
|
dimanche 25 avril 2010 à 11:42:19 |
Re : Sérialiser un arbre et sauver dans un fichier

korsakoff69
|
Réponse acceptée !
peut être quelque chose comme ça
typedef struct NOEUD
{
int iID; // identifiant
NOEUDDATA* pDATA; // données du noeud
int* pTableauFils; // pointeur vers un tableau d'identifiants des neouds fils
} noeud;
puis fonction WriteToDisk pour le noeud
dans lequel tu sauve tes data du noeud
ainsi que les identifiants des fils
NB: il faut que l'intégralité des noeuds fils utilisés soient écrits sur le disque une fois, et d'utiliser les index pour recharger le tout
|
|
dimanche 25 avril 2010 à 23:33:53 |
Re : Sérialiser un arbre et sauver dans un fichier

youscoul
|
Salut Korsakoff,
NB: il faut que l'intégralité des noeuds fils utilisés soient écrits sur le disque une fois, et d'utiliser les index pour recharger le tout
Peux tu être beaucoup plus clair sur ce plan.Aussi je comprend pas ta structure. Quelle est la différence par rapport à celle que j'ai postulé plus haut. Merci
|
|
lundi 26 avril 2010 à 07:48:02 |
Re : Sérialiser un arbre et sauver dans un fichier

korsakoff69
|
dans chaque noeud, tu stocke les données du noeud + 1 identifiant unique pour le noeud
et pour chaque noeud, tu stocke un tableau d'entier qui contient les identifiants des noeuds fils ( index )
pour charger et sauver les fils, tu parcours le tableau d'entier correspondant aux identifiants des noeuds fils, et tu peux donc associer à chaque identifiant dans le tableau un noeud unique pour chacun des ses fils.
quand tu sauve un noeud, tu sauve l'identifiant unique du noeud, et le tableau d'entier des identifiants des noeuds fils.
pour recharger les données, il faut donc que les noeuds fils existent dans le fichier
pour chque noeud, on charge les données du noeuds
pour chacun des ses noeuds fils, on parcourt le tableau d'entier du noeuds, et on charge chaque noeud fils
|
|
lundi 26 avril 2010 à 09:52:33 |
Re : Sérialiser un arbre et sauver dans un fichier

youscoul
|
C'est vraiment gentille tout ce que tu fais. Mais j'ai été clair au debut que c'est une premiere pour moi de travailler avec les arbres surtout avec de telle complexité. Donc si tes explications sont accompagnées de bout de code. Ca ne peut qu'être benefice pour moi et autre personne ayant le même problème dans le futur primo. Secondo, si j'ai plusieurs intervenants sur ce sujet c'est très difficile de coder les propositions de tout un chacun pour qu'il sache que j'ai pris en compte sa proposition.
D'accord d'après ce que tu dis, je suppose que mon arbre est construit (même si j'ai pas de la même manière que toi) et ke je dois le parcourir et le stocker dans un fichier.
voici le code de construction de l'arbre:
Code C/C++ : typedef enum _profondeur_t{ A, B, C, D} prof_t;
typedef struct _noeud_t{
unsigned numero_noeud; // noeud numeroté de 0 à 700 selon son profondeur
unsigned nb_fils;
struct _noeud_t **fils; // tableau de pointeurs vers ses fils
prof_t profond;
struct _noeud_t*pere; // Pour que chq fils connaisse son pere
} noeud_t;
Code C/C++ : typedef struct _arbre_t{
noeud_t *racine;
} arbre_t;
/** ***************************************************************/
/**
@ Construction d'un neoud de l'arbre
*/
noeud_t*
new_noeud(unsigned nb_fils)
{
noeud_t *noeud = (noeud_t*)malloc(sizeof(noeud_t));
noeud->fils =(noeud_t**) calloc(nb_fils,sizeof(noeud_t));
noeud->nb_fils = nb_fils;
return noeud;
}
/**
@ Construction en fonction de son profondeur dans l'arbre
*/
noeud_t*
new_noeud2(prof_t prof_noeud)
{
unsigned nb_fils;
switch(prof_noeud)
{
case A: nb_fils = 64; break;
case B: nb_fils = 64; break;
case C: nb_fils = 700; break;
case D: nb_fils = 700; break;
default: nb_fils = 1; break;
}
return new_noeud(nb_fils);
}
/**
@ Supprimer d'un neoud de l'arbre
*/
void
supprimer_noeud(noeud_t *noeud)
{
unsigned i;
// Appel récursif : on détruit les fils avant le noeud courant
for(i=0;i<noeud->nb_fils;++i)
{
if(noeud->fils[i])
supprimer_noeud(noeud->fils[i]);
}
// On relâche le noeud courant
free(noeud->fils); // relâche le calloc
free(noeud); // relâche le malloc
}
/**
@ Construction d'un fils à partir d'un noeud de l'arbre
*/
// Pour initialiser le index ème fils d'un noeud, il faut désallouer le index ème fils (s'il y en a déjà un)
void
construit_un_fils(noeud_t *noeud, unsigned index, noeud_t *fils)
{
if(index < fils->nb_fils)
{
if(noeud->fils[index])
supprimer_noeud(noeud->fils[index]);
noeud->fils[index] = fils;
}
}
// Et pour récupérer le ième fils d'un noeud :
noeud_t *get_fils(noeud_t *noeud, unsigned i)
{
if(i < noeud->nb_fils)
return noeud->fils[i];
}
Avec ce code je doispouvoir construire mon arbre, mais comment je fais pour inserer les données et surtout une fonction de parcours de l'argent afin de le stocker merci.
|
|
lundi 26 avril 2010 à 09:56:43 |
Re : Sérialiser un arbre et sauver dans un fichier

youscoul
|
Desolé je veux dire une fonction de parcours de l'arbre....!!!!! et non l'argent ke je suis pauvre moi (ke l'argent en tête alors que suis un simple étudiant qui n'a même pas fait la moitié de son cycle LOL)
|
|
lundi 26 avril 2010 à 10:09:59 |
Re : Sérialiser un arbre et sauver dans un fichier

korsakoff69
|
tu devrais regarder un tutoriel sur les listes doublement chaînées
en gros : dans chaque noeud tu stocke un pointeur vers le noeud parent et le noeud fils
voici un exemple de liste simplement chainée que j'utilise avec visual studio c++,
tu peux peut être t'en inspirer
//-----------------------------------------------------------------------------
// Nom: Classe CGameObjectListe
// Desc: liste de GameObjects, avec fonctions de liste
//-----------------------------------------------------------------------------
class CGameObjectListe
{
public:
CGameObjectListe::CGameObjectListe( void ); // constructeur
CGameObjectListe::~CGameObjectListe( void ); // destructeur
CGameObject* AddNewGameObject( int iObjectID ); // ajoute nouvel item
void AddExistingGameObject( CGameObject* pGameObject ); // ajoute item existant
void RemoveGameObjectFromListe( CGameObject* pGameObject ); // supprime item de la liste
CGameObject* FindGameObject( int iObjectID ); // trouve item
void OutputGameObjectListeDebug(); // output iObjectID de l'élément courant
CGameObject* GetGameObjectListHead() { return m_pListeHead; } // renvoie tête de liste
int GetGameObjectCount() { return m_iNbObjects; } // renvoie le nombre total d'objets
/* void DeleteGameObject( int iObjectID ); // supprime item par id
*/
private:
CGameObject* m_pListeHead; // pointeur vers le premier élément créé
int m_iNbObjects; // nombre d'objets créés
};
// les déclarations
/*----------------------------------*/
/* Classe CGameObjectListe */
/* Desc: liste de GameObject */
/*----------------------------------*/
//-----------------------------------------------------------------------------
// constructeur
//-----------------------------------------------------------------------------
CGameObjectListe::CGameObjectListe( void )
{
// OutputDebugString( L"CGameObjectListe::CGameObjectListe() constructeur\n" );
m_iNbObjects = g_static_iNbObject; // nombre total d'objets
m_pListeHead = NULL; // initialise le premier élément de la liste
}
//-----------------------------------------------------------------------------
// destructeur
//-----------------------------------------------------------------------------
CGameObjectListe::~CGameObjectListe( void )
{
// OutputDebugString( L"CGameObjectListe::~CGameObjectListe() destructeur\n" );
}
//-----------------------------------------------------------------------------
// Ajoute nouveau GameObject
//-----------------------------------------------------------------------------
CGameObject* CGameObjectListe::AddNewGameObject( int iObjectID )
{
// OutputDebugString( L"CGameObjectListe::AddNewGameObject()\n" );
CGameObject* pGameObject = new CGameObject; // créé nouvel élément
m_iNbObjects++;
pGameObject->SetObjID( iObjectID ); // On fixe la iObjectID de l'élément
// Comme on place le nouvel élément en début de liste,
// on dit que son suivant est le premier élément de la liste.
pGameObject->m_pNextObject = m_pListeHead;
// Puis on remet à jour le pointeur vers le premier élément de la liste
// qui est notre nouvel élément.
m_pListeHead = pGameObject;
return pGameObject;
}
//-----------------------------------------------------------------------------
// Ajoute GameObjectexistant
//-----------------------------------------------------------------------------
void CGameObjectListe::AddExistingGameObject( CGameObject* pGameObject )
{
WCHAR sz[256];
OutputDebugString( L"CGameObjectListe::AddExistingGameObject()\n" );
StringCchPrintfW( sz, 256, L"object ajouté ID: %i,\n", pGameObject->GetObjID() );
OutputDebugString( sz );
m_iNbObjects++;
// iObjectID = pGameObject->iObjectID; // On fixe la iObjectID de l'élément
// Comme on place le nouvel élément en début de liste,
// on dit que son suivant est le premier élément de la liste.
pGameObject->m_pNextObject = m_pListeHead;
// Puis on remet à jour le pointeur vers le premier élément de la liste
// qui est notre nouvel élément.
m_pListeHead = pGameObject;
return ;
}
//-----------------------------------------------------------------------------
// Nom: RemoveGameObjectFromListe()
// Desc: supprime un objet de la liste ( ne le détruit pas )
//-----------------------------------------------------------------------------
void CGameObjectListe::RemoveGameObjectFromListe( CGameObject* pGameObject )
{
// OutputDebugString( L"CGameObjectListe::RemoveGameObjectFromListe()\n" );
CGameObject* pPreviousObject = m_pListeHead;
if( pGameObject == m_pListeHead ) // si l'élément à supprimer est le premier de la liste
{
m_pListeHead = NULL;
// delete pGameObject;
m_iNbObjects--;
return;
}
// Sinon, il faut rechercher l'élément précédent, et détourner le pointeur de ce précédent pour
// pointer vers l'élément suivant celui à supprimer. ainsi, il ne se trouve plus dans la liste.
while( ( pPreviousObject != NULL ) && ( pPreviousObject->m_pNextObject != pGameObject ) )
pPreviousObject = pPreviousObject->m_pNextObject;
if( pPreviousObject == NULL )
{
m_iNbObjects--;
return;
}
pPreviousObject->m_pNextObject = pGameObject->m_pNextObject;
// delete pGameObject;
m_iNbObjects--;
}
//-----------------------------------------------------------------------------
// Nom: FindGameObject()
// Desc: trouve un élément par son ID
//-----------------------------------------------------------------------------
CGameObject* CGameObjectListe::FindGameObject( int iObjectID )
{
// OutputDebugString( L"CGameObjectListe::FindGameObject()\n" );
if ( g_static_iNbObject == 0 )
{
OutputDebugString( L"CGameObjectListe::FindGameObject() PAS D'OBJETS DANS LAS LISTE \n" );
return NULL; // il n'y a aucun objet
}
CGameObject* pGameObject = m_pListeHead; // le premier élément
if ( pGameObject == NULL )
{
OutputDebugString( L"CGameObjectListe::FindGameObject() PAS DE LISTE HEAD \n" );
return NULL; // il n'y a aucun objet
}
// méthode de recherche:
// On se place en première position, et tant qu'il y a des éléments suivants,
// on balaye la liste jusqu'à ce qu'on trouve un élément de liste qui contienne la iObjectID
// recherchée.
while( ( pGameObject != NULL )&&( pGameObject->GetObjID() != iObjectID ) )
pGameObject = pGameObject->m_pNextObject;
// ici, on renvoie une information pertinente :
// - ou bien on a trouvé quelque chose, auquel cas on renvoie ce quelque chose,
// - ou bien on n'a rien trouvé et l'élement vaut NULL,
// ce qui indique qu'un élément n'a pas été trouvé.
return pGameObject;
}
//-----------------------------------------------------------------------------
// OutputGameObjectListe()
// Desc: sortie debug des objets et de leurs types dérivés
//-----------------------------------------------------------------------------
void CGameObjectListe::OutputGameObjectListeDebug()
{
OutputDebugString( L"CGameObjectListe::OutputGameObjectDebug()\n" );
wchar_t* sz = new wchar_t[256];
CGameObject* pGameObject = m_pListeHead; // pointeur vers le premier élément créé
CPlanet* pPlanet = NULL;
CShip* pShip = NULL;
while( pGameObject != NULL )
{
// _itow_s( pGameObject->GetObjID(), sz, sizeof(sz), 10 ); // conversion int en wchar[] en base 10
if ( pGameObject->GetObjType() == TYPE_PLANET )
StringCchPrintf( sz, 256, L"object ID: %i, TYPE_PLANET \n", pGameObject->GetObjID() );
else if ( pGameObject->GetObjType() == TYPE_SHIP )
StringCchPrintf( sz, 256, L"object ID: %i, TYPE_SHIP \n", pGameObject->GetObjID() );
OutputDebugString( sz );
if ( pGameObject->GetObjType() == TYPE_PLANET )
{
pPlanet = (CPlanet*) pGameObject;
pPlanet->OutputPlanetDebug();
}
else if ( pGameObject->GetObjType() == TYPE_SHIP )
{
pShip = (CShip*) pGameObject;
pShip->OutputShipDebug();
}
pGameObject = pGameObject->m_pNextObject;
}
StringCchPrintf( sz, 256, L"NB TOTAL D'OBJETS: %i\n", m_iNbObjects );
OutputDebugString( sz );
delete sz;
}
|
|
Cette discussion est classée dans : fichier, arbre, fils, sauver, noeud
Répondre à ce message
Sujets en rapport avec ce message
creation récursive de l'arbre de codage de la compression Huffman [ par kuja2053 ]
Bonjour, Voila mon probleme : ayant un projet sur la compression de Huffman, j'ai décider de changer le format de l entete de mon fichier suite à un c
Construction d'un arbre à partir d'un fichier [ par psgkiki ]
Bonjour a tous, Ma question est comment construire un arbre contenant des données stockées dans un fichier. C'est pour un logiciel de devinette d'anim
recursivité [ par infodaoudi ]
bonjour codeur, je veux changer la fonction ci dessous en eliminant la valeur de retour (Noeud*) et ajoutant un autre parametre ( Noeud *p) qui est la
Les iterateurs en c++ Help me ! [ par Saris ]
Bonjour à tous,J'suis bien embèté car je capte pas grand chose au fonctionnement des itérateurs ou plutôt à l'utilité de ceux-ci dans mon projet pour
faire un projet enc [ par nana87 ]
slt, j'ai eu un programme en c mais je dois le réorganiser sous forme des fichier pour faire un projet ,il y a quelqu'un qui peut m'aider pour ce prob
créer arbre.. [ par abdelkaderg54 ]
Salut à tous , ben voilà j'été entrain de faire un petit programme en c++ Il s'agit de deffirentes fonctions pour manipuler un arbre binnair de recher
Structure de données en C [ par samox007 ]
Bonjour,je suis débutant en programmation et je veux votre aide . Mon soucis et le suivant ;je veux alimenter une arbre de façon que l'utilisateur la
arbre n-aire [ par pnkouzi ]
salut tout monde je veux créer un arbre n-aire et j'ai fait ce programme ms ça marche pas comme il faut quelqu'un peut m'aider à faire ce truc parce
structeure en C [ par samissam ]
Bonjour, j'ai des données dans un fichier txt et je veux écrire une structure en c qui va contenir le type de mes données. mon fichier contient: des
[débutant] probleme de compilation [ par gluff ]
Bonsoir, je réalise un programme qui crée un arbre généalogique à partir d'un arbre binaire Il y a un structure NOEUD revoie vers le nom de la perso
Livres en rapport
|
Derniers Blogs
POUR RAPPEL ! LES SPéCIFICATIONS DES PROTOCOLES OFFICE ET SHAREPOINT SONT DISPONIBLES SUR MSDNPOUR RAPPEL ! LES SPéCIFICATIONS DES PROTOCOLES OFFICE ET SHAREPOINT SONT DISPONIBLES SUR MSDN par neodante
Quelle est le point commun entre : Microsoft il y a 10 ans et Apple aujourd'hui ? Réponse: avoir une politique de protocoles propriétaires et fermés :) Car pour rappel (si si je vous assure c'est important de le rappeler), la majorité des spécifications e...
Cliquez pour lire la suite de l'article par neodante JOYEUX ANNIVERSAIRE NIXJOYEUX ANNIVERSAIRE NIX par ebartsoft
Souhaitons un bon et joyeux anniversaire à notre hôte à tous, Nix.
Je ne le répéterais jamais assez mais sans lui rien ne serait possible. Il défit en permanence les lois de la gravité et comme il le dit si bien, si tu lui fais confiance ça devra...
Cliquez pour lire la suite de l'article par ebartsoft IMAGINE CUP 2012, MAKE A SIGN EN FINALEIMAGINE CUP 2012, MAKE A SIGN EN FINALE par junarnoalg
Voilà qui est fait, la nouvelle est officielle ! L'équipe belge "Make a Sign" va au pays des kangourous défendre son projet dans la catégorie Software Design. http://www.imaginecup.com/CompetitionsContent/Competition/WorldwideFinalists.aspx V...
Cliquez pour lire la suite de l'article par junarnoalg KINECT 1.5 IS OUT !KINECT 1.5 IS OUT ! par Vko
La version 1.5 du Kinect For Microsoft vient tout juste de sortir ! Plein de nouveautés: Tracking de squelette en Near Mode Détection en position assise Détection faciale avec un SDK dédié Documentation et des guideline (enfin) Un out...
Cliquez pour lire la suite de l'article par Vko LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) par richardc
Mise à jour des Web API du 14 Mai
Réservez dès maintenant votre journée du 20 juin pour le Windows Azure Dev Camp 2012 à Paris
Mise à jour de Team Foundation Service
MechCommander 2 sur Windows 8
Entity Framework 5 Release Candidate e...
Cliquez pour lire la suite de l'article par richardc
Forum
MATLAB PROGRAMME MATLAB PROGRAMME par wahab1087
Cliquez pour lire la suite par wahab1087 RGB2GRAYRGB2GRAY par musa18
Cliquez pour lire la suite par musa18
Logiciels
sDEVIS-FACTURES vlPRO (8.1.0.3)SDEVIS-FACTURES VLPRO (8.1.0.3)sDEVIS-FACTURES vlPRO a été mis au point pour les particuliers, créateurs, entrepreneurs, artisa... Cliquez pour télécharger sDEVIS-FACTURES vlPRO 974 Application Server (12.2.4.6)974 APPLICATION SERVER (12.2.4.6)Développez de puissantes applications dans un environnement de 'cloud computing', clusterisé, séc... Cliquez pour télécharger 974 Application Server vPicture (1.4.2.1)VPICTURE (1.4.2.1)Avec vPicture, hébergez vos images facilement et rapidement.
vPicture est un utilitaire simple, ... Cliquez pour télécharger vPicture Easy-Planning (2.2.1.6)EASY-PLANNING (2.2.1.6)Easy-Planning permet de créer des plannings sous la représentation de diagrammes et est adapté au... Cliquez pour télécharger Easy-Planning COM-BACKUP (2.0)COM-BACKUP (2.0)
COM-BACKUP est un logiciel de sauvegarde qui permet de planifier les sauvegardes de vos dossiers ...
Cliquez pour télécharger COM-BACKUP
|