Advertisement
Mozahar_mukul

code

May 27th, 2015
223
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.22 KB | None | 0 0
  1. / C program for Huffman Coding
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4.  
  5. #define MAX_TREE_HT 100
  6.  
  7. struct MinHeapNode
  8. {
  9. char data;
  10. unsigned freq;
  11. struct MinHeapNode *left, *right; // Left and right child
  12. };
  13.  
  14.  
  15. struct MinHeap
  16. {
  17. unsigned size;
  18. unsigned capacity;
  19. struct MinHeapNode **array;
  20. };
  21.  
  22.  
  23. struct MinHeapNode* newNode(char data, unsigned freq)
  24. {
  25. struct MinHeapNode* temp =
  26. (struct MinHeapNode*) malloc(sizeof(struct MinHeapNode));
  27. temp->left = temp->right = NULL;
  28. temp->data = data;
  29. temp->freq = freq;
  30. return temp;
  31. }
  32.  
  33.  
  34. struct MinHeap* createMinHeap(unsigned capacity)
  35. {
  36. struct MinHeap* minHeap =
  37. (struct MinHeap*) malloc(sizeof(struct MinHeap));
  38. minHeap->size = 0; // current size is 0
  39. minHeap->capacity = capacity;
  40. minHeap->array =
  41. (struct MinHeapNode**)malloc(minHeap->capacity * sizeof(struct MinHeapNode*));
  42. return minHeap;
  43. }
  44.  
  45.  
  46. void swapMinHeapNode(struct MinHeapNode** a, struct MinHeapNode** b)
  47. {
  48. struct MinHeapNode* t = *a;
  49. *a = *b;
  50. *b = t;
  51. }
  52.  
  53.  
  54. void minHeapify(struct MinHeap* minHeap, int idx)
  55. {
  56. int smallest = idx;
  57. int left = 2 * idx + 1;
  58. int right = 2 * idx + 2;
  59.  
  60. if (left < minHeap->size &&
  61. minHeap->array[left]->freq < minHeap->array[smallest]->freq)
  62. smallest = left;
  63.  
  64. if (right < minHeap->size &&
  65. minHeap->array[right]->freq < minHeap->array[smallest]->freq)
  66. smallest = right;
  67.  
  68. if (smallest != idx)
  69. {
  70. swapMinHeapNode(&minHeap->array[smallest], &minHeap->array[idx]);
  71. minHeapify(minHeap, smallest);
  72. }
  73. }
  74.  
  75.  
  76. int isSizeOne(struct MinHeap* minHeap)
  77. {
  78. return (minHeap->size == 1);
  79. }
  80.  
  81.  
  82. struct MinHeapNode* extractMin(struct MinHeap* minHeap)
  83. {
  84. struct MinHeapNode* temp = minHeap->array[0];
  85. minHeap->array[0] = minHeap->array[minHeap->size - 1];
  86. --minHeap->size;
  87. minHeapify(minHeap, 0);
  88. return temp;
  89. }
  90.  
  91.  
  92. void insertMinHeap(struct MinHeap* minHeap, struct MinHeapNode* minHeapNode)
  93. {
  94. ++minHeap->size;
  95. int i = minHeap->size - 1;
  96. while (i && minHeapNode->freq < minHeap->array[(i - 1)/2]->freq)
  97. {
  98. minHeap->array[i] = minHeap->array[(i - 1)/2];
  99. i = (i - 1)/2;
  100. }
  101. minHeap->array[i] = minHeapNode;
  102. }
  103.  
  104.  
  105. void buildMinHeap(struct MinHeap* minHeap)
  106. {
  107. int n = minHeap->size - 1;
  108. int i;
  109. for (i = (n - 1) / 2; i >= 0; --i)
  110. minHeapify(minHeap, i);
  111. }
  112.  
  113.  
  114. void printArr(int arr[], int n)
  115. {
  116. int i;
  117. for (i = 0; i < n; ++i)
  118. printf("%d", arr[i]);
  119. printf("\n");
  120. }
  121.  
  122.  
  123. int isLeaf(struct MinHeapNode* root)
  124. {
  125. return !(root->left) && !(root->right) ;
  126. }
  127.  
  128.  
  129. struct MinHeap* createAndBuildMinHeap(char data[], int freq[], int size)
  130. {
  131. struct MinHeap* minHeap = createMinHeap(size);
  132. for (int i = 0; i < size; ++i)
  133. minHeap->array[i] = newNode(data[i], freq[i]);
  134. minHeap->size = size;
  135. buildMinHeap(minHeap);
  136. return minHeap;
  137. }
  138.  
  139.  
  140. struct MinHeapNode* buildHuffmanTree(char data[], int freq[], int size)
  141. {
  142. struct MinHeapNode *left, *right, *top;
  143.  
  144.  
  145. struct MinHeap* minHeap = createAndBuildMinHeap(data, freq, size);
  146.  
  147.  
  148. while (!isSizeOne(minHeap))
  149. {
  150.  
  151. left = extractMin(minHeap);
  152. right = extractMin(minHeap);
  153.  
  154.  
  155. top = newNode('$', left->freq + right->freq);
  156. top->left = left;
  157. top->right = right;
  158. insertMinHeap(minHeap, top);
  159. }
  160.  
  161. // Step 4: The remaining node is the root node and the tree is complete.
  162. return extractMin(minHeap);
  163. }
  164.  
  165.  
  166. void printCodes(struct MinHeapNode* root, int arr[], int top)
  167. {
  168.  
  169. if (root->left)
  170. {
  171. arr[top] = 0;
  172. printCodes(root->left, arr, top + 1);
  173. }
  174.  
  175.  
  176. if (root->right)
  177. {
  178. arr[top] = 1;
  179. printCodes(root->right, arr, top + 1);
  180. }
  181.  
  182.  
  183. if (isLeaf(root))
  184. {
  185. printf("%c: ", root->data);
  186. printArr(arr, top);
  187. }
  188. }
  189.  
  190.  
  191. void HuffmanCodes(char data[], int freq[], int size)
  192. {
  193.  
  194. struct MinHeapNode* root = buildHuffmanTree(data, freq, size);
  195.  
  196.  
  197. int arr[MAX_TREE_HT], top = 0;
  198. printCodes(root, arr, top);
  199. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement