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

哈夫曼编码 c语言 求改正

发布网友 发布时间:2022-10-23 02:40

我来回答

2个回答

热心网友 时间:2024-10-30 12:36

#include<string.h>
#include<stdlib.h>
#include<stdio.h>
int m,s1,s2;
typedef struct {
unsigned int weight;
unsigned int parent,lchild,rchild;
}HTNode,*HuffmanTree; /* 动态分配数组存储哈夫曼树 */
typedef char *HuffmanCode; /* 动态分配数组存储哈夫曼编码表 */

void Select(HuffmanTree HT,int n)
{
int i,j;
for(i = 1;i <= n;i++)
if(!HT[i].parent)
{s1 = i;break;}
for(j = i+1;j <= n;j++)
if(!HT[j].parent)
{s2 = j;break;}
for(i = 1;i <= n;i++)
if((HT[s1].weight>HT[i].weight)&&(!HT[i].parent)&&(s2!=i))
s1=i;
for(j = 1;j <= n;j++)
if((HT[s2].weight>HT[j].weight)&&(!HT[j].parent)&&(s1!=j))
s2=j;
}

void HuffmanCoding(HuffmanTree HT, HuffmanCode HC[], int *w, int n)
{

/* w存放n个字符的权值(均>0),构造哈夫曼树HT,
并求出n个字符的哈夫曼编码HC */
int i, j;
char *cd;
int p;
int cdlen;
if (n<=1) return;
m = 2 * n - 1;
HT = (HuffmanTree)malloc((m+1) * sizeof(HTNode)); /* 0号单元未用 */
for (i=1; i<=n; i++) /* 初始化 */
{
HT[i].weight=w[i-1];
HT[i].parent=0;
HT[i].lchild=0;
HT[i].rchild=0;
}
for (i=n+1; i<=m; i++) /* 初始化 */
{
HT[i].weight=0;
HT[i].parent=0;
HT[i].lchild=0;
HT[i].rchild=0;
}
printf("\nHuffman tree construction process as follows:\n");
printf("HT List:\nNumber\t\tweight\t\tparent\t\tlchild\t\trchild\n");
for (i=1; i<=m; i++)
printf("%d\t\t%d\t\t%d\t\t%d\t\t%d\n",i,HT[i].weight,
HT[i].parent,HT[i].lchild, HT[i].rchild);
system("pause");

for (i=n+1; i<=m; i++) /* 建哈夫曼树 */
{
/* 在HT[1..i-1]中选择parent为0且weight最小的两个结点,
其序号分别为s1和s2。*/
Select(HT, i-1);
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;
printf("\nselect: s1=%d s2=%d\n", s1, s2);
printf("Number\t\tweight\t\tparent\t\tlchild\t\trchild\n");
for (j=1; j<=i; j++)
printf("%d\t\t%d\t\t%d\t\t%d\t\t%d\n",j,HT[j].weight,
HT[j].parent,HT[j].lchild, HT[j].rchild);
system("pause");

}
/* 无栈非递归遍历哈夫曼树,求哈夫曼编码 */
cd = (char *)malloc(n*sizeof(char)); /* 分配求编码的工作空间 */
p = m; cdlen = 0;
for (i=1; i<=m; ++i) /* 遍历哈夫曼树时用作结点状态标志 */
HT[i].weight = 0;
while (p)
{
if (HT[p].weight==0)
{ /* 向左 */
HT[p].weight = 1;
if (HT[p].lchild != 0)
{
p = HT[p].lchild;
cd[cdlen++] ='0';
}
else if (HT[p].rchild == 0)
{ /* 登记叶子结点的字符的编码 */
HC[p] = (char *)malloc((cdlen+1) * sizeof(char));
cd[cdlen] ='\0';
strcpy(HC[p], cd); /* 复制编码(串) */
}
}
else if (HT[p].weight==1)
{ /* 向右 */
HT[p].weight = 2;
if (HT[p].rchild != 0)
{
p = HT[p].rchild;
cd[cdlen++] ='1';
}
}
else
{ /* HT[p].weight==2,退回退到父结点,编码长度减1 */
HT[p].weight = 0;
p = HT[p].parent;
--cdlen;
}
}
} /* HuffmanCoding */

void main()
{
HuffmanTree HT;HuffmanCode *HC;
int *w,n,i;
long int a[100],p,q;
printf("Input the number of nodes:");
scanf("%d",&n);
HC=(HuffmanCode *)malloc(n*sizeof(HuffmanCode));
w=(int *)malloc(n*sizeof(int));

printf("Enter weight:\n");
for(i=0;i<n;i++)
{
printf("w[%d]=",i+1);
scanf("%d",&w[i]);
}
HuffmanCoding(HT,HC,w,n);
printf("\nEach node of the Huffman coding:\n");
printf("Number\t\tWeight\t\tCode\n");
for(i=1;i<=n;i++)
printf("%d\t\t%d\t\t%s\n",i,w[i-1],HC[i]);
system("pause");
}

热心网友 时间:2024-10-30 12:36

我这有C++的哈夫曼树,前一段时间的数据结构的作业。追问我也是数据结构的作业 但是是c语言

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
租临时演员在婚礼中的效果 eva破买觉醒版的还是普通版的 TAT EVA初号机模型 公司以员工绩效罚款违法吗 张衡怎么造句 地动仪怎么造句 一般情况下,企业对程序员素质要求中不包括( )。 做一个程序员应该具备哪些素质? 自己家里是什么意思? 你家里都是什么意思啊 ...并且进行编码权重如下w={5,29,7 8,14,13 ,3 ,11}写出c语言代码... 现在天气太热了,渴什么汤可以消暑? 糖尿病有啥办法治疗 红麦和白麦有啥区别 对外转帐是什么意思 网上银行的对外转账是啥意思?可以转给支付宝吗? 轻骑铃木骏驰QS125-5与GT125是不是同一款? 我的铃木风暴太子125,买了8800值吗 钱江125太子怎么样?价格大约在多少? 2000年的铃木风暴太子摩托车质量怎么样 二手力帆迅龙150风暴太子怎么样 钱江风暴太子QJ150-18F怎么样 全面的 谢谢 了 钱江的风暴太子150-18f怎么样?质量如何? 大家说说钱江风暴太子摩托车这款车怎么样,性能好不好,油耗高不高。_百... 魔兽旧世地下城副本都在什么地方 红旗怎么画霸气 卡西欧hdc700手表遇水透吗? 我有许多葡萄,但是我没有梨子.英文翻译成 我没有葡萄,但我有几个桃子.用英语怎么说 洗葡萄英文短语 华为手机怎么变成苹果手机? 非洲加蓬发现核反应堆,恐龙化石疑似中子弹,史前文明到底存在吗_百度知 ... 工商银行的网银 能够为其他银行的信用卡还款么? 紧急冻结还可以解冻嘛紧急冻结还可以解冻吗 苹果6s plus串号355756071045429激活时间 以前用的怎么才能找回来? 怎样谈恋爱才好 以前用的怎么才能找回来? 如何找回以前的? 我以前的突然不见了怎么找回来了? 驾龄不够三年怎样注册滴滴快车车主? 求我的世界黑母和僵尸的图片 如何找回以前的? 如何找回以前的? 如何找回以前的? 手机照片备份用什么办法备份最安全呢? 梦见妈妈去世没人告诉我 梦见亲人去世要不要告诉本人 梦见亲人死了寓意? 以前微信绑定银行卡,以前的不用了,请问怎么才能解除绑定? 关于全面推进依法治国若干重大问题的决定(3)