第六周作业

来源:互联网 发布:淘宝加盟商靠谱吗 编辑:程序博客网 时间:2024/06/08 11:50

                                                                                                                        第六周作业(利用哈夫曼编码字母表)

#include<iostream>  

#include<string>  

#include<malloc.h>  

using namespace std;  

typedef struct{  

    char charname;  

    double weight;  

    int parent, lchild, rchild;  

}HTNode, *HuffmanTree;  

10 typedef char **HuffmanCode;  

11 int n;  

12 char *a;  

13 double *b;  

14 void TestNum()  

15 {  

16     n = 27;  

17     a = new char[27];  

18     b = new double[n];  

19   

20     char *Code[27] = {"space""e""t""a""o""i""n""s""h",  

21         "r""d""l""c""u""m""w""f""g",  

22         "y""p""b""v""k""j""x""q""z"};  

23   

24       

25     for (int i = 0; i < n; i++)  

26     {  

27         a[i] = *Code[i];  

28     }  

29   

30       

31     double WeightNum[27] = {18.3, 10.2, 7.7, 6.8, 5.9, 5.8, 5.5, 5.1, 4.9,  

32                     4.8, 3.5, 3.4, 2.6, 2.4, 2.1, 1.9, 1.8, 1.7, 1.6,   

33                     1.6, 1.3, 0.9, 0.6, 0.2, 0.2, 0.1, 0.1};  

34       

35       

36     for(int i = 0; i < n; i++)  

37     {  

38         b[i] = WeightNum[i];  

39     }  

40       

41 }  

42 void HuffmanCoding(HuffmanTree &HT,HuffmanCode &HC,char *a,double *b,int n)  

43 {  

44     if(n<=1)  

45     {  

46         return;  

47     }  

48     int m = 2 * n - 1;  

49     HT = (HuffmanTree)malloc((m+1)*sizeof(HTNode));  

50     int i;  

51     for(i = 1; i <= n; ++i)  

52     {  

53         HT[i].charname = a[i-1];  

54         HT[i].weight = b[i-1];  

55         HT[i].parent = HT[i].lchild = HT[i].rchild = 0;   

56     }  

57     for(; i <= m; ++i)  

58     {  

59         HT[i].charname = '0';  

60         HT[i].weight = 0;  

61         HT[i].parent = HT[i].lchild=HT[i].rchild = 0;  

62     }  

63     for(i = n + 1; i <= m; ++i)  

64     {   

65         int s1 = 0;  

66         int s2 = 0;  

67         for(s1 = 1; HT[s1].parent != 0;)  

68         {  

69             s1++;  

70         }  

71   

72         for (int j = s1; j <= i - 1; j++)  

73         {  

74             if(HT[j].parent != 0)  

75             {  

76                 continue;  

77             }  

78             s1 = HT[j].weight<HT[s1].weight?j:s1;  

79         }  

80   

81         HT[s1].parent = i;  

82         HT[i].lchild = s1;  

83   

84         for(s2 = 1; HT[s2].parent != 0;)  

85         {  

86             s2++;  

87         }  

88   

89         for (int j = s2; j <= i - 1; j++)  

90         {  

91             if(HT[j].parent != 0)  

92             {  

93                 continue;  

94             }  

95             s2 = HT[j].weight<HT[s2].weight?j:s2;  

96         }  

97         HT[s2].parent = i;  

98         HT[i].rchild = s2;  

99         HT[i].weight = HT[s1].weight+HT[s2].weight;  

100     }  

101     HC = (HuffmanCode)malloc((n+1)*sizeof(char*));  

102     char *cd = (char*)malloc(n*sizeof(char));  

103     cd[n-1] = '\0';  

104     for (i = 1; i <= n; ++i)  

105     {  

106         int start = n-1, c, f;  

107         for (c=i, f=HT[i].parent; f != 0; c = f, f = HT[f].parent)  

108         {  

109             if(HT[f].lchild==c)   

110             {  

111                 cd[--start]='0';  

112             }  

113             else if(HT[f].rchild==c)   

114             {  

115                 cd[--start]='1';  

116             }  

117         }  

118         HC[i] = (char*)malloc((n-start) * sizeof(char));  

119         f=n-start;  

120         for(int d = 0; d < f; d++, start++)  

121         {  

122             HC[i][d]=cd[start];  

123         }  

124     }  

125   

126 }  

127 void coutHC(HuffmanTree &HT,HuffmanCode &HC,int n, char* a)  

128 {  

129     for (int i = 1; i <= n; i++)  

130     {  

131   

132     //  cout<<"ok";  

133         cout<<a[i]<<"的编码为:";  

134   

135         for(int d = 0; HC[i][d] != '\0'; d++)  

136         {  

137             cout<<HC[i][d];  

138         }  

139         cout<<endl;  

140     }  

141 }  

142   

143 void main()  

144 {  

145     HuffmanTree HT;  

146     HuffmanCode HC;  

147     TestNum();  

148     HuffmanCoding(HT, HC, a, b, n);  

149     coutHC(HT, HC, n, a);  

150 }

 


0 0
原创粉丝点击