哈夫曼编码
2015-11-29 21:41
429 查看
/* 功能:(1)构建哈夫曼树 (2)获取哈夫曼编码 (3)计算带权路径长度 作者:pussy 日期:2015-11-29 */ # include<stdio.h> # include<stdlib.h> # define MAX 100 # define INF 65535 typedef 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; } }
相关文章推荐
- HDU4081 Qin Shi Huang's National Road System(次小生成树)
- 记录-移动端网页触摸内容滑动js插件
- 编写一个计算前100位斐波那契数的函数。
- 简述strcpy、sprintf与memcpy的区别
- hdoj5578Friendship of Frog
- web开发--- 牛腩总:细节篇
- 创建socket函数的第三个参数的意义
- Switch语句
- 将表转javabean(基于mysql)
- UML图之构件图和部署图
- java线程通信,解决线程之间的交互问题
- 第一周博客
- ACM算法总结及刷题参考
- 哈理工练习赛 杭电 HDU Prime Path 1973 poj 3126 Prime Path
- GCD详解及实现
- Hive安装(三)之奇怪的错误
- some apis
- PHP缓存技术的使用说明
- JAVA Socket 编程---Socket 和 ServerSocket
- 20135321余佳源——信息安全系统设计基础第十二周学习总结