赫夫曼编码(C语言版本)
#include <stdio.h> #define MAXBIT 2000 /*定义哈夫曼编码的最大长度*/ #define MAXVALUE 1000 /*定义最大权值*/ #define MAXLEAF 256 /*定义哈夫曼树中最多叶子节点个数*/ #define MAXNODE MAXLEAF*2-1 /*哈夫曼树最多结点数*/ typedef struct { /*哈夫曼编码结信息的构*/ char bit[MAXBIT]; int start; }Hcodetype; typedef struct { /*哈夫曼树结点的结构*/ int weight; int parent; int lchild; int rchild; char ch; }Hnodetype; char ch[MAXVALUE*5]; static int numbers; int number=0; char varyCh[MAXLEAF]; int weight[MAXLEAF]; int pos[256]; int root; char allHc[MAXVALUE*20]; /*----------分析输入的字符串--------------*/ void analyze(char ch[],int numbers,char varyCh[],int weight[],int& number){ int temp[256]={0}; int n=0; for(int i=0;i<numbers;i++){ temp[(int)ch[i]]++; } for(int j=0;j<256;j++){ if(temp[j]!=0){ varyCh[n]=(char)j; weight[n]=temp[j]; pos[j]=n; n++; } } number=n; } void huffmantree(Hnodetype huffnode[MAXNODE]) /*构造哈夫曼树的函数*/ { int i,j,m1,m2,x1,x2; analyze(ch,numbers, varyCh, weight,number); for(i=0;i<number;i++) /*存放哈夫曼树结点的数组huffnode[]初始化*/ { huffnode[i].weight=weight[i]; huffnode[i].parent=-1; huffnode[i].lchild=-1; huffnode[i].rchild=-1; huffnode[i].ch=varyCh[i]; } for(i;i<2*number;i++){ huffnode[i].weight=0; huffnode[i].parent=-1; huffnode[i].lchild=-1; huffnode[i].rchild=-1; } /* for(i=0;i<n;i++) /*输入入N个叶子节点的权值 { printf("please input %d character's weight\n",i); scanf("%d",&huffnode[i].weight); } */ for(i=0;i<number-1;i++){/*开始循环构造哈夫曼树*/ m1=m2=MAXVALUE; //m1拥有最小值 x1=x2=0; //记录一次循环后找到最小和次小节点的位置 for(j=0;j<number+i;j++){ if(huffnode[j].weight<m1&&huffnode[j].parent==-1) { m2=m1;x2=x1;m1=huffnode[j].weight;x1=j; } else if(huffnode[j].weight<m2&&huffnode[j].parent==-1) { m2=huffnode[j].weight;x2=j; } } huffnode[x1].parent=number+i; huffnode[x2].parent=number+i; huffnode[number+i].weight=huffnode[x1].weight+huffnode[x2].weight; huffnode[number+i].lchild=x1; huffnode[number+i].rchild=x2; } } void unhanffman(Hnodetype huffnode[]){ //根据哈夫曼树和所有字符的编码进行译码 int i=0; int r=root; //指向根节点 while((allHc[i]!=NULL)){ if(allHc[i]=='0')r=huffnode[r].lchild; else r=huffnode[r].rchild; if(huffnode[r].lchild==-1&&huffnode[r].rchild==-1) { printf("%c",huffnode[r].ch); r=root; } i++; } printf("\n\n"); } void main() { Hnodetype huffnode[MAXNODE]; Hcodetype leafcode[MAXLEAF],cd; int i,j,c,p,num=0,posite,allhc=0; char temp; printf(" 赫夫曼编码的应用 \n\n"); printf(" ○○○○○○○○○○○○○○○○○○○○○○○○○ "); printf("\n\n"); printf(" ●请输入字符串并以#号结束"); //scanf("%d",&n); /*输入叶子节点个数*/ /*----------循环接受字符-------------------*/ while((ch[num]=getchar())!='#'){ num++; } numbers=num; //得到字符个数----------------- huffmantree(huffnode); /*建立哈夫曼树*/ FILE *fp; if(!(fp=fopen("D:\\text1.txt","w"))) { printf("文件打开失败!"); } for(i=0;i<number;i++) /*该循环求每个叶子节点对应字符的哈夫曼编码*/ { cd.start=number-1;c=i; p=huffnode[c].parent; while(p!=-1) //逆向求叶子节点哈夫曼编码左0右1 { if(huffnode[p].lchild==c) cd.bit[cd.start]='0'; else cd.bit[cd.start]='1'; cd.start--;c=p; p=huffnode[c].parent; root=c; } //循环结束p指向根节点 for(j=cd.start+1;j<number;j++) /*保存求出的每个叶节点的哈夫曼编码和编码的起始位*/ { leafcode[i].bit[j]=cd.bit[j]; fputc(leafcode[i].bit[j],fp); } leafcode[i].start=cd.start; //leafcode[i].ch=huffnode[i].ch; } printf("\n"); printf(" --------------------------------------------------------------- \n"); printf("\n"); for(i=0;i<number;i++) /*输出每个叶子节点的哈夫曼编码*/ { printf(" ☆字符:%c",huffnode[i].ch); printf(" 次数:%d",huffnode[i].weight); printf("\n"); printf(" ★'%c'字符的编码是:",huffnode[i].ch); for(j=leafcode[i].start+1;j<number;j++) printf("%c",leafcode[i].bit[j]); printf("\n"); } fclose(fp); printf("\n"); printf(" --------------------------------------------------------------- \n"); printf("\n"); printf(" ☆字符串被编码成为:"); if(!(fp=fopen("D:\\text1.txt","r"))) { printf("文件打开失败!"); } for(i=0;i<numbers;i++) /*所有字符的哈夫曼编码*/ { temp=ch[i]; posite=pos[(int)temp]; for(j=leafcode[posite].start+1;j<number;j++) { printf("%c",leafcode[posite].bit[j]); allHc[allhc]=leafcode[posite].bit[j]; allhc++; } } printf("\n\n"); printf(" --------------------------------------------------------------- \n"); printf("\n"); printf(" ★译码的结果如下:"); unhanffman(huffnode); fclose(fp); }
#define MAXBIT 2000 /*定义哈夫曼编码的最大长度*/
#define MAXVALUE 1000 /*定义最大权值*/
#define MAXLEAF 256 /*定义哈夫曼树中最多叶子节点个数*/
#define MAXNODE MAXLEAF*2-1 /*哈夫曼树最多结点数*/
typedef struct { /*哈夫曼编码结信息的构*/
char bit[MAXBIT];
int start;
}Hcodetype;
typedef struct { /*哈夫曼树结点的结构*/
int weight;
int parent;
int lchild;
int rchild;
char ch;
}Hnodetype;
char ch[MAXVALUE*5];
static int numbers;
int number=0;
char varyCh[MAXLEAF];
int weight[MAXLEAF];
int pos[256];
int root;
char allHc[MAXVALUE*20];
/*----------分析输入的字符串--------------*/
void analyze(char ch[],int numbers,char varyCh[],int weight[],int& number){
int temp[256]={0};
int n=0;
for(int i=0;i<numbers;i++){
}
for(int j=0;j<256;j++){
if(temp[j]!=0){
varyCh[n]=(char)j;
weight[n]=temp[j];
pos[j]=n;
n++;
}
}
number=n;
}
void huffmantree(Hnodetype huffnode[MAXNODE]) /*构造哈夫曼树的函数*/
{
int i,j,m1,m2,x1,x2;
analyze(ch,numbers, varyCh, weight,number);
for(i=0;i<number;i++) /*存放哈夫曼树结点的数组huffnode[]初始化*/
{
huffnode[i].weight=weight[i];
huffnode[i].parent=-1;
huffnode[i].lchild=-1;
huffnode[i].rchild=-1;
huffnode[i].ch=varyCh[i];
}
for(i;i<2*number;i++){
huffnode[i].weight=0;
huffnode[i].parent=-1;
剩余6页未读,继续阅读
- qq_169885712015-11-25代码挺好的,就是中间有段代码我给删了才能运行!
- 咫影2013-05-12编译不通过,编译器问题?
- 粉丝: 13
- 资源: 15
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助