求高手帮忙! 是不是我的算法有问题?出不了结果呀!!
2004-11-28 16:46
375 查看
#include<iostream.h>
#include<malloc.h>
#include<string>
#define N 129
typedef struct{
unsigned int weight;
unsigned int parent,lchild,rchild;
}HTNode,*HuffmanTree;
typedef char **HuffmanCode;
void Select (HuffmanTree H,int i,unsigned int &s1,unsigned int &s2)
{
int k=0;
for(int m=1;m<i;m++){
if(H[m].parent==0&&H[m].weight<H[m+1].weight) H[0]=H[m];k=m;}
if(H[i].parent==0&&H[i].weight<H[i-1].weight) {H[0]=H[i];k=i;}
s1=k;
for(m=1;m<i||m!=k;m++){
if(H[m].parent==0&&H[m].weight<H[m+1].weight) H[0]=H[m];k=m;}
if(H[i].parent==0&&H[i].weight<H[i-1].weight&&i!=s1) {H[0]=H[i];k=i;}
s2=k;
}
void HuffmanCoding(HuffmanTree &HT,HuffmanCode &HC,int *w,int n){
if(n<=1)return;
int m=2*n-1;
HT=(HuffmanTree)malloc((m+1)*sizeof(HTNode));
int i=1;
for(HuffmanTree p=HT;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;}
for(i=n+1;i<=m;++i){
unsigned int s1,s2;
Select(HT,i-1,s1,s2);
HT[s1].parent=i;HT[s2].parent=i;
HT[i].lchild=s1;HT[i].rchild=s2;
HT[i].weight=HT[s1].weight+HT[s2].weight;
}
HC=(HuffmanCode)malloc((n+1)*sizeof(char*));
char *cd;
cd=(char*)malloc(n*sizeof(char));
cd[n-1]='/0';
for(i=1;i<=n;++i){
int start=n-1;
for(int 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);
}
void main(){
char ch
;
int ww
;
int n;
HuffmanTree ht;
HuffmanCode hc;
cout<<"欢迎使用本哈夫曼编/译码器,请先输入字符及其频度,系统将自动将字符转化为相应哈夫曼编码."<<endl;
cout<<"请输入你所要编译的字符个数:"<<endl;
cin>>n;
if(n>N||n<1) cout<<"超出译码字符个数范围!"<<endl;
if(n>0&&n<N+1)
{cout<<"请依次输入需编译的字符(用空格隔开):"<<endl;
for(int i=1;i<=n;i++){cin>>ch[i];}
cout<<"请依次输入相应字符的频度(用空格隔开):"<<endl;
for(i=1;i<=n;i++){cin>>ww[i];}
int *w=&ww
;
HuffmanCoding(ht,hc,w,n);
for(i=1;i<n+1;i++){cout<<&hc[i]<<endl;}
}
}
相关文章推荐
- 将15位身份证补全为18位身份证的算法示例详解
- C++算法系列之日历生成的算法代码
- 主引导扇区释疑
- 英雄无敌程序员版
- 统一权限系统URight1.5
- 计算器原代码的问题
- 关于数据库备份的问题!
- 关于目前的方向
- 引用一个人的说法看中国软件需求基础
- 力争最简单把*、&说清楚
- 图像透明度算法
- set()的用法小介
- 从注册表中还原MSNMessenger口令
- 非对称加密算法中求解大正整数模大正整数的余数的快速计算法
- 一种基于R-Tree的改进多维索引[待正稿]
- 纯编码实现数据库的建立或压缩
- Decal SDL-Delphi的范型类库-通用数据结构与算法类库(一)
- SymbianOS Series 60学习笔记三:数据库初探
- Defeating Non Executable Stack Protection With TEB Buffer
- 贪心算法在竞赛中的应用