数据结构(双语)
——项目文档报告
哈弗曼编码与解码
专
班
业:
级:
指导教师:
姓
学
名:
号:
网络工程
07 网 1
xxxxxxx
xxxxxx
200701040117
哈弗曼编码与解码
一、设计思想
哈弗曼编码与解码整体思想和算法:
1、文件的导入及准备工作
首先,考虑文件的导入,用 string 数组来接受读入的字符,用 Code 数组和 w 数组来分
别存储不同种类的字符和对应的权值,这两个数组的都是从下标为“1”位置开始存储数据,
用 count 变量来计数,count 的初值为“1”,先读入一个字符放入 Code[1],对应的 w[1]记一
个,当再读入字符时,计数器计数,判断该字符是否在 Code 数组中,如果有判断是在什么
位置,并在 w 数组中,相应位置加 1;如果 Code 数组中没有则直接放入 Code 数组中,对
应权值置 1。
当导入文件完毕后,string 数组中存有所有字符,count 记有字符总数,Code 中记有所
有不同的字符,w 数组中有所有对应的权值。这些准备是为创建哈弗曼树及后面的编码与解
码做准备工作。
2、哈弗曼树的建立及树的打印
1)哈弗曼树建立的思想是先定义结点(HTNode)的结构,包含权值和左右子及父亲四
个元素。然后初始化 HT[m+1](m=2n-1)数组,HT[0]结点的权值、左右子及父亲都置为 0,
HT[1..n]的权值一次存入 w[1..n]的内容,左右子及父亲均置为 0,HT[n+1..m]的权值、左右
子及父亲都置为 0;接着对 HT[1..n]中的结点进行合并,所产生的新结点依次放入 HT 的第
i(n
哈弗曼编码与解码
1、主流程图:
2、各调用函数流程图:
图 1.1 主流程图
图 2.1file 函数流程图
- 2 -
哈弗曼编码与解码
图 2.2CreateHuffmanTree 流程图
图 2.3Treechart 函数流程图
- 3 -
哈弗曼编码与解码
图 2.4 HuffmanCoding 函数流程图
图 2.5HuffmanDecoding 函数流程图
- 4 -
哈弗曼编码与解码
三、源代码
哈弗曼编码与解码源代码如下:
#include"stdio.h"
#include"stdlib.h"
#include"string.h"
#include"conio.h"
#define INCREAMENT 50
#define STACK_INIT_SIZE 255;
typedef struct
{
int *elem;
int
top;
int
stacksize;
}SqStack;
typedef struct
{
int weight;
int parent,lchild,rchild;
}HTNode;
typedef HTNode HuffmanTree;
typedef char * *HuffmanCode;
HuffmanTree *HT;
HuffmanCode HC; /*HT 为哈斯曼树数组,HC 为编码的指针数组*/
char *string,*Code,*filename; /*string 放读入的字符;code 是放字符的种类的;*/
int n=2,N=50,count=0;
int *w;
/* w 是存权值;N 是 string 的初始大小;count 是计数器;*/
void InitStack_Sq(SqStack *S)
S->stacksize=STACK_INIT_SIZE;
(*S).elem =(int *)malloc(S->stacksize);
S->top=0;
{
}
int GetTop_Sq(SqStack *S)
{
int e;
if(S->top==0) printf("顺序栈 s 下溢");
e=S->elem[(*S).top];
- 5 -
哈弗曼编码与解码
return e;
}
void Push_Sq(SqStack *S,int e)
{
if((*S).top==((*S).stacksize)) printf("栈满溢出");
(*S).elem[++(*S).top]=e;
}
int Pop_Sq(SqStack *S)
{
int e;
if((*S).top==0) printf("顺序栈 s 下溢");
e=(*S).elem[(*S).top--];
return e;
}
void file()/* 该函数读字符,对字符分类*/
{ FILE *fp;
char ch;
int i,flag=0;
fp=fopen(filename,"rb");
if(!fp)
{
printf("can not find the designated file\n");
exit(0);
}
string=(char *)malloc(N*sizeof(char));
Code=(char *)malloc(n*sizeof(char));
w=(int *)malloc(n*sizeof(int));
Code[1]=fgetc(fp); /* printf("%c",Code[1]); */
w[1]=1;
string[0]=Code[1];
for(count=2;!feof(fp);count++)
{
if(count>=N)
{
string=(char *)realloc(string,N+INCREAMENT);
N=N+INCREAMENT;
}
ch=fgetc(fp);
string[count-1]=ch;
flag=0;
- 6 -
哈弗曼编码与解码
for(i=1;iparent==0)
{ str[i].weight=p->weight;i++;/*printf("%d",str[i].weight);*/ }
else
{
l=l+1;
}
p++;
} /* printf("%d\n",str[1].weight); */
for(i=0;i<2;i++)
{
k=i;
for(j=i+1;j