收藏 分销(赏)

数据结构赫夫曼树2.doc

上传人:pc****0 文档编号:7423882 上传时间:2025-01-03 格式:DOC 页数:4 大小:72.50KB 下载积分:10 金币
下载 相关 举报
数据结构赫夫曼树2.doc_第1页
第1页 / 共4页
数据结构赫夫曼树2.doc_第2页
第2页 / 共4页


点击查看更多>>
资源描述
一、 实验目的 1. 进一步掌握二叉树的存储结构和相应算法 2. 掌握霍夫曼树树的创建和霍夫曼编码 二、 实验环境 1. 硬件:每个学生需配备计算机一台。操作系统:DOS或Windows 2. 软件:DOS或Windows操作系统+TurboC; 三、 实验要求 1. 要求采用二叉链表作为存贮结构,完成霍夫曼树的创建 2. 输出对应数据的霍夫曼编码,并求出平均编码长度 四、 实验内容 1. 现在某电报公司假设有10字符进行编码,这10个字符的使用频率如下表所示,请创建霍夫曼树。 A B C D E F G H I J 19 18 16 14 12 8 6 4 2 1 2. 编写函数求出A~J的霍夫曼编码。 #include <stdio.h> #include <stdlib.h> #include <string.h> typedef char* HuffmanCode; typedef struct {char data; unsigned int weight ; unsigned int parent, LChild,RChild ; }HTNode, * HuffmanTree; //选出权值最小的两个// void select(HuffmanTree *ht,int n, int *s1, int *s2) {int i; int min1=0,min2=0; (*ht)[min1].weight=(*ht)[min2].weight=101; for(i=1;i<=n;i++) {if((*ht)[i].weight < (*ht)[min1].weight&&(*ht)[i].parent == 0) min1=i;} for(i=1;i<=n;i++) {if((*ht)[i].weight < (*ht)[min2].weight&&(*ht)[i].parent == 0&&min1!=i) min2=i;} *s1=min2;*s2=min1; } void CrtHuffmanTree(HuffmanTree *ht , int n) { /* w存放已知的n个权值,构造哈夫曼树ht */ int m,i,w; int s1,s2;char c; m=2*n-1; *ht=(HuffmanTree)malloc((m+1)*sizeof(HTNode)); /*0号单元未使用*/ printf("输入字符及权重:\n"); for(i=1;i<=n;i++) {/*1-n号放叶子结点,初始化*/ fflush(stdin); scanf("%c %d",&c,&w); (*ht)[i].data = c; (*ht)[i].weight = w; (*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; } /*非叶子结点初始化*/ /*创建非叶子结点,建哈夫曼树*/ 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) { outputHuffman(HT,HT[m].LChild); if(!HT[m].LChild&&!HT[m].RChild)printf("%c\t", HT[m].data); 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("%c编码为%s\n",(*ht)[i].data,hc[i]); } // 主函数// void main() { HuffmanTree HT; HuffmanCode HC; int n; int m; printf("输入叶子节点的个数:" ); scanf("%d",&n); CrtHuffmanTree(&HT,n); m = 2*n-1;printf("中序输出哈夫曼树叶子节点:\n"); outputHuffman(HT,m); printf("\n"); CrtHuffmanCode(&HT,&HC,n); } 五、实验结果
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 百科休闲 > 其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服