问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

数据结构(C语言)-哈夫曼编码求助!!

发布网友 发布时间:2022-04-25 16:58

我来回答

2个回答

热心网友 时间:2023-10-20 22:00

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef char* HuffmanCode;/*动态分配数组,存储哈夫曼编码*/

typedef struct
{
unsigned int weight ; /* 用来存放各个结点的权值*/
unsigned int parent, LChild,RChild ; /*指向双亲、孩子结点的指针*/
}HTNode, * HuffmanTree; /*动态分配数组,存储哈夫曼树*/

void select(HuffmanTree *ht,int n, int *s1, int *s2)
{
int i;
int min;
for(i=1; i<=n; i++)
{
if((*ht)[i].parent == 0)
{
min = i;
i = n+1;
}
}
for(i=1; i<=n; i++)
{
if((*ht)[i].parent == 0)
{
if((*ht)[i].weight < (*ht)[min].weight)
min = i;
}
}
*s1 = min;
for(i=1; i<=n; i++)
{
if((*ht)[i].parent == 0 && i!=(*s1))
{
min = i;
i = n+1;
}
}
for(i=1; i<=n; i++)
{
if((*ht)[i].parent == 0 && i!=(*s1))
{
if((*ht)[i].weight < (*ht)[min].weight)
min = i;
}
}
*s2 = min;
}

void CrtHuffmanTree(HuffmanTree *ht , int *w, int n)
{ /* w存放已知的n个权值,构造哈夫曼树ht */
int m,i;
int s1,s2;
m=2*n-1;
*ht=(HuffmanTree)malloc((m+1)*sizeof(HTNode)); /*0号单元未使用*/
for(i=1;i<=n;i++)
{/*1-n号放叶子结点,初始化*/
(*ht)[i].weight = w[i];
(*ht)[i].LChild = 0;
(*ht)[i].parent = 0;
(*ht)[i].RChild = 0;
}
for(i=n+1;i<=m;i++)
{
(*ht)[i].weight = 0;
(*ht)[i].LChild = 0;
(*ht)[i].parent = 0;
(*ht)[i].RChild = 0;
} /*非叶子结点初始化*/
/* ------------初始化完毕!对应算法步骤1---------*/

for(i=n+1;i<=m;i++) /*创建非叶子结点,建哈夫曼树*/
{ /*在(*ht)[1]~(*ht)[i-1]的范围内选择两个parent为0且weight最小的结点,其序号分别赋值给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;
}
}/*哈夫曼树建立完毕*/
void outputHuffman(HuffmanTree HT, int m)
{
if(m!=0)
{
printf("%d ", HT[m].weight);
outputHuffman(HT,HT[m].LChild);
outputHuffman(HT,HT[m].RChild);
}
}

void CrtHuffmanCode(HuffmanTree *ht, HuffmanCode *hc, int n)
/*从叶子结点到根,逆向求每个叶子结点对应的哈夫曼编码*/
{
char *cd;
int i;
unsigned int c;
int start;
int p;
hc=(HuffmanCode *)malloc((n+1)*sizeof(char *)); /*分配n个编码的头指针*/
cd=(char * )malloc(n * sizeof(char )); /*分配求当前编码的工作空间*/
cd[n-1]='\0'; /*从右向左逐位存放编码,首先存放编码结束符*/
for(i=1;i<=n;i++) /*求n个叶子结点对应的哈夫曼编码*/
{
start=n-1; /*初始化编码起始指针*/
for(c=i,p=(*ht)[i].parent; p!=0; c=p,p=(*ht)[p].parent) /*从叶子到根结点求编码*/
if( (*ht)[p].LChild == c)
cd[--start]='0'; /*左分支标0*/
else
cd[--start]='1'; /*右分支标1*/
hc[i]=(char *)malloc((n-start)*sizeof(char)); /*为第i个编码分配空间*/
strcpy(hc[i],&cd[start]);
}
free(cd);
for(i=1;i<=n;i++)
printf("%d编码为%s\n",(*ht)[i].weight,hc[i]);
}

void main()
{
HuffmanTree HT;
HuffmanCode HC;
int *w;
int i,n; // the number of elements;
int wei; // the weight of a element;
int m;

printf("input the total number of the Huffman Tree:" );
scanf("%d",&n);
w=(int *)malloc((n+1)*sizeof(int));
for(i=1;i<=n;i++)
{
printf("input the %d element's weight:",i);
fflush(stdin);
scanf("%d",&wei);
w[i]=wei;
}

CrtHuffmanTree(&HT,w,n);
m = 2*n-1;
outputHuffman(HT,m);
printf("\n");
CrtHuffmanCode(&HT,&HC,n);

}

热心网友 时间:2023-10-20 22:01

有什么问题?追问在执行完1.要初始化赫夫曼链表请输入'1',并输入数据后
在输入2执行编码时遇到错误,该内存不能为read

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
找专业防水队做完还漏水怎么维权 法院会受理房屋漏水造成的纠纷吗? 巴西龟最长活多久,家养!!! 养胃的药最好的是什么啊 婴儿积食发烧不愿吃药怎么办 板门穴位在哪个部位 手机设置放偷看的方法? 凝结水回收器生产厂家? 个人账户养老金预测公式:现有5万元,缴费20年,能领多少钱? 临沂比较有名的男装品牌 c++数据结构哈夫曼编码问题 qq背景墙图片带(我非良人)4个字的,求图, 一道关于求哈夫曼编码的数据结构题,求解答 数据结构哈夫曼编码问题,请高手帮忙 哈夫曼树及哈夫曼编码的C程序实现(数据结构题) 算法与数据结构哈夫曼编码及应用 数据结构,第二题,哈夫曼编码, 过程详细说明一下,谢谢 一个关于数据结构的问题,有关哈夫曼编码的,解答看不懂,求解答,谢谢! 数据结构之哈夫曼编码 求解,关于数据结构的哈夫曼编码的问题 利用 数据结构 实现 哈夫曼编码/译码实现 数据结构中的哈夫曼编码 哈夫曼编码的原理是什么? 氢气球到底是氢气还是氮气 氢气球一般能挺多久 氢气球是什么做得? 世界上第一个也是最原始的氢气球是谁制作的? 氢气球有毒吗? 氢气球的是如何被研制出来的? 氢气球原理 QQ个性背景墙的图片。要多点类似这样的。反正只要好看就可以。推荐多点哦。 数据结构哈夫曼编码流程图 哈夫曼编/译码器 数据结构实践题 C语言,数据结构,哈夫曼编/译码器 用这个做QQ背景墙,能反映出他是个怎样的人,求解 vivo手机通话录音保存在哪里可以找到 vivo手机怎么找电话录音? 用vivo手机打电话时一边打一边录音,但是找不到录音的音频文件? 电话的通话录音,录完后到那里去找出来重放啊? 美元指数上涨现货黄金就会下降,为什么黄金和美元指数一直呈现负相关的关系呢? vivo Xm手机通话录音在哪里存放? 美元指数和黄金T+D有怎样的关系,比如,美元指数98.2对应黄金多少元每克 美元指数与外汇黄金什么关系 美元指数对现货黄金和白银有什么影响 如何理解美元指数与黄金的负相关的关系 美元指数和黄金的走势是成什么关系的,什么情况下会同涨或者同跌? 美元指数和黄金价格的关系 我把银行卡绑在抖音极速版为何零钱提不到银行卡里? 银行入驻抖音有哪些好处? 如何矫正错误的拿筷子方式