为解决广大童鞋的数据结构实验问题写下本文:(只做参考哦。)
实验要求:
Huffman编码(二叉树)
l实验目的:熟练掌握二叉树应用(Huffman编码)的基本算法实现。
l实现功能:对输入的一串电文字符实现Huffman编码,再对Huffman编码生成的代码串进行译码,输出电文字符串。实现功能如下:
¨Huffman树的建立
¨Huffman编码的生成
¨编码文件的译码
l实验机时:4
l设计思路:
数据结构:
#define n 100
//叶子结点数
#define m 2*n-1
// Huffman树中结点总数
typedef struct {
int weight;
//权值
int lchild , rchild , parent; //左右孩子及双亲指针
}HTNode; //树中结点类型
typedef HTNode HuffmanTree[m+1];
//0号单元不用
主要实现函数:
n统计字符串中字符的种类以及各类字符的个数的函数
n构造Huffman树的函数
nHuffman编码的函数
n建立正文的编码文件的函数
n代码文件的译码函数
n主函数
代码如下:
#include
#include
#include
#define
n 5 //叶子结点数
#define
m 2*n-1 // Huffman树中结点总数
typedef
struct
{
int weight; //权值
int lchild ,
rchild , parent;
//左右孩子及双亲指针
}
HTNode; //树中结点类型
HTNode
HuffmanTree[m+1]; //0号单元不用
char
huffman[n+1][m+1];
void
Select(int &s1, int &s2,int j)
{
int i;
int tmp1 = 10000, tmp2 =
10000;
for(i = 1; i
<= j; i++)
{
if(HuffmanTree[i].parent == 0)
{
if(HuffmanTree[i].weight < tmp1)
{
tmp1 =
HuffmanTree[i].weight;
s1 = i;
}
else
if(HuffmanTree[i].weight < tmp2)
{
tmp2 =
HuffmanTree[i].weight;
s2= i;
}
}
}
}
void
HuffmanCoding(int weight[],int letter[])
{
int i;
if(n<1)
return;
for(i=1; i<=n;
i++)
{
HuffmanTree[i].weight=weight[i-1];
HuffmanTree[i].lchild=0;
HuffmanTree[i].rchild=0;
HuffmanTree[i].parent=0;
}
for(i=7; i<=m;
i++)
{
HuffmanTree[i].weight=0;
HuffmanTree[i].lchild=0;
HuffmanTree[i].rchild=0;
HuffmanTree[i].parent=0;
}
//Huffman树的建立
for(i=n+1;
i<=m; i++)
{
int s1,s2;
Select(s1,s2,i-1);
HuffmanTree[s1].parent=i;
HuffmanTree[s2].parent=i;
HuffmanTree[i].lchild=s1;
HuffmanTree[i].rchild=s2;
HuffmanTree[i].weight=HuffmanTree[s1].weight+HuffmanTree[s2].weight;
}
char cd[n+1];
int start,c,f;
cd[n-1]= '\0';
for(i=1;
i
{
start=n-1;
for(c=i,f=HuffmanTree[i].parent; f!=0;
c=f,f=HuffmanTree[f].parent)
{
if(HuffmanTree[f].lchild==c)
cd[--start]='0';
else
cd[--start]='1';
}
strcpy(huffman[i],&cd[start]);
}
char x='a';
for(i=1; i<=n;
i++)
{
printf("字符:%c
Huffman编码:%s\n",x++,huffman[i]);
}
}
int
main()
{
int weight[n]=
{1,3,2,4,5};
int letter[n]=
{'a','b','c','d','e'};
HuffmanCoding(weight,letter);
return 0;
}
weight值什么的自己改吧。最好看明白自己写哦。。。。