以前做的数据结构上机实验
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
typedef struct{
int weight;
int parent,lchild,rchild;
}HTNode,*HuffmanTree;
typedef char**HuffmanCode;
void Select (HuffmanTree &HT, int n, int &S1, int &S2)
{
int i,j;
int temp=1000;
for (i=1;i<=n;++i)
{
if(HT[i].parent==0 && temp>=HT[i].weight )
{
temp=HT[i].weight;
j=i;
}
}
S1=j;
temp=1000;
for (i=1;i<=n;++i)
{
if(HT[i].parent==0 && i!=S1 && temp>=HT[i].weight )
{
temp=HT[i].weight;
j=i;
}
}
S2=j;
}
void HuffmanCoding(HuffmanTree &HT, HuffmanCode &HC, int w[],int n)
{
int i,S1,S2,c,m,f,start;
char *cd;
if(n<=1) return;
m=2*(n-1)-1;
HT=new HTNode[m+1];
for(i=1; i<n;++i)
{
HT[i].weight=w[i];
HT[i].parent=0;
HT[i].lchild=0;
HT[i].rchild=0;
}
for(;i<=m;++i)
{
HT[i].weight=0;
HT[i].parent=0;
HT[i].lchild=0;
HT[i].rchild=0;
}
for(i=n;i<=m;++i)
{
Select(HT,i-1,S1,S2);
HT[S1].parent=i;
HT[S2].parent=i;
HT[i].lchild=S1;
HT[i].rchild=S2;
HT[i].weight=HT[S1].weight+HT[S2].weight;
}
HC=new char*[n];
cd=new char[n-1];
cd[n-2]='/0';
for(i=1;i<n;++i)
{
start=n-2;
for (c=i,f=HT[i].parent;f!=0;c=f,f=HT[f].parent)
{
if(HT[f].lchild==c) cd[--start]='0';
else cd[--start]='1';
}
HC[i]=new char[n-start];
strcpy(HC[i],&cd[start]);
}
delete cd;
}
void HuffmanTran (HuffmanTree HT, char string[], int n)
{
int i,j;
char c='1';
i=2*(n-1)-1;
j=i;
printf("输入huffman码(以*结束:)/n");
c=getchar();
while (c!='*')
{
while(1)
{
switch (c)
{
case '0': j=i; i=HT[i].lchild; break;
case '1': i=HT[i].rchild; break;
}
c=getchar();
if(i<=8) /*条件善待改进, 在本实验中 存储数组位置<8的节点均为叶子节点*/
break;
}
printf("%c",string[i]);
i=2*(n-1)-1;
}
}
main()
{
HuffmanTree HT;
HuffmanCode HC;
int w[9]={0,5,29,7,8,14,23,3,11};
char string[9]={'*','o','m','i','v','l','e','y','u'};
int n=9;
int i;
HuffmanCoding(HT,HC,w,n);
printf("各字符出现的概率 对应的huffman码:/n");
for(i=1;i<=8;++i)
printf("%c::%d::%s/n",string[i],w[i],HC[i]);
printf("选择操作:/n1.Huffman编码./n2.huffman译码./n");
switch(char c=getchar())
{
case '1':
{
printf("输入待编码字符串(以*结束):/n");
char s;
s=getchar();
while(s!='*')
{
switch (s)
{
case 'o': printf("%s",HC[1]);break;
case 'm': printf("%s",HC[2]);break;
case 'i': printf("%s",HC[3]);break;
case 'v': printf("%s",HC[4]);break;
case 'l': printf("%s",HC[5]);break;
case 'e': printf("%s",HC[6]);break;
case 'y': printf("%s",HC[7]);break;
case 'u': printf("%s",HC[8]);break;
}
s=getchar();
}
break;
}
case '2': HuffmanTran(HT,string,n);break;
}
system("pause");
}
本文介绍了一种使用C语言实现霍夫曼编码的方法,详细展示了霍夫曼树的构建过程及编码、译码的实现细节。

159

被折叠的 条评论
为什么被折叠?



