哈夫曼树的创建以及编码
来源:互联网 发布:bms算法 编辑:程序博客网 时间:2024/05/24 03:15
在codeblocks下编译运行通过。
#include<stdio.h>#include<stdlib.h>#include<string.h>typedef struct{ int weight; int parent,lchild,rchild;}HTNode,*HuffmanTree;typedef char **HuffmanCode;int min1(HuffmanTree t,int i){//函数VOID select调用 int j,flag; int k=10000;//取K为最小可能的值 for(j=1;j<=i;j++) if(t[j].weight<k && t[j].parent==0) { k=t[j].weight; flag=j; } t[flag].parent=1; return flag;}void Select(HuffmanTree HT,int i,int *s1,int *s2){ int j; *s1=min1(HT,i); *s2=min1(HT,i); if(*s1>*s2) { j=*s1; *s1=*s2; *s2=j; }}//创建哈夫曼树void CreateHuffmanTree(HuffmanTree *HT,int *w,int n){ int i,s1,s2,k,f; if(n<=1) printf("error"); int m; m=2*n-1; HTNode *p; *HT=(HuffmanTree)malloc((m+1)*sizeof(HTNode)); for(p=*HT+1,i=1;i<=n;i++,p++,w++){ p->weight=*w; p->parent=0; p->lchild=0; p->rchild=0; } for(;i<=m;i++,p++){ p->weight=0; p->parent=0; p->lchild=0; p->rchild=0; } //在HT[1...i-1]中选择parent为0且权值最小的两个节点,序号分别为s1,s2; for(i=n+1;i<=m;i++){ printf("1111111"); Select(*HT,i-1,&s1,&s2); printf("222222"); HT[s1]->parent = i; printf("333333");HT[s2]->parent = i; HT[i]->lchild = s1; HT[i]->rchild = s2; HT[i]->weight = HT[s1]->weight + HT[s2]->weight; }}//得到Huffman编码void HuffmanTreeCode(HuffmanTree *HT,HuffmanCode *HC,int n){ int start,c,i,f; char *cd; *HC=(HuffmanCode)malloc((n+1)*sizeof(char *)); cd=(char *)malloc(n*sizeof(char)); cd[n-1]='\0'; for(i=1;i<=n;i++){ start =n-1; for(c=i,f=HT[i]->parent;f!=0;c=f,f=HT[f]->parent){ if(HT[f]->lchild==c) cd[--start]='0'; else cd[--start]='1'; } *HC[i]=(char *)malloc((n-start)*sizeof(char)); strcpy(*HC[i],&cd[start]); } free(cd); //打印哈夫曼编码 printf("number\t\tweight\t\tCode\n"); for(i=1;i<=n;i++){ printf("%d\t\t%d\t\t%d\n",i,HT[i]->weight,HC[i]); }}void ShowHuffmanTree(HuffmanTree HT,int n){ int i; printf("赫夫曼树如下:\n"); printf("number\t\tweight\t\tparent\t\tlchild\t\trchild\n"); for(i=1;i<=2*n-1;i++){ printf("%d\t\t%d\t\t%d\t\t%d\t\t%d\n",i,HT[i].weight,HT[i].parent,HT[i].lchild,HT[i].rchild); }}void main(){ int i,n; int *w; printf("请输入节点个数n(n>1):"); scanf("%d",&n); w=(int *)malloc((n+1)*sizeof(int)); w[0]=0; printf("请输入对应的权值:"); for(i=1;i<=n;i++){ scanf("%d",&w[i]); } HuffmanCode HC=NULL; HuffmanTree HT=NULL; CreateHuffmanTree(&HT,w,n); HuffmanTreeCode(&HT,&HC,n); ShowHuffmanTree(HT,n);}
0 0
- 哈夫曼树的创建以及编码
- 哈夫曼树以及哈夫曼编码的创建
- 哈夫曼树的构造以及编码
- 哈夫曼树的创建和编码
- 【哈夫曼树】哈夫曼树的实现以及哈弗曼编码
- 哈夫曼树以及哈夫曼编码的实现
- 哈夫曼树的构造以及编码实现
- 哈夫曼树的建立以及哈夫曼编码
- 哈夫曼树以及哈夫曼编码
- 哈夫曼树以及哈夫曼编码 .
- c++哈夫曼树以及编码
- 哈夫曼树以及编码
- 哈夫曼树以及哈夫曼编码
- 哈夫曼树以及哈夫曼编码
- 哈夫曼树以及哈夫曼编码
- BASE64的编码以及注意事项
- 编码以及计算机的发展
- 哈夫曼树的建立、编码以及WPL值的计算
- 函数
- 1,5-萘啶254甲硫芬
- 使用百度地图API,定位并显示自己的位置
- CodeForces 260B Ancient Prophesy 模拟
- php面试
- 哈夫曼树的创建以及编码
- Leetcode159: Fraction to Recurring Decimal
- CSS布局 ——从display,position, float属性谈起
- 参加Autodesk 2015 开发者大会:物联网有意思的试验
- 图的幂律度分布 power-law degree distributios
- Python核心数据类型——列表与字典
- 关于python 科学计算库的下载
- html5 原生表单验证+ajax 提交
- HDU 5456 Matches Puzzle Game [数位DP]