数据结构试验(二)————Huffman编码

ContractedBlock.gif ExpandedBlockStart.gif 代码
 
   
1 #include < stdio.h >
2 #include < malloc.h >
3 #include < string .h >
4 typedef struct HTNode
5 {
6 unsigned int weight;
7 unsigned int parent,lchild,rchild;
8
9 }HTNode, * HuffmanTree;
10 typedef char ** HuffmanCode;
11 typedef struct MinCode
12 {
13 unsigned int s1;
14 unsigned int s2;
15 }MinCode;
16 void HuffmanCoding(HuffmanTree HT,HuffmanCode HC,unsigned int * w, int n)
17 {
18 MinCode Selset(HuffmanTree HT,unsigned int n);
19 unsigned int m,i,s1,s2;
20 HuffmanTree p;
21 MinCode min;
22 unsigned int start,f,c;
23 char * cd;
24
25 if (n <= 1 )
26 printf( " error " );
27 m = 2 * n - 1 ;
28 HT = (HuffmanTree)malloc((m + 1 ) * sizeof (HTNode));
29 for (p = HT + 1 ,i = 1 ;i <= n;i ++ ,p ++ ,w ++ )
30 {
31 p -> weight =* (w + 1 );
32 p -> parent = 0 ;
33 p -> lchild = 0 ;
34 p -> rchild = 0 ;
35 }
36 for (;i <= m;i ++ ,p ++ ,w ++ )
37 {
38 p -> weight = 0 ;
39 p -> parent = 0 ;
40 p -> lchild = 0 ;
41 p -> rchild = 0 ;
42 }
43 for (i = n + 1 ;i <= m;i ++ )
44 {
45 min = Selset(HT,i - 1 );
46 s1 = min.s1;
47 s2 = min.s2;
48 HT[s1].parent = i;
49 HT[s2].parent = i;
50 HT[i].lchild = s1;
51 HT[i].rchild = s2;
52 HT[i].weight = HT[s1].weight + HT[s2].weight;
53 }
54 printf( " number\tweight\t parent\t lchild\t rchild\n " );
55 for (i = 1 ;i <= 2 * n - 1 ;i ++ )
56 {
57 printf( " %d\t " ,i);
58 printf( " %d\t %d\t %d\t %d\n " ,HT[i].weight,HT[i].parent,HT[i].lchild,HT[i].rchild);
59 }
60 HC = (HuffmanCode)malloc((n + 1 ) * sizeof ( char * ));
61 cd = ( char * )malloc(n * sizeof ( char ));
62 cd[n - 1 ] = ' \0 ' ;
63 for (i = 1 ;i <= n;i ++ )
64 {
65 start = n - 1 ;
66 for (c = i,f = HT[i].parent;f != 0 ;c = f,f = HT[f].parent)
67 {
68 if (HT[f].lchild == c)
69 cd[ -- start] = ' 0 ' ;
70 else
71 cd[ -- start] = ' 1 ' ;
72 }
73 HC[i] = ( char * )malloc((n - start) * sizeof ( char ));
74 strcpy(HC[i], & cd[start]);
75 }
76 free(cd);
77 printf( " number\tweight\tHuffmanCode\n " );
78 for (i = 1 ;i <= n;i ++ )
79 {
80 printf( " %d\t%d\t%s\n " ,i,HT[i].weight,HC[i]);
81 }
82
83 }
84 MinCode Selset(HuffmanTree HT,unsigned int n)
85 {
86 unsigned int min,secmin;
87 unsigned int temp;
88 unsigned int i,s1,s2,tempi;
89 MinCode code;
90 s1 = 1 ;s2 = 1 ;
91 for (i = 1 ;i <= n;i ++ )
92 if (HT[i].parent == 0 )
93 {
94 min = HT[i].weight;
95 s1 = i;
96 break ;
97 }
98 tempi = i ++ ;
99 for (;i <= n;i ++ )
100 if (HT[i].weight < min && HT[i].parent == 0 )
101 {
102 min = HT[i].weight;
103 s1 = i;
104 }
105 for (i = tempi;i <= n;i ++ )
106 if (HT[i].parent == 0 && i != s1)
107 {
108 secmin = HT[i].weight;
109 s2 = i;
110 break ;
111 }
112 for (i = 1 ;i <= n;i ++ )
113 if (HT[i].weight < secmin && i != s1 && HT[i].parent == 0 )
114 {
115 secmin = HT[i].weight;
116 s2 = i;
117 }
118 if (s1 > s2)
119 {
120 temp = s1;
121 s1 = s2;
122 s2 = temp;
123 }
124 code.s1 = s1;
125 code.s2 = s2;
126 return code;
127 }
128 void main()
129 {
130 int n,i;
131 unsigned int * w = NULL;
132 w = (unsigned int * )malloc((n + 1 ) * sizeof (unsigned int * ));
133 printf( " 请输入n的值: " );
134 scanf( " %d " , & n);
135 printf( " 请输入权值: " );
136 for (i = 1 ;i <= n;i ++ )
137 scanf( " %d " , & w[i]);
138 w[ 0 ] = 0 ;
139 HuffmanTree HT = NULL;
140 HuffmanCode HC = NULL;
141 HuffmanCoding(HT,HC,w,n);
142 }
143

2010052111212734.png

转载于:https://www.cnblogs.com/feikea/archive/2010/05/21/1740735.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值