数据结构——哈夫曼树编程,输入权值实现流程图代码

news2024/11/17 11:57:39

一、须知

       本代码是在数据结构——哈夫曼树编程上建立的,使用时需将代码剪切到C++等软件中。需要输入权值方可实现流程图,但是还需要按照编程换算出的结果自己用笔画出流程图。
       下面将代码粘贴到文章中,同时举一个例子:
二、代码段

#include "stdio.h"
#define MAXLEN 100
typedef struct                       //定义本机构体
{
	int weight;                      //定义一个整形权值的变量
	int lchild,rchild,parent;        //分别定义左孩子、右孩子及双亲指针
}HTNode;
typedef HTNode HT[MAXLEN];           //表明向量的类型
int n;                               //定义整形变量n
//-----------------初始化子函数---------------------------------------------
void InitHFMT (HT T)
{ 
	int i;
	printf("\n请输入权值的总数(需小于100):");
	scanf("%d",&n);
	for(i=0;i<2*n-1;i++)
	{
		T[i].weight=0;
		T[i].lchild=-1;
		T[i].rchild=-1;
		T[i].parent=-1;
	}
}
//-----------------输入权值子函数-------------------------------------------- 
void InputWeight (HT T)
{
	int w,i;
	for(i=0;i<n;i++){
		printf("请输入第%d个权值:",i+1);
	    scanf("%d",&w);getchar();
	    T[i].weight=w;
	    }
}
//-----------------选择两个结点中小的结点------------------------------------ 
void SelectMin (HT T,int i,int *pl,int *p2)
{
	long minl=888888,min2=888888;    //设两个长整型数值,并使它大于可能会出现的最大权值
	int j;
	for(j=0;j<=i;j++){
		if(T[j].parent==-1)
		{if(minl>T[j].weight)
		{   minl=T[j].weight;        //找出最小权值
			*pl=j;                   //通过*p1带回序号
		}
	}
}
   for (j=0;j<=i;j++)
       {  if(T[j].parent==-1)
         { if (min2>T[j].weight&&j!=(*pl))
            { min2=T[j].weight;      //找出第二最小权值
           	*p2=j;                   //通过*p2带回序号
       }
       }
     }
}
//-----------------构造哈夫曼树,T[2*n-1]为根节点-----------------------------
 void CreatHFMT (HT T)
 {
  int i,pl,p2;
  InitHFMT (T);
  InputWeight(T);
  for(i=n;i<2*n-1;i++)
  {  SelectMin(T,i-1,&pl,&p2);
      T[pl].parent=T[p2].parent=i;
      T[i].lchild=T[pl].weight;
      T[i].rchild=T[p2].weight;
      T[i].weight=T[pl].weight+T[p2].weight;
  }
 }
//-----------------输出向量状态表----------------------------------------------  
void printHFMT (HT T)
{ 
 int i;
 printf("\n哈夫曼树的两边显示为(建议由下往上看/画):\n");
 for(i=0;i<2*n-1;i++)
 while(T[i].lchild!=-1)
 {printf("(两边和为%d,左边值为%d,右边值为%d)\n",T[i].weight,T[i].lchild,T[i].rchild);
  break;
 }
}
//-----------------哈夫曼编码函数----------------------------------------------
void hfnode(HT T,int i,int j)
{
 j=T[i].parent;
 if (T[j].rchild==T[i].weight)
    printf("1");
 else
    printf("0");
 if(T[j].parent!=-1)
 i=j,hfnode (T,i,j);
}
//-----------------求哈夫曼树编码----------------------------------------------  
void huffmannode(HT T)
{
	int i,j,a;
	printf("\n输入的权值的对应哈夫曼树编码(下面的哈夫曼编码树是由下往上排序的!!!):");
	for (i=0;i<n;i++)
    {
    	j=0;
    	a=i;
    	printf("\n%i的编码为:",T[i].weight);
    	hfnode(T,i,j);
    	i=a;
    }
}
//-----------------主函数-------------------------------------------------------
void main()
{   HT HT;
	CreatHFMT(HT);
	printHFMT(HT);
	huffmannode(HT);
	printf("\n  ");
}
 
 


三、举例(流程图)

1.首先输入:权值总数以及各个权值,编程便可实现;
 

 2.按照代码画流程图,以上面图片的权值举例,在编程结果出来后:首先看两面的数值,

先看最后一行的和为37,那么流程图的总数(最高点)便变为37
其次37的下面左边值为17,右边值为20
在看上一行,和为20,那么对照代码下一行两边的值可知,右边值为20
所以在右边值下的左边值和右边值分别为10
依次往上,就不都举例了······

