如何构造哈夫曼树编码(哈夫曼树和编码应用用C++实现)

:暂无数据 2026-10-21 10:00:08 :0

如何构造哈夫曼树编码(哈夫曼树和编码应用用C++实现)

其实如何构造哈夫曼树编码的问题并不复杂,但是又很多的朋友都不太了解哈夫曼树和编码应用用C++实现,因此呢,今天小编就来为大家分享如何构造哈夫曼树编码的一些知识,希望可以帮助到大家,下面我们一起来看看这个问题的分析吧!

本文目录

哈夫曼树和编码应用用C++实现

#include
《stdio.h》
#define
MAXBIT
10
/*定义哈夫曼编码的最大长度*/
#define
MAXVALUE
10000
/*定义最大权值*/
#define
MAXLEAF
30
/*定义哈夫曼树中最多叶子节点个数*/
#define
MAXNODE
MAXLEAF*2-1
/*哈夫曼树最多结点数*/
typedef
struct
{
/*哈夫曼编码信息的结构*/
int
bit;
int
start;}Hcodetype;
typedef
struct
{
/*哈夫曼树结点的结构*/
int
weight;
int
parent;
int
lchild;
int
rchild;
}Hnodetype;
void
huffmantree(Hnodetype
huffnode,int
n)
/*构造哈夫曼树的函数*/
{
int
i,j,m1,m2,x1,x2;
for(i=0;i《2*n-1;i++)
/*存放哈夫曼树结点的数组huffnode初始化*/
{
huffnode.weight=0;
huffnode.parent=-1;
huffnode.lchild=-1;
huffnode.rchild=-1;
}
for(i=0;i《n;i++)
/*输入入N个叶子节点的权值*/
{
printf("please
input
%d
character’s
weight\n",i);
scanf("%d",&huffnode.weight);
}
for(i=0;i《n-1;i++)
/*开始循环构造哈夫曼树*/
{
m1=m2=MAXVALUE;
x1=x2=0;
for(j=0;j《n+i;j++)
{
if(huffnode.parent==-1)
{
m2=m1;x2=x1;m1=huffnode.weight;x1=j;
}
else
if(huffnode.parent==-1)
{
m2=huffnode.weight;x2=j;
}
}
huffnode.parent=n+i;
huffnode.parent=n+i;
huffnode.weight;
huffnode.lchild=x1;
huffnode.rchild=x2;
}
}
void
main()
{
Hnodetype
huffnode;
Hcodetype
huffcode,cd;
int
i,j,c,p,n;
printf("please
input
n\n");
scanf("%d",&n);
/*输入叶子节点个数*/
huffmantree(huffnode,n);
/*建立哈夫曼树*/
for(i=0;i《n;i++)
/*该循环求每个叶子节点对应字符的哈夫曼编码*/
{
cd.start=n-1;c=i;
p=huffnode.parent;
while(p!=-1)
{
if(huffnode.lchild==c)
cd.bit=0;
else
cd.bit=1;
cd.start--;c=p;
p=huffnode.parent;
}
for(j=cd.start+1;j《n;j++)
/*保存求出的每个叶节点的哈夫曼编码和编码的起始位*/
huffcode;
huffcode.start=cd.start;
}
for(i=0;i《n;i++)
/*输出每个叶子节点的哈夫曼编码*/
{
printf("%d
character
is:",i);
for(j=huffcode.start+1;j《n;j++)
printf("%d",huffcode);
printf("\n");
}
}

怎么样用c语言程序编码哈夫曼树

#include《stdio.h》
#include《stdlib.h》
#include《string.h》
#include 《ctype.h》
#include《limits.h》
int function1(char ch,char *s)
{
int i;
for(i=0; s!=’\0’; i++)
{
if(ch==s)return 0;
}
return 1;
}
typedef struct
{
unsigned int weight;
unsigned int parent,lchild,rchild;
} HTNode,*HuffmanTree; // 动态分配数组存储赫夫曼树
typedef char **HuffmanCode; // 动态分配数组存储赫夫曼编码表
// algo6-1.cpp 求赫夫曼编码。实现算法6.12的程序
int min(HuffmanTree t,int i)
{
// 函数void select()调用
int j,flag;
unsigned int k=UINT_MAX; // 取k为不小于可能的值
for(j=1; j《=i; j++)
if(t.parent==0)
k=t.weight,flag=j;
t.parent=1;
return flag;
}
void select(HuffmanTree t,int i,int &s1,int &s2)
{
// s1为最小的两个值中序号小的那个
s1=min(t,i);
s2=min(t,i);
/* if(s1》s2)
{
j=s1;
s1=s2;
s2=j;
}*/
}
void HuffmanCoding(HuffmanTree &HT,HuffmanCode &HC,int *w,int n) // 算法6.12
{
// w存放n个字符的权值(均》0),构造赫夫曼树HT,并求出n个字符的赫夫曼编码HC
int m,i,s1,s2,start;
unsigned c,f;
HuffmanTree p;
char *cd;
if(n《=1)
return;
m=2*n-1;
HT=(HuffmanTree)malloc((m+1)*sizeof(HTNode)); // 0号单元未用
for(p=HT+1,i=1; i《=n; ++i,++p,++w)
{
(*p).weight=*w;
(*p).parent=0;
(*p).lchild=0;
(*p).rchild=0;
}
for(; i《=m; ++i,++p)
(*p).parent=0;
for(i=n+1; i《=m; ++i) // 建赫夫曼树
{
// 在HT中选择parent为0且weight最小的两个结点,其序号分别为s1和s2
select(HT,i-1,s1,s2);
HT.parent=i;
HT.rchild=s1;
HT.lchild=s2;
HT.weight;
// printf("HT.rchild:%d\n",i,s2,i,s1);
}
// 从叶子到根逆向求每个字符的赫夫曼编码
HC=(HuffmanCode)malloc((n+1)*sizeof(char*));
// 分配n个字符编码的头指针向量(不用)
cd=(char*)malloc(n*sizeof(char)); // 分配求编码的工作空间
cd=’\0’; // 编码结束符
for(i=1; i《=n; i++)
{
// 逐个字符求赫夫曼编码
start=n-1; // 编码结束符位置
for(c=i,f=HT.parent)
// 从叶子到根逆向求编码
if(HT.lchild==c)
cd=’1’;
else
cd=’0’;
HC=(char*)malloc((n-start)*sizeof(char));
// 为第i个字符编码分配空间
strcpy(HC); // 从cd复制编码(串)到HC
}
free(cd); // 释放工作空间
}
void swap1(int *a ,int *b)
{
int t;
t=*a;
*a=*b;
*b=t;
}
void swap2(char *a,char *b)
{
char ch;
ch=*a;
*a=*b;
*b=ch;
}
int main(void)
{
HuffmanTree HT;
HuffmanCode HC;
char *s1,*s2;
int i,j=0,n,count,*m,t,flag=1;
scanf("%d",&n);
getchar();
s1=(char*)malloc((n+n)*sizeof(char));
s2=(char*)malloc(n*sizeof(char));
memset(s2,’\0’,n*sizeof(char));
gets(s1);
count=strlen(s1);
for(i=0; i《count; i++)
{
if(!isspace(*(s1+i)))
{
if(function1(*(s1+i),s2))
{
*(s2+j)=*(s1+i);
j++;
}
}
else;
}
m=(int*)malloc(j*sizeof(int));
for(i=0; i《j; i++)
*(m+i)=0;
for(t=0; t《j; t++)
{
for(i=0; i《count; i++)
{
if(*(s2+t)==*(s1+i))
*(m+t)+=1;
}
}
for(i=0;i《j;i++)
while(flag)
{
flag = 0;
for (t=0; t《j-1; t++)
{
if(*(m+t)《*(m+t+1))
{
swap1(m+t,m+t+1);
swap2(s2+t,s2+t+1);
flag=1;
}
}
}
HuffmanCoding(HT,HC,m,j);
for(i=1,t=0; i《=j; i++,t++)
{
printf("%c %d %s\n",*(s2+t),*(m+t),HC);
}
return 0;
}

关于如何构造哈夫曼树编码和哈夫曼树和编码应用用C++实现的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。

如何构造哈夫曼树编码(哈夫曼树和编码应用用C++实现)

本文编辑:admin

更多文章:


如何构造哈夫曼树编码(哈夫曼树和编码应用用C++实现)

如何构造哈夫曼树编码(哈夫曼树和编码应用用C++实现)

其实如何构造哈夫曼树编码的问题并不复杂,但是又很多的朋友都不太了解哈夫曼树和编码应用用C++实现,因此呢,今天小编就来为大家分享如何构造哈夫曼树编码的一些知识,希望可以帮助到大家,下面我们一起来看看这个问题的分析吧!

2026年10月21日 10:00

前端中switch语句(关于web前端的一个如何使按钮连接的方法)

前端中switch语句(关于web前端的一个如何使按钮连接的方法)

大家好,关于前端中switch语句很多朋友都还不太明白,不过没关系,因为今天小编就来为大家分享关于关于web前端的一个如何使按钮连接的方法的知识点,相信应该可以解决大家的一些困惑和问题,如果碰巧可以解决您的问题,还望关注下本站哦,希望对各位

2026年10月21日 08:30

android软件(android软件工程师)

android软件(android软件工程师)

这篇文章给大家聊聊关于android软件,以及android软件工程师对应的知识点,希望对各位有所帮助,不要忘了收藏本站哦。

2026年10月21日 07:50

html表格跨行(网页设计表格跨行,出现了空白,找不到原因,源文件如下)

html表格跨行(网页设计表格跨行,出现了空白,找不到原因,源文件如下)

今天给各位分享网页设计表格跨行,出现了空白,找不到原因,源文件如下的知识,其中也会对网页设计表格跨行,出现了空白,找不到原因,源文件如下进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

2026年10月21日 07:40

fwrite与fread(关于C/C++里FILE的fwrite和fread怎么用)

fwrite与fread(关于C/C++里FILE的fwrite和fread怎么用)

本篇文章给大家谈谈fwrite与fread,以及关于C/C++里FILE的fwrite和fread怎么用对应的知识点,文章可能有点长,但是希望大家可以阅读完,增长自己的知识,最重要的是希望对各位有所帮助,可以解决了您的问题,不要忘了收藏本站

2026年10月21日 06:10

body onload(在html的body标记里加onload=“loader();“代码是代表什么意思)

body onload(在html的body标记里加onload=“loader();“代码是代表什么意思)

这篇文章给大家聊聊关于body onload,以及在html的body标记里加onload=“loader();“代码是代表什么意思对应的知识点,希望对各位有所帮助,不要忘了收藏本站哦。

2026年10月21日 02:20

被人排斥怎么办(感觉被人排斥、孤立该怎么办)

被人排斥怎么办(感觉被人排斥、孤立该怎么办)

“被人排斥怎么办”相关信息最新大全有哪些,这是大家都非常关心的,接下来就一起看看被人排斥怎么办(感觉被人排斥、孤立该怎么办)!

2026年10月20日 23:20

图灵社区 阅读 怎样在 Markdown 中使程序代码带上行号?图灵社区 阅读 为什么要选择Python语言实现机器学习算法

图灵社区 阅读 怎样在 Markdown 中使程序代码带上行号?图灵社区 阅读 为什么要选择Python语言实现机器学习算法

大家好,今天小编来为大家解答以下的问题,关于图灵社区,图灵社区 阅读 怎样在 Markdown 中使程序代码带上行号这个很多人还不知道,现在让我们一起来看看吧!

2026年10月20日 22:30

editorial hand翻译(英语翻译,下面的话什么意思)

editorial hand翻译(英语翻译,下面的话什么意思)

大家好,今天小编来为大家解答以下的问题,关于editorial hand翻译,英语翻译,下面的话什么意思这个很多人还不知道,现在让我们一起来看看吧!

2026年10月20日 22:10

结构体类型的指针怎么理解(结构体指针,类指针是什么意思)

结构体类型的指针怎么理解(结构体指针,类指针是什么意思)

今天给各位分享结构体指针,类指针是什么意思的知识,其中也会对结构体指针,类指针是什么意思进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

2026年10月20日 21:00

最近更新

importantly翻译(重要的怎么翻译)
2026-10-21 11:30:09 浏览:0
mysql数据库安装包(mysql安装教程)
2026-10-21 11:20:28 浏览:0
100m是多少空间(100兆等于多少M)
2026-10-21 11:00:28 浏览:0
2022年第3号台风(三号台风叫什么)
2026-10-21 10:50:21 浏览:0
carrot复数(胡萝卜的复数)
2026-10-21 10:20:03 浏览:0
热门文章

sql server2008下载地址(如何下载SQL Server 2008 R2 SP2免费版)
2026-10-05 05:30:29 浏览:6
thinkpadx100eu盘启动(thinkpad x100e U盘启动 支持的写入方式是什么)
2026-09-01 14:20:01 浏览:6
标签列表