Double-chaînage de l'arbre
This commit is contained in:
		
							parent
							
								
									8ce897ce33
								
							
						
					
					
						commit
						1bedf2120e
					
				|  | @ -7,6 +7,7 @@ | |||
| #define FALSE 0 | ||||
| #define NUM_CHARS 256 | ||||
| 
 | ||||
| // structure représentant un sommet d'un arbre de Huffman
 | ||||
| typedef struct Vertex Vertex; | ||||
| struct Vertex { | ||||
| 	// le double `freq` indique la fréquence d'apparition de la lettre
 | ||||
|  | @ -17,18 +18,24 @@ struct Vertex { | |||
| 	// représente (caractère ASCII 0 - 255)
 | ||||
| 	char value; | ||||
| 
 | ||||
| 	// les sommets virtuels sont ceux qui ne correspondent pas à une lettre
 | ||||
| 	// du corpus, mais chapeautent les autres sommets
 | ||||
| 	int is_virtual; | ||||
| 
 | ||||
| 	// pointe vers le sommet parent à celui-ci, ou NULL s'il n'a pas de parent,
 | ||||
| 	// comme par exemple pour la racine et les sommets en cours de traitement
 | ||||
| 	Vertex* parent; | ||||
| 
 | ||||
| 	// pointe vers les deux enfants de ce sommet, ou NULL s'il n'a pas
 | ||||
| 	// d'enfants, comme par exemple pour les feuilles
 | ||||
| 	Vertex *child_l, *child_r; | ||||
| }; | ||||
| 
 | ||||
| // structure représentant un arbre de Huffman
 | ||||
| typedef struct Tree Tree; | ||||
| struct Tree { | ||||
| 	// quantité de sommets dans l'arbre. Le tableau des sommets contient
 | ||||
| 	// exactement `size` éléments
 | ||||
| 	size_t size; | ||||
| 
 | ||||
| 	// tableau contenant les sommets de l'arbre, liés à leur parent,
 | ||||
| 	// excepté pour la racine
 | ||||
| 	Vertex* vertices; | ||||
| }; | ||||
| 
 | ||||
|  | @ -36,8 +43,7 @@ struct Tree { | |||
| // indexé par la valeur numérique ASCII de chaque caractère
 | ||||
| double* computeFrequencies(const char* filepath); | ||||
| 
 | ||||
| // déduit du tableau de fréquences l'arbre de Huffman, représenté
 | ||||
| // par une liste de sommets chaînés
 | ||||
| // déduit d'un tableau de fréquences de caractères un arbre de Huffman
 | ||||
| Tree buildTree(double* frequencies); | ||||
| 
 | ||||
| #endif | ||||
|  |  | |||
							
								
								
									
										11
									
								
								src/huf.c
								
								
								
								
							
							
						
						
									
										11
									
								
								src/huf.c
								
								
								
								
							|  | @ -52,8 +52,10 @@ Tree buildTree(double* frequencies) { | |||
| 		if (frequencies[i] > 0) { | ||||
| 			vertices[next_available].frequency = frequencies[i]; | ||||
| 			vertices[next_available].value = (char) i; | ||||
| 			vertices[next_available].is_virtual = FALSE; | ||||
| 			vertices[next_available].parent = NULL; | ||||
| 			vertices[next_available].child_l = NULL; | ||||
| 			vertices[next_available].child_r = NULL; | ||||
| 
 | ||||
| 			next_available++; | ||||
| 		} | ||||
| 	} | ||||
|  | @ -95,12 +97,13 @@ Tree buildTree(double* frequencies) { | |||
| 			} | ||||
| 		} | ||||
| 
 | ||||
| 		// création d'un sommet parent à ces deux sommets. Ce sommet est
 | ||||
| 		// créé à la prochaine position disponible dans le tableau
 | ||||
| 		// création d'un sommet virtuel parent de ces deux sommets
 | ||||
| 		// ce sommet est créé à la première position libre dans le tableau
 | ||||
| 		vertices[next_available].frequency = | ||||
| 			vertices[min_vert].frequency + vertices[min_vert_sec].frequency; | ||||
| 		vertices[next_available].is_virtual = TRUE; | ||||
| 		vertices[next_available].parent = NULL; | ||||
| 		vertices[next_available].child_l = &vertices[min_vert]; | ||||
| 		vertices[next_available].child_r = &vertices[min_vert_sec]; | ||||
| 
 | ||||
| 		// assignation du nouveau parent et des enfants
 | ||||
| 		vertices[min_vert].parent = &vertices[next_available]; | ||||
|  |  | |||
|  | @ -30,12 +30,14 @@ int main(int argc, const char** argv) { | |||
| 		Vertex* vertex = &tree.vertices[i]; | ||||
| 
 | ||||
| 		printf( | ||||
| 			"[%p] Sommet %c (%4f, %s) : parent %p\n", | ||||
| 			"[%8p] Sommet %c (%4f) : parent %8p, enfants %8p %8p\n", | ||||
| 			(void*) vertex, vertex->value, vertex->frequency, | ||||
| 			vertex->is_virtual ? "est virtuel" : "non virtuel", | ||||
| 			(void*) vertex->parent | ||||
| 			(void*) vertex->parent, (void*) vertex->child_l, | ||||
| 			(void*) vertex->child_r | ||||
| 		); | ||||
| 	} | ||||
| 
 | ||||
| 	printf("\n\n--- 3 : ATTRIBUTION DES CODES ---\n\n"); | ||||
| 
 | ||||
| 	return 0; | ||||
| } | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue