数据结构 Huffman编码实现
2017-04-28 20:31
218 查看
#include <iostream> #include <stdlib.h> #include <string.h> using namespace std; #define OK 1 #define ERROR 0 typedef char TElemType; typedef char **HuffmanCode; typedef int Status; typedef struct { TElemType data; unsigned int weight; unsigned int parent,lchild,rchild; } HTNode,*HuffmanTree; Status Select(HuffmanTree HT,int i,unsigned int &s1,unsigned int &s2) { int count = 0; for(int j =0; j<i; j++) { if(HT[j].parent == 0) { count ++; } } if(count == 0) { return ERROR; } int tmp =0; //最小 for(int j1 =0; j1<i; j1++) { if(HT[j1].parent != 0) { continue; } //--------初始化s1------- tmp++; if(tmp == 1) { s1 = j1; } //----------------------- if(HT[j1].weight<HT[s1].weight) { s1 = j1; } } tmp = 0; //次小 for(int a = 0; a<i; a++) { if(HT[a].parent != 0) { continue; } //------初始化s2-------- tmp ++; if(tmp == 1) { if(a ==s1) { tmp =0; continue; } else { s2 = a; } } //-------------------- if(HT[a].weight<HT[s2].weight && a!=s1) { s2 = a; } } //cout<<s1<<"--"<<s2<<endl; return OK; } void HuffmanCoding(HuffmanTree &HT,HuffmanCode &HC,TElemType *d,unsigned int *w,int n) { if(n<=1)return; int m = 2*n-1;//总结点数 HT = (HuffmanTree)malloc((m)*sizeof(HTNode)); HuffmanTree p; int i; //带权重结点初始化(叶子结点) for(p=HT,i=0; i<n; ++i,++p,++d,++w) { *p = {*d,*w,0,0,0};//******************************* } //空白结点初始化 for(; i<m; ++i,++p) { *p = {'0',0,0,0,0}; } unsigned int s1 ; unsigned int s2 ; //构造哈夫曼树 for(unsigned int i1 = n; i1<m; ++i1) { Select(HT,i1,s1,s2);//选择parent为0,且权值最小的两个结点 HT[s1].parent = i1; HT[s2].parent = i1; HT[i1].lchild = s1; HT[i1].rchild = s2; HT[i1].weight = HT[s1].weight+HT[s2].weight; } //-----------构造哈夫曼编码----------------- HC = (HuffmanCode)malloc(n*sizeof(char*)); char * cd = (char *)malloc(n*sizeof(char)); cd[n-1] = '\0'; for(int j = 0; j<n; ++j) { int start = n-1; for(int c= j, f =HT[j].parent; f!=0; c = f,f = HT[f].parent) { if(HT[f].lchild == c) { cd[--start] = '0'; // cout<<'0'; } else { cd[--start] = '1'; // cout<<'1'; } } // cout<<endl; HC[j] = (char*)malloc((n-start)*sizeof(char)); strcpy(HC[j],&cd[start]);//*********************** } free(cd); } int main() { HuffmanTree HT; HuffmanCode HC; int number; cin>>number; unsigned int *w = new unsigned int[number]; TElemType *d = new TElemType [number]; //字符集 int i =0; while(i<number) { cin>>d[i++]; } //权重 i = 0; while(i<number) { cin>>w[i++]; } // unsigned int w [10]= {1,2,3,4,5,6,7,8,9,10}; HuffmanCoding(HT,HC,d,w,number); cout<<"各结点对应编码:"<<endl; for(int j = 0; j<number; j++) { cout<<HT[j].data<<"--"<<HC[j]<<endl; } }
相关文章推荐
- 如何实现win9X进程间数据通讯技术
- 用canvas实现红心飘飘的动画效果
- 利用Hook技术实现键盘监控
- 用Delphi实现远程屏幕抓取
- 如何利用C++ Builder 4.0 Enterprise实现对Excel97 的调用
- 应用程序敏感键的实现
- 在PB中快速实现数据库树形结构
- 在PowerBuilder中实现菜单条级权限的设置
- PB7.0中实现Jaguar GTS组件开发
- 如何实现数据的自动录入
- PowerBuilder中实现数据窗口打印预览通用方法
- 用Delphi实现远程屏幕抓取
- 用CTI实现与Web交谈
- WebClass实现动态WEB编程之理论篇
- WebClass实现动态WEB编程之实践篇
- 实现类似IE的打印网页功能
- 用DELPHI实现特色按钮
- 串行通信的基本原理及用MFC实现串口通信编程
- 如何在应用程序中实现关机功能
- 用Delphi在工业控制和自动化实现多线程进行数据采集