本编程的哈夫曼树编码有问题,其所给的数值与实际答案是相反的列入9的变为为10,那么他真正的编码为01。就是1为0,0为1.

 四、结语

       本编程是能快速实现哈夫曼树的编码结果,有基础的同学看一下流程就知道是什么回事了,基础差的需要慢慢理解,本文章就不详细再讲了,同时这个代码有些错误,用能力者可以修改调试,实现更加完美的程序!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/339485.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ChatGPT留给知乎、小红书的时间不多了

大家好啊&#xff0c;今天我打算给大家整点好活&#xff01;挑战一下用ChatGPT打入各平台内部。 知乎挑战&#xff01; 首先了解一下“知乎体” 知乎体是以专业知识为基础&#xff0c;以清晰的条理对问题进行阐述&#xff0c;并解决该问题的文体格式。对于不能明确给出答案的…

【Linux 信号】信号的产生方式、信号的捕捉的全过程

信号的处理方式是远远比信号的产生当闹钟响了就知道时间到了&#xff0c;说明对应信号处理方法比信号产生更早操作系统的信号处理方法在编写操作系统的时候就已经编写好了signal函数1.1所有的信号1.2 signal函数的概念和简单使用捕捉信号就是自定义对应的信号的处理方法9号信号…

【ArcGIS Pro二次开发】(1):开发环境配置

要想进行ArcGIS Pro的二次开发&#xff0c;需要安装【Visual Studio】、【ArcGIS Pro】软件和【ArcGIS Pro SDK】组件。在版本选择上&#xff0c;我选了最新的ArcGIS Pro3.0&#xff0c;对应的VS版本为Visual Studio 2022。 一、Visual Studio2022的安装 1、前往官网https://v…

【STM32】【HAL库】遥控关灯0 概述

相关连接 【STM32】【HAL库】遥控关灯0 概述 【STM32】【HAL库】遥控关灯1主机 【STM32】【HAL库】遥控关灯2 分机 【STM32】【HAL库】遥控关灯3 遥控器 需求 家里有几个房间,开关距离床都挺远的 睡觉想要关灯的时候需要下床 因此设计了本次项目 需要满足以下要求: 可以控…

【C1】数据类型,常量变量,输入输出,运算符,if/switch/循环,/数组,指针,/结构体,文件操作,/编译预处理,gdb,makefile,线程

文章目录1.数据类型&#xff1a;单双引号&#xff0c;char&#xff08;1B&#xff09;&#xff0c;int/float&#xff08;32位系统&#xff0c;大小一样4B&#xff0c;但存储方式不同&#xff09;&#xff0c;double&#xff08;8B&#xff09;&#xff0c;long double&#xf…

补充一些前端面试题

javascript有哪些库指路>js中的库uniapp和vue有什么区别什么是uniappuni-app&#xff08;uni&#xff0c;读you ni&#xff0c;是统一的意思&#xff09;是一个使用Vue.js开发所有前端应用的框架&#xff0c;开发者编写一套代码&#xff0c;可发布到iOS、Android、Web&#…

天工开物 #5 我的 Linux 开发机

首先说一下结论&#xff1a;最终我选择了基于 Arch Linux[1] 的 Garuda Linux[2] 发行版作为基础来搭建自己的 Linux 开发机。Neofetch 时刻发行版的选择在上周末的这次折腾里&#xff0c;我一共尝试了 Garuda Linux 发行版&#xff0c;原教旨的 Arch Linux 发行版&#xff0c;…

R语言读取Excel表格数据并绘制多系列柱状图、条形图

本文介绍基于R语言中的readxl包与ggplot2包&#xff0c;读取Excel表格文件数据&#xff0c;并绘制具有多个系列的柱状图、条形图的方法。 首先&#xff0c;我们配置一下所需用到的R语言readxl包与ggplot2包&#xff1b;其中&#xff0c;readxl包是用来读取Excel表格文件数据的&…

android---WebView实例

现在很多 App 里都内置了 Web 网页&#xff0c;比如电商平台淘宝、京东等。那么这种该如何实现呢&#xff1f;其实这是 Android 里一个叫 WebView 的组件实现的。下面将介绍 WebView 的实例。下面的实例是以组件化为基础搭建的。 新建项目 WebView&#xff0c;然后对整个项目做…

网络安全攻防中,Rock-ON自动化的多功能网络侦查工具,Burpsuite被动扫描流量转发

