begin process at 2010 02 09 23:14:46
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C

 > 

Algorithme

 > 

Compression, Split & Cryptage

 > 

creation récursive de l'arbre de codage de la compression Huffman


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

creation récursive de l'arbre de codage de la compression Huffman

dimanche 6 mai 2007 à 22:56:51 | creation récursive de l'arbre de codage de la compression Huffman

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 conseil donnée sur ce forum : http://www.developpez.net/forums/sho...d.php?t=312519
Donc pour résumer je coder le bit '0' pour un nouveau noeud, '1' pour une feuille et je met le caractere ascii correspondant a la feuille apres les '1' donc.

Ceux qui donne sur cette arbre par exemple:

le code "001D01B01F1A01C1E" . Bien sur les 0 et les 1 sont des bits et les code ascii des caracteres seront codé sur un octet. Mais pour simplifier pour l'instant les 0 et les 1 sont codée en tant que caractere (cela évite de s'encombrer de l'utilisation d'une file d'attente pour écrire octet par octet dans le fichier).


J'ai donc dévelloper la fonction pour ecrire l'entete de cette fonction (qui est fonctionnelle) mais ma fonction pour la recréation de l'arbre ne marche pas! C'est en quelques sorte une fonction doublement récursive (avec adresse du noeud actuelle dans l'arbre en construction et la position du pointeur sur fichier (FILE*) qui avance à chaque lecture (fread).

Cette fonction marche pour les arbre à 3 niveau de profondeur (soit 2 noeuds) mais ne marche pour plus grand. Car dépassé cette limite, la lecture des valeurs de l'arbre me ferme mon programme. Pourtant lorsque je lit un emplacement mémoire interdit, windows me retourne un message d'erreur avant. Je précise que je développe sous "Dev C++". Bon sans plus attendre je met les code source donc vous aurez besoin et souhaite bonne chance au plus courageux (lol)

SOURCE:

DEFINITION DU TYPE ARBRE ET DE SON POINTEUR

Code :
typedefstruct arbre_ arbre;
typedef feuille *ptr_arbre;
 
struct arbre_
{
unsignedchar code_ascii;
ptr_feuille fils_gauche;
ptr_feuille fils_droite;
};
 



FONCTION DEVANT RECREER L ARBRE AVEC EN ARGUMENT LE POINTEUR SUR FICHIER POINTANT AU DEBUT SUR LE DEBUT DE L ENTETE ET L ADRESSE DU NOEUD ACTUELLE EN DEUXIEME ARGUMENT

Code :
void creer_arbre(FILE *fichier_entree,ptr_arbre noeud)
{
unsignedchar caract;
if(!fread(&caract,sizeof(unsignedchar),1,fichier_entree))
{ printf("\n\nerreur entete fichier compresse"); while(1); }
printf("caractere lu %c\n",caract);
if(caract=='1')
{
if(!fread(&caract,sizeof(unsignedchar),1,fichier_entree))
{ printf("\n\nerreur entete fichier compresse"); while(1); }
noeud->code_ascii=caract;
printf("lettre a placer %c\n",caract);
}
else//creation des deux fils
{
if(((noeud->fils_gauche)=(ptr_arbre)malloc(sizeof(arbre)))==NULL)
{ printf("\n\nErreur allocation memoire"); while(1); }
printf("noeud gauche creer\n");
if(((noeud->fils_droite)=(ptr_arbre)malloc(sizeof(arbre)))==NULL)
{ printf("\n\nErreur allocation memoire"); while(1); }
printf("noeud droite creer\n");
noeud->fils_gauche->code_ascii='H';
noeud->fils_droite->code_ascii='H';
noeud->fils_gauche->fils_gauche=NULL;
noeud->fils_gauche->fils_droite=NULL;
noeud->fils_droite->fils_gauche=NULL;
noeud->fils_droite->fils_droite=NULL;
printf("depart fils gauche\n");
creer_arbre(fichier_entree,noeud->fils_gauche);
printf("depart fils droite\n");
creer_arbre(fichier_entree,noeud->fils_droite);
}
}
 



AUPARAVANT J'AI INITIALISER UNE FEUILLE POUR L'ARBRE A CONSTRUIRE AVEC LA FONCTION :
Code :
ptr_arbre creer_feuille()
{
ptr_arbre inter;
if((inter=(ptr_arbre)malloc(sizeof(arbre)))==NULL)
{ printf("\n\nErreur allocation memoire"); while(1); }
inter->code_ascii='H';
inter->fils_gauche=NULL;
inter->fils_droite=NULL;
return inter;
}
 



J'AI DONC DANS LA FONCTION PRINCIPALE:
Code :
ptr_arbre arbre_huffman=creer_feuille();
 
//creation de l arbre simplifier avec entete
creer_arbre(fichier_in,arbre_huffman);
 


VOILA, si vous avez besoin de la fonction qui écrit l'entete a partir de l'arbre de la partie "compression de fichier" faite moi signe!

Encore bonne chance et merci d'avance...
lundi 7 mai 2007 à 00:54:33 | Re : creation récursive de l'arbre de codage de la compression Huffman

BruNews

Administrateur CodeS-SourceS
http://www.cppfrance.com/codes/HUFFMAN-CPPFRANCE_38961.aspx
C'est ici qu'il faut regarder, une très bonne analyse des différentes méthodes y est faite.

ciao...
BruNews, MVP VC++
lundi 7 mai 2007 à 12:51:02 | Re : creation récursive de l'arbre de codage de la compression Huffman

kuja2053

Merci, aprés recherche, j'ai trouvé exactement ce que je cherchait!!!
jeudi 24 janvier 2008 à 11:10:51 | Re : creation récursive de l'arbre de codage de la compression Huffman

josekym

bonjour,
je suis nouvelle sur le site et maitrise à peine le c
pourriez-vous m'aider à élaborer un code qui construit graphiquement l'arbre de huffman c'est-à-dire un arbre binaire ordonné.
moi je comprend cette construction comme suit:
-creer de n feuilles qui sont des pointeurs sur des structures avec pour champ:
                 char lettre
                 float freq
                 pointeur de même type filsG;
                 pointeur de même type filsD;

-ranger les feuilles en ordre décroissant
-creer de (n-1) noeuds dont lun sera la somme de deux feuilles et les ranger en ordre décroissant ainsi de suite jusqu'a n'avoir plus qu'un noeud=1
-retracer le parcours de chaque feuille jusqu'à la source pour pouvoir trouver le code de chaque lettre.
bref c'est un peu ça
merci d'avance



Cette discussion est classée dans : fichier, arbre, gauche, fils, noeud


Répondre à ce message

Sujets en rapport avec ce message

arbres binaires en C [ par toto000 ] Bonjour,J'ai un pointeur sur un arbre binaire.Si je vais dans son fils gauche, j'ai un 0 et lorsque je vais dans son fils droit, j'ai un 1.Je voudrai Problème pointeur en c++ [ par ch3mical ] Bonjourj'ai un problème avec une partie de code , lorsque je créer mon arbre binaire jai un message d'erreur lorsque je rappel ma fonction récursive . arbre binaire [ par pfmk ] je voudrai enregistrer un arbre binaire dans un fichier texte ou binaire? j'arrive pas à trouver comment je vais organiser mon fichier pour pouvoir r Probleme avec mon programme en C [ par nono1307 ] Je dois faire une fonction insertion dans un arbre ternaire.Voici ce que j'ai fait :#include #include #includ créer un arbre à partir d'un fichier word [ par yeager ] Bonjour je suis nouveau et débutant en langage CJe souhaite pouvoir lire un fichier word comportant des informations sur plusieurs livres. A partir de Modifier un FICHIER XML [ par ced09 ] Bonjour, dans mon code j'arrive a lire et ecrire tout  le fichier xml, mais je voudrais faire des modification dans le noeud principale sans que sa ch créer une liste à partir d'un arbre [ par morganistic ] bonjour a tous!voila deux structures : une liste et un arbre.je n arrive pas a parcourir un arbre en inserant chaque noeud de l arbre dans une liste.. inserer dans un arbre tous les mots d'un fichier [ par the godfather ] bonjour j'ai créé un dico en forme d'arbre composé de noeuds. chaque noeuds possède un char et deux pointeurs mais comment il est fait n'est pas imort Itérateurs en c++ 2 [ par Saris ] Lorsque je crée un iterateur sur un Arbre, comment puis-je faire en sorte que cet iterator point sur la racine de mon arbre?class Arbre{ private :  cl fonction recursive [ par infodaoudi ] Bonjour, j'ai la fonction recusive ci-dessu, suposons qu'on a un cas qui passe par les etapes 2/3/5/2/3/4, normalement la valeur de retour de la fonct


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,640 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales