logo资料库

huffman编码与解码C语言编写项目书.doc

第1页 / 共17页
第2页 / 共17页
第3页 / 共17页
第4页 / 共17页
第5页 / 共17页
第6页 / 共17页
第7页 / 共17页
第8页 / 共17页
资料共17页,剩余部分请下载后查看
数据结构(双语) ——项目文档报告 哈弗曼编码与解码 专 班 业: 级: 指导教师: 姓 学 名: 号: 网络工程 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
分享到:
收藏