编码-哈夫曼树,请问大神们,下面的译码部分怎么没有输出?请大神们帮我修改下~~~(最好再加个能有个文件输出)

问题描述

哈夫曼树,请问大神们,下面的译码部分怎么没有输出?请大神们帮我修改下~~~(最好再加个能有个文件输出)

#include
#include
#include
#define maxsize 100
#define max 100
typedef struct
{
char data;
int weight;
int parent;
int lchild;
int rchild;
}huffnode;
typedef struct
{
char cd[max];
int start;
}huffcode;
huffnode ht[2*max];
huffnode * input()
{
int i,n;
printf("Enter elem num:");
scanf("%d",&n);
ht[0].weight=n;
for(i=1;i<=n;i++)
{
getchar();
printf("%d elem data weight:",i);
scanf("%c%d",&ht[i].data,&ht[i].weight);
}
return ht;
}
// huffnode ht[2*max];
huffnode init()
{
ht[0].weight=27;
ht[1].data=' ';ht[1].weight=186;
ht[2].data='A';ht[2].weight=64;
ht[3].data='B';ht[3].weight=13;
ht[4].data='C';ht[4].weight=22;
ht[5].data='D';ht[5].weight=32;
ht[6].data='E';ht[6].weight=103;
ht[7].data='F';ht[7].weight=21;
ht[8].data='G';ht[8].weight=15;
ht[9].data='H';ht[9].weight=47;
ht[10].data='I';ht[10].weight=57;
ht[11].data='J';ht[11].weight=1;
ht[12].data='K';ht[12].weight=5;
ht[13].data='L';ht[13].weight=32;
ht[14].data='M';ht[14].weight=20;
ht[15].data='N';ht[15].weight=57;
ht[16].data='O';ht[16].weight=63;
ht[17].data='P';ht[17].weight=15;
ht[18].data='Q';ht[18].weight=1;
ht[19].data='R';ht[19].weight=48;
ht[20].data='S';ht[20].weight=51;
ht[21].data='T';ht[21].weight=80;
ht[22].data='U';ht[22].weight=23;
ht[23].data='V';ht[23].weight=8;
ht[24].data='W';ht[24].weight=18;
ht[25].data='X';ht[25].weight=1;
ht[26].data='Y';ht[26].weight=16;
ht[27].data='Z';ht[27].weight=1;
return ht;
}
void hfmtree(huffnode ht[])
{
int i,k,s1,s2,m1,m2,n;
n=ht[0].weight;
for(i=0;i<=2*n-1;i++)
ht[i].parent=ht[i].lchild=ht[i].rchild=0;
for(i=n+1;i<=2*n-1;i++)
{
m1=m2=10000;
s1=s2=0;
for(k=0;k<=i-1;k++)
if(ht[k].parent==0)
if(ht[k].weight
{
m2=m1;
s2=s1;
m1=ht[k].weight;
s1=k;
}
else if(ht[k].weight
{
m2=ht[k].weight;
s2=k;
}
ht[s1].parent=i;
ht[s2].parent=i;
ht[i].weight=ht[2].weight+ht[3].weight;
ht[i].lchild=s1;
ht[i].rchild=s2;
}
}
huffcode hcd[max],d;
huffcode *output(huffnode ht[])
{
int i,n,f,c,k,x;
n=ht[0].weight;
for(i=0;i
{
d.start=n+1;
c=i;
f=ht[i].parent;
while(f!=0)
{
if(ht[f].lchild==c)
d.cd[--d.start]='0';
else
d.cd[--d.start]='1';
c=f;
f=ht[f].parent;
}
hcd[i]=d;
}
printf("Input huffman code:n");
for(i=0;i
{
printf("%c:",ht[i].data);
x=hcd[i].start;
for(k=x;k
printf("%c",hcd[i].cd[k]);
printf("n");
}
return hcd;
}
void coding(huffcode hcd[],huffnode ht[])
{
int i,j,m,n,k,x;
char in[maxsize],out[2*maxsize];
m=0;
printf("Enter a string:");
getchar();
gets(in);
n=strlen(in);
for(i=0;i
{
for(j=0;j
if(in[i]==ht[j].data)
{
x=hcd[j].start;
for(k=x;k
out[m++]=hcd[j].cd[k];
}
}
printf("The coding result is:n");
for(i=0;i
printf("%c",out[i]);
printf("n");
}
void decoding(huffcode hcd[],huffnode ht[])
{
int i,j,m,k,x,n,w,h;
char code[maxsize*2],decode[maxsize];
printf("Enter code stream:n");
scanf("%s",code);
n=strlen(code);
i=0;m=0;
while(i
for(j=0;j
{
x=hcd[j].start;
for(k=x,w=i;k
if(code[w]!=hcd[j].cd[k])
break;
if(k>ht[0].weight)
{
decode[m++]=ht[j].data;
break;
}
}
i=w;
}
printf("The decoding result is:n");
printf("%c",decode[i]);
}
int main ()
{
int select;
huffnode * ht;
huffcode * hcd;
ht=init();
hfmtree(ht);
hcd=output(ht);
do
{
printf("
*************n");
printf("0. 退出n");
printf("1. 编码n");
printf("2. 译码n");
printf("**************n");
printf("Enter (0---2):");
scanf("%d",&select);
if(select==0){
printf("Thank you use the software!n");
exit(1);
}
if(select==1)
coding(hcd,ht);
else if(select==2)
decoding(hcd,ht);
}while(1);
return 0 ;
}

解决方案

在线等,急急急!!!

解决方案二:

看你敲这么长一堆东西,实在也是够拼的,你可以参考一下这篇文章:数据结构与算法-赫夫曼树(最优二叉树)希望能对你有所帮助

时间: 2024-08-23 22:50:17

编码-哈夫曼树,请问大神们,下面的译码部分怎么没有输出?请大神们帮我修改下~~~(最好再加个能有个文件输出)的相关文章

编码-霍夫曼树程序,输入字符串统计字符出现次数并译码。请问如何改成从文件读入字符串?

问题描述 霍夫曼树程序,输入字符串统计字符出现次数并译码.请问如何改成从文件读入字符串? //生成HuffmanCode文件的两个函数void HuffmanEncoding(HuffmanTree HTHuffmanCode HC){//根据HuffmanTreeHT求HuffmanCode表HC int cpi; char cd[n]; int start; cd[num] = ''; for(i = 1;i <= num;i++){ start = num; c = i; while((p

编码-赫夫曼树出错 ,编译没错 不知道哪里错了运行不了

问题描述 赫夫曼树出错 ,编译没错 不知道哪里错了运行不了 编译没有错误,运行失败 #include <stdio.h> #include <stdlib.h> #include <math.h> #include <string.h> #define STACK_INIT_SIZE 100//存储空间初始分配量 没分号";" #define STACKINCREMENT 10 //存储空间分配增量 #define TRUE 1 #def

哈夫曼编码 哈夫曼树

1.定义 哈夫曼编码主要用于数据压缩. 哈夫曼编码是一种可变长编码.该编码将出现频率高的字符,使用短编码:将出现频率低的字符,使用长编码. 变长编码的主要问题是,必须实现非前缀编码,即在一个字符集中,任何一个字符的编码都不是另一个字符编码的前缀.如:0.10就是非前缀编码,而0.01不是非前缀编码. 2.哈夫曼树的构造 按照字符出现的频率,总是选择当前具有较小频率的两个节点,组合为一个新的节点,循环此过程知道只剩下一个节点为止. 对于5个字符A.B.C.D.E,频率分别用1.5.7.9.6表示,

数据结构——赫夫曼树

1 基本概念 赫夫曼树(Huffman Tree)又称为最优树,是一类带权路径长度最短的树.本文仅讨论最优二叉树. 树的路径长度是指从树根到树中其余各个结点的路径长度之和.对具有n个结点的二叉树而言,完全二叉树具有最短的树的路径长度. 若在二叉树中,树叶结点带有权值,则有:结点的带权路径长度定义为从树根到该结点之间的路径长度与该结点上所带权值之积. 若树中有n个树叶结点,且每个树叶结点均带有权值,则有:树的带权路径长度定义为树中所有树叶结点的带权路径长度之和,可记为: 有时,也将树的路径长度称为

哈夫曼树及哈夫曼编码

         一,引言          如上图,是一个判断体重在什么范围内的判定树,例如,学校体检的时候,我们反复用这个算法,当你输入一个体重:200斤,然后程序就开始反复判断了,经过三次判断,它发现你过重,然后重启系统了,又来一个人,还是200斤,三次判断之后,又系统重启了-后面的200多个200多斤的盘子判断完了之后,来了个120的,终于是个比较正常的体重了,但是系统一判断完,系统还是重启,反复检查之后,发现你那台8086时代的电脑终于撑不住了~      于是你改了下算法,换了一棵判

解析C++哈夫曼树编码和译码的实现_C 语言

一.背景介绍: 给定n个权值作为n个叶子结点,构造一棵二叉树,若带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree).哈夫曼树是带权路径长度最短的树,权值较大的结点离根较近. 二.实现步骤: 1.构造一棵哈夫曼树 2.根据创建好的哈夫曼树创建一张哈夫曼编码表 3.输入一串哈夫曼序列,输出原始字符 三.设计思想: 1.首先要构造一棵哈夫曼树,哈夫曼树的结点结构包括权值,双亲,左右孩子:假如由n个字符来构造一棵哈夫曼树,则共有结点2n-1个:在构造前,先初始化

哈夫曼树以及哈夫曼编码

哈夫曼树简介 哈夫曼树(哈夫曼树),又称最优二叉树,是一类带权路径长度最短的树.假设有n个权值{w1,w2,...,wn},如果构造一棵有n个叶子节点的二叉树,而这n个叶子节点的权值是{w1,w2,...,wn},则所构造出的带权路径长度最小的二叉树就被称为哈夫曼树. 这里补充下树的带权路径长度的概念.树的带权路径长度指树中所有叶子节点到根节点的路径长度与该叶子节点权值的乘积之和,如果在一棵二叉树中共有n个叶子节点,用Wi表示第i个叶子节点的权值,Li表示第i个也叶子节点到根节点的路径长度,则该

数据-赫夫曼树的生成,完成赫夫曼编码的输出

问题描述 赫夫曼树的生成,完成赫夫曼编码的输出 实现赫夫曼树的生成,完成赫夫曼编码的输出: 要求 利用动态分配数组存储赫夫曼树,设计一组输入数据(要求为二元组,分别为字符集与每个字符出现的频率),能够对其进行如下操作: 1)对输入的数据构造成一棵Huffman 树. 2)根据生成的Huffman 树进行Huffman 编码,实现对输入数据的Huffman 编码输出. 我承认这是一个作业贴,但确实没时间做了 才来找人帮忙的

优先级队列实现哈夫曼树的编码和译码

//优先级队列实现的哈夫曼树的编码和译码 #include<iostream> #include<queue> #include<string> using namespace std; class Node { public: float weight; Node* left; Node* right; char ch; Node(float w,Node* l=NULL,Node* r=NULL,char c=' '):weight(w),ch(c),left(l)