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

代码
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

posted @ 2010-05-21 11:22  feikea  阅读(334)  评论(3编辑  收藏  举报