网络安全攻防中&#xff0c;Rock-ON自动化的多功能网络侦查工具&#xff0c;Burpsuite被动扫描流量转发。 #################### 免责声明&#xff1a;工具本身并无好坏&#xff0c;希望大家以遵守《网络安全法》相关法律为前提来使用该工具&#xff0c;支持研究学习&#xff…

linux003之远程操作

Xshell简介&#xff1a; Xshell 是一个强大的安全终端模拟软件&#xff0c;它支持SSH1, SSH2, 以及Microsoft Windows 平台的TELNET 协议。Xshell 通过互联网到远程主机&#xff0c;可以操控到linux服务器。  Xshell可以在Windows界面下用来访问远端不同系统下的服务器&#…

一些常见错误

500状态码: 代表服务器业务代码出错, 也就是执行controller里面的某个方法的过程中报错, 此时在IDEA的控制台中会显示具体的错误信息, 所以需要去看IDEA控制台的报错404状态码: 找不到资源找不到静态资源 检查请求地址是否拼写错误 检查静态资源的位置是否正确 如果以上都没有问…

Docker中安装Oracle-12c

前言 MySQL和Oracle是开发中常用到的两个关系型数据库管理系统&#xff0c;接上一期内容&#xff0c;这一期在Docker中完成oracle-12c的安装和配置。 安装oracle-12c 1、拉取oracle-12c镜像 启动Docker Desktop后在cmd窗口中执行docker search oracle命令&#xff0c;搜索O…

LeetCode-1138. 字母板上的路径【哈希表,字符串】

LeetCode-1138. 字母板上的路径【哈希表&#xff0c;字符串】题目描述&#xff1a;解题思路一&#xff1a;首先考虑坐标位置&#xff0c;字符是有序的从0开始&#xff0c;当前字符c的行为(c-a)/5,列为(c-a)%5。其次是考虑特殊情况z。若当前从‘z’开始则只能往上走;若是其他字符…

Spring MVC 之返回数据(静态页面、非静态页面、JSON对象、请求转发与请求重定向)

文章目录1. 默认情况下返回静态页面2. 返回一个非静态页面的数据2.1 ResponseBody 返回页面内容2.2 RestController ResponseBody Controller3. 实现登录功能&#xff0c;返回 JSON 对象3.1 前端使⽤ ajax&#xff0c;后端返回 json 给前端3.2 前端发送 JSON 的标准格式4. 请…

ChatGPT 怎么用最新详细教程一看就会

ChatGPT 以其强大的信息整合和对话能力惊艳了全球&#xff0c;在自然语言处理上面表现出了惊人的能力。这么强大的工具我们都想体验一下&#xff0c;那么 ChatGPT 怎么用呢&#xff1f;本文将给你逐步详细介绍。 使用 ChatGPT 主要有4步&#xff1a; 注册 ChatGPT 账号通过短…

Maven_第五章 核心概念

目录第五章 其他核心概念1、生命周期①作用②三个生命周期③特点2、插件和目标①插件②目标3、仓库第五章 其他核心概念 1、生命周期 ①作用 为了让构建过程自动化完成&#xff0c;Maven 设定了三个生命周期&#xff0c;生命周期中的每一个环节对应构建过程中的一个操作。 …

智慧办公管理系统

随着大数据、物联网和新一代通讯技术的发展&#xff0c;智慧地球、智慧城市、智慧办公正在逐步变成现实。 智慧办公管理系统主要分为会议室管理、考勤管理以及系统设置三部分功能。 架构图&#xff1a; 功能介绍 一、会议室管理 &#xff08;1&#xff09;、会议室信息 会议室…

如何将 Windows 11/10 许可证转移到另一台 PC

如果您最近购买了新的台式机或笔记本电脑&#xff0c;您可能希望在上面安装 Windows 11。对于某些用户来说&#xff0c;为新计算机购买新的 Windows 11 许可证可能会有点贵。 但是&#xff0c;如果您在旧计算机上安装了 Windows 11 并购买了一台新计算机来替换它&#xff0c;您…

JavaSE-线程池(1)- 线程池概念

JavaSE-线程池&#xff08;1&#xff09;- 线程池概念 前提 使用多线程可以并发处理任务&#xff0c;提高程序执行效率。但同时创建和销毁线程会消耗操作系统资源&#xff0c;虽然java 使用线程的方式有多种&#xff0c;但是在实际使用过程中并不建议使用 new Thread 的方式手…