哈夫曼编码
来源:互联网 发布:json解析哪些框架 编辑:程序博客网 时间:2024/06/06 09:11
/*功能:(1)构建哈夫曼树 (2)获取哈夫曼编码 (3)计算带权路径长度作者:pussy日期:2015-11-29*/# include<stdio.h># include<stdlib.h># define MAX 100# define INF 65535typedef struct BiNode{ char data[MAX]; int weight; int parent,lchild,rchild;}BiNode;typedef struct{ int data[MAX]; int start;}HuffCode;void createHuffman(BiNode huffman[],int n);void HuffmanCode(BiNode huffman[],int n,HuffCode huffcode[]);int main(){ int n,i,j,wpl=0; printf("请输入节点的个数:\n"); scanf("%d",&n); BiNode * huffman=(BiNode *)malloc(2*n*sizeof(BiNode)); HuffCode *huffcode=(HuffCode *)malloc((n+1)*sizeof(HuffCode)); printf("请输入节点内容以及权值(格式:内容 权值)\n"); for(i=1;i<=n;i++) { scanf("%1s%d",&huffman[i].data,&huffman[i].weight); huffman[i].lchild=huffman[i].parent=huffman[i].rchild=-1; } for(i=n+1;i<2*n;i++) { huffman[i].lchild=huffman[i].parent=huffman[i].rchild=-1; } createHuffman(huffman,n); HuffmanCode(huffman,n,huffcode); printf("输出各个点的哈夫曼编码\n"); for(i=1;i<=n;i++) { printf("%1s的哈夫曼编码为:",huffman[i].data); for(j=huffcode[i].start;j<=n;j++) { printf("%d",huffcode[i].data[j]); } wpl=wpl+huffman[i].weight*(n-huffcode[i].start+1); printf("\n"); } printf("哈夫曼树的平均路径长度为%d\n",wpl); return 0;}void createHuffman(BiNode huffman[],int n){ int i,j; int min1,min2,lchild,rchild; for(i=n+1;i<=2*n-1;i++) { min1=min2=0; huffman[min1].weight=huffman[min2].weight=INF; for(j=1;j<i;j++) { if(huffman[j].parent==-1) { //min1记录权值最小的节点的下标 //min2记录权值第二小的节点的下标 if(huffman[j].weight<huffman[min1].weight) { min2=min1; min1=j; } else if(huffman[j].weight<huffman[min2].weight) { min2=j; } } } huffman[min1].parent=i; huffman[min2].parent=i; huffman[i].lchild=min1; huffman[i].rchild=min2; huffman[i].weight=huffman[min1].weight+huffman[min2].weight; }}void HuffmanCode(BiNode huffman[],int n,HuffCode huffcode[]){ int i,j; for(i=1;i<=n;i++) { int start=n; int f=i; int p=huffman[i].parent; //huffcode[i].data=(int *)malloc(sizeof(int)*(n+1)); while(p!=-1) { if(f==huffman[p].lchild) huffcode[i].data[start--]=0; else if(f==huffman[p].rchild) huffcode[i].data[start--]=1; f=p; p=huffman[p].parent; } huffcode[i].start=start+1; }}
0 0
- 信源编码---哈夫曼编码
- 哈夫曼编码
- 哈夫曼编码
- 哈夫曼编码
- 哈夫曼编码
- 哈夫曼编码
- 哈夫曼编码
- 哈夫曼编码
- 哈夫曼编码
- 哈夫曼编码
- 哈夫曼编码
- 哈夫曼编码
- 哈夫曼编码
- 哈夫曼编码
- 哈夫曼编码
- 哈夫曼编码
- 哈夫曼编码
- 哈夫曼编码
- 使用ViewPager进行Tab标签对应的Fragment切换
- 编写一个计算前100位斐波那契数的函数。
- 简述strcpy、sprintf与memcpy的区别
- UML图之构件图和部署图
- mini2440_x35 使用minicom进行连接,传送文件
- 哈夫曼编码
- hdoj5586Sum
- [JavaWeb]Maven安装配置
- n&(n-1)的妙用
- 欢迎使用CSDN-markdown编辑器
- week13---12月1日 JS内置对象(三)
- 单链表基本操作
- hdoj5585Numbers
- 响应链