1 #include <stdio.h>
2 #define n 4
3 typedef struct
4 {
5 int parent;
6 int lchild,rchild;
7 int weight;
8 int flag;
9 }Node;
10
11 typedef struct
12 {
13 char bit[n];
14 int start;
15 char ch;
16 }CodeNode;
17
18 Node haffman[7];
19 CodeNode code[n];
20
21 int select(int j)
22 {
23 int i,position;
24 int Min=100;
25 for (i=0;i<=j;i++)
26 if (haffman[i].weight<Min && haffman[i].flag==-1)
27 {
28 Min=haffman[i].weight;
29 position=i;
30 }
31 haffman[position].flag=1;
32 return position;
33 }
34
35 void haffmanCode()
36 {
37 int i,j,p,k;
38
39 for (i=0;i<n;i++)
40 {
41 printf("%d ",haffman[i].weight);
42 code[i].start=n-1;
43 j=i;
44 p=haffman[i].parent;
45 while (p!=-1)
46 {
47 if (haffman[p].lchild==j)
48 code[i].bit[code[i].start]='0'; //左0右1;
49 else
50 code[i].bit[code[i].start]='1';
51 code[i].start--;
52 j=p;
53 p=haffman[p].parent;
54 }
55 for(k=code[i].start+1 ;k<n ;k++)
56 printf("%c",code[i].bit[k]);
57 printf("\n");
58 }
59
60 }
61
62 int main()
63 {
64
65 int max=100 , i ;
66 int m1,m2;
67
68 //初始化节点数据;
69 for (i=0;i<2*n-1;i++)
70 {
71 haffman[i].weight=0;
72 haffman[i].parent=-1;
73 haffman[i].lchild=-1;
74 haffman[i].rchild=-1;
75 haffman[i].flag=-1;
76 }
77 printf("请输入叶子节点的权值:");
78 for (i=0;i<n;i++)
79 {
80 scanf("%d",&haffman[i].weight);
81 }
82 //构造哈弗曼二叉树(n-1次合并);
83 for (i=n ; i<2*n-1 ;i++)
84 {
85 m1=select(i-1); //最小权值位;
86 m2=select(i-1); //次最小权值;
87 haffman[m1].parent=i;
88 haffman[m2].parent=i; //父节点在数组中的位置;
89 haffman[i].weight=haffman[m1].weight+haffman[m2].weight;
90 haffman[i].lchild=m1;
91 haffman[i].rchild=m2; //儿子节点在数组中的位置;
92
93 }
94 for (i=0 ;i<2*n-1 ;i++)
95 printf("%d",haffman[i].weight);
96 printf("\n");
97 haffmanCode();
98 }