Guest User

Untitled

a guest
May 3rd, 2016
69
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.75 KB | None | 0 0
  1. #include <iostream>
  2. #include <malloc.h>
  3. #include <string.h>
  4. using namespace std;
  5.  
  6.  
  7. typedef struct
  8. {
  9. unsigned int weight;
  10. unsigned int parent, lchild, rchild;
  11. } Htnode, *HuffmanTree;
  12. #define MAX 100;
  13. #define max 65535;
  14. typedef char **HuffmenCode;
  15. void Select(HuffmanTree &HT, int x, int &s1, int &s2)
  16. {
  17. unsigned int min1 = max;
  18. unsigned int min2 = max;
  19. for (int i = 1; i <= x; i++)
  20. {
  21.  
  22. if (HT[i].weight < min1 && HT[i].parent == 0)
  23. {
  24. min1 = HT[i].weight;
  25. s1 = i;
  26. }
  27. }
  28. for (int i = 1; i <= x; i++)
  29. {
  30. if (HT[i].weight < min2 && i != s1 && HT[i].parent == 0)
  31. {
  32. min2 = HT[i].weight;
  33. s2 = i;
  34. }
  35.  
  36. }
  37.  
  38.  
  39. }
  40. void HuffmanCoding(HuffmanTree &HT, HuffmenCode &HC, int w[], int n)
  41. {
  42. int s1, s2;
  43. if (n <= 1) return ;
  44. int m = 2 * n - 1;
  45. HT = (HuffmanTree)malloc((m + 1) * sizeof(Htnode));
  46. for (int i = 1; i <= n; i++)
  47. {
  48. HT[i].weight = w[i - 1];
  49. HT[i].parent = 0;
  50. HT[i].lchild = 0;
  51. HT[i].rchild = 0;
  52. }
  53. for (int i = n + 1; i <= m; i++)
  54. {
  55. HT[i].weight = 0;
  56. HT[i].parent = 0;
  57. HT[i].lchild = 0;
  58. HT[i].rchild = 0;
  59. }
  60. for (int i = n + 1; i <= m; i++)
  61. {
  62. Select(HT, i - 1, s1, s2);
  63. HT[s1].parent = i;
  64. HT[s2].parent = i;
  65. HT[i].lchild = s1;
  66. HT[i].rchild = s2;
  67. HT[i].weight = HT[s1].weight + HT[s2].weight;
  68. }
  69. HC = (HuffmenCode)malloc((n + 1) * sizeof(char *));
  70. char *cd = (char *)malloc(n * sizeof(char));
  71. cd[n - 1] = '\0';
  72. for (int i = 1; i <= n; i++)
  73. {
  74. int start = n - 1;
  75. unsigned int c, f;
  76. for (c = i, f = HT[i].parent; f != 0; c = f, f = HT[f].parent)
  77. {
  78. if (HT[f].lchild == c)
  79. cd[--start] = '0';
  80. else
  81. cd[--start] = '1';
  82. }
  83. HC[i] = (char *)malloc((n - start) * sizeof(char));
  84. strcpy(HC[i], &cd[start]);
  85.  
  86. }
  87. free(cd);
  88.  
  89.  
  90. }
  91. int main()
  92. {
  93. HuffmanTree HT;
  94. HuffmenCode HC;
  95. int n;
  96. int w[100];
  97. cin >> n;
  98. for (int i = 0; i < n; i++)
  99. {
  100. cin >> w[i];
  101. }
  102. HuffmanCoding(HT, HC, w, n);
  103. for (int i = 1; i <= n; i++)
  104. {
  105. cout << HC[i] << endl;
  106. }
  107. return 0;
  108. }
Add Comment
Please, Sign In to add comment