哈夫曼树编码与译码解码运用
2016-06-07 21:29
417 查看
#include<stdio.h> #include<conio.h> #define MAXVALUE 10000 #define MAXLEAF 30 #define MAXNODE MAXLEAF*2-1 #define MAXBIT 50 typedef struct node{ char letter; int weight; int parent; int lchild; int rchild; }HNodeType; typedef struct { char letter; int bit[MAXBIT]; int start; }HCodeType; typedef struct { char s; int num; }Bowen; /*哈夫曼树的构造算法*/ void HuffmanTree(HNodeType HuffNode[],int n,Bowen a[]) { int i,j,m1,m2,x1,x2,temp1;char temp2; for(i=0;i<2*n-1;i++) { HuffNode[i].letter=NULL; HuffNode[i].weight=0; HuffNode[i].parent=-1; HuffNode[i].lchild=-1; HuffNode[i].rchild=-1; } for(i=0;i<n-1;i++) for(j=i+1;j<n-1;j++) if(a[j].num>a[i].num) { temp1=a[i].num;a[i].num=a[j].num;a[j].num=temp1; temp2=a[i].s;a[i].s=a[j].s;a[j].s=temp2;} for(i=0;i<n;i++) { HuffNode[i].weight=a[i].num; HuffNode[i].letter=a[i].s;} for(i=0;i<n-1;i++) /*构造哈夫曼树*/ { m1=m2=MAXVALUE; x1=x2=0; for(j=0;j<n+i;j++) /*找出的两棵权值最小的子树*/ { if(HuffNode[j].parent==-1&&HuffNode[j].weight<m1) { m2=m1;x2=x1; m1=HuffNode[j].weight; x1=j; } else if(HuffNode[j].parent==-1&&HuffNode[j].weight<m2) { m2=HuffNode[j].weight; x2=j; } } /*将找出的两棵子树合并为一棵子树*/ HuffNode[x1].parent=n+i;HuffNode[x2].parent=n+i; HuffNode[n+i].weight=HuffNode[x1].weight+HuffNode[x2].weight; HuffNode[n+i].lchild=x1; HuffNode[n+i].rchild=x2; } } /*生成哈夫曼编码*/ void HuffmanCode(int n,Bowen a[]) { HNodeType HuffNode[MAXNODE]; HCodeType HuffCode[MAXLEAF],cd; int i,j,c,p; char code[30],*m; HuffmanTree(HuffNode,n,a); /*建立哈夫曼树*/ for(i=0;i<n;i++) /*求每个叶子结点的哈夫曼编码*/ { cd.start=n-1; c=i; p=HuffNode[c].parent; while(p!=-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;} for(j=cd.start+1;j<n;j++) /*保存求出的每个叶结点的哈夫曼编码和编码的起始位*/ HuffCode[i].bit[j]=cd.bit[j]; HuffCode[i].start=cd.start; } printf("输出每个叶子的哈夫曼编码:\n"); for(i=0;i<n;i++) /*输出每个叶子结点的哈夫曼编码*/ { HuffCode[i].letter=HuffNode[i].letter; printf(" %c:",HuffCode[i].letter); for(j=HuffCode[i].start+1;j<n;j++) printf(" %d",HuffCode[i].bit[j]); printf("\n"); } printf("请输入电文(1/0):\n"); for(i=0;i<30;i++) code[i]=NULL; scanf(" %s",&code); m=code; c=2*n-2; printf("输出哈夫曼译码:\n"); while(*m!=NULL) { if(*m=='0') { c=i=HuffNode[c].lchild; if(HuffNode[c].lchild==-1&&HuffNode[c].rchild==-1) { printf("%c",HuffNode[i].letter); c=2*n-2; } } if(*m=='1') { c=i=HuffNode[c].rchild; if(HuffNode[c].lchild==-1&&HuffNode[c].rchild==-1) { printf("%c",HuffNode[i].letter);c=2*n-2; } } m++; } printf("\n"); } int main(void) { Bowen data[30]; char s[100],*p; int i,count=0; printf("\n 请输入一些字符:"); scanf("%s",&s); for(i=0;i<30;i++) { data[i].s=NULL; data[i].num=0;} p=s; while(*p) { for(i=0;i<=count+1;i++) { if(data[i].s==NULL) { data[i].s=*p;data[i].num++;count++;break; } else if(data[i].s==*p) { data[i].num++;break; } } p++; } printf("\n"); printf(" 不同的字符数:%d\n",count); for(i=0;i<count;i++) { printf(" %c ",data[i].s); printf(" 权值:%d",data[i].num); printf("\n"); } HuffmanCode(count,data); getch(); }
相关文章推荐
- 贪心算法的C语言实现与运用详解
- php printf输出格式使用说明
- 如何解决Oracle EBS R12 - 以Excel查看输出格式为“文本”的请求时乱码
- 贪心算法 WOODEN STICKS 实例代码
- 浅析java贪心算法
- c语言来实现贪心算法之装箱问题
- 贪心算法
- 贪心算法——找纸币问题
- ACM常用算法
- 喷水装置
- 过河问题
- HDU 1009
- TOJ 2882
- 【贪心】今年暑假不AC
- 【贪心】FatMouse' Trade
- 背包问题knapsack的三种解法(Python 和 C)
- 背包问题knapsack的三种解法(Python 和 C)
- LeetCode之Jump Game
- 1004贪心算法acm
- 1006-贪心算法acm