IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 【数据结构C语言版本】细说HuffmanTree附完整代码与调试过程分享||你是一棵成熟的Huffman树了,要自己快快长大,不要再让周树皮花一晚上加一个白天用printf调试出来 -> 正文阅读

[数据结构与算法]【数据结构C语言版本】细说HuffmanTree附完整代码与调试过程分享||你是一棵成熟的Huffman树了,要自己快快长大,不要再让周树皮花一晚上加一个白天用printf调试出来

写在前面

现在时间是2021年11月25日下午2:24,在花费一晚上加两节自习加中午没睡觉,Joe树皮终于实现了她的HuffmanTree,中间N次调试发现错误的时候都让我很是怀疑,我是周树皮,不是周木头,错得我离谱,改得我吐血。
无语,快上课了,文章先开个头,后续会更新HuffmanTree的实现原理,顺便分享一下我的心酸调试过程。
发现我已经语无伦次了,管他管他我说的就是病句
555555想睡觉觉!!!!!!!!

1.术前准备

2.上机实操

2.1写个Bug

2.2De个Bug

3.附录

3.1完整代码

#include<stdio.h>
#include<malloc.h>
 
#define MAXSIZE 50
#define MaxValue 1000

//Huffman结点结构

typedef struct Node{
	
	int weight;//权重
	int parent;//父结点
	int lchild;//左孩子
	int rchild;//右孩子
		
}HuffNode; 

// Huffman树数组结构

typedef struct Tarry{
	
	HuffNode Tree[MAXSIZE];			//用于存储结点的数组 
	int index;					  	//用于数组下标 
	
}HuffTree;

//Huffman树的初始化 

//定义从数组第二个元素开始存储 即数组下标为1开始 
void HuffmanTreeInit(HuffTree **HFTree,int TotalNode)
{
	(*HFTree)=(HuffTree*)malloc((TotalNode+1)*sizeof(HuffNode));//分配存储空间 
	(*HFTree)->index=-1;								//初始化下标 
} 
 
 
void CreatHuffmanTree(HuffTree **HFTree,int NodeNum,int TotalNode)
{	
	HuffNode *PNode=(HuffNode*)malloc(sizeof(HuffNode));		//用于指向当前操作结点

	//初始化赋值 

	printf("请依次输入%d个结点的权值:\n",NodeNum);
	for((*HFTree)->index=1;	(*HFTree)->index<=TotalNode;(*HFTree)->index++){
		PNode=&(*HFTree)->Tree[(*HFTree)->index];				//PNode指向当前操作数组单元 记得&!!!!! 
		
		//初始结点权重赋值 
		if((*HFTree)->index<=NodeNum){
			scanf("%d",&PNode->weight);
		}
		else{
			PNode->weight=0; 		
		}
		//左孩子、右孩子、父节点赋值
		PNode->parent=0;
		PNode->lchild=0;
		PNode->rchild=0;
	} 
	
	//挑选次小最小构建新结点	
	int min1,min2,x1,x2,flag=0;	//规定min1记录最小值
	int i; 					//	用于内层循环下标 

	//初始化min1 min2都为最大值 防止第一个权重最小导致最后两个结点一样都为第一个 
	//里层for循环结束需要重新赋值min啊救命!!!! 

	
	for((*HFTree)->index=1;	(*HFTree)->index<NodeNum;(*HFTree)->index++){
		min1=min2=MaxValue;		
		x1=x2=0;
		//新创建结点下标为NodeNum+当前index 
			for(i=1;i<NodeNum+(*HFTree)->index;i++){
		//(1)如果当前权重小于最小权重 则更新最小 原最小成为次小 
					//已使用的结点跳过 
				if((*HFTree)->Tree[i].parent==0&&(*HFTree)->Tree[i].weight<min1){
					//原最小成为次小 
					min2=min1;		
					x2=x1;
					//更新最小
					min1=(*HFTree)->Tree[i].weight;
					x1=i;
				}	
		//(2)当前权重大于最小小于次小 记录为次小 
				else
					if((*HFTree)->Tree[i].parent==0&&(*HFTree)->Tree[i].weight<min2){
						min2=(*HFTree)->Tree[i].weight;
						x2=i;	
				}
														//新结点左孩子 			
		}
		    flag=(*HFTree)->index+NodeNum;//当前创建结点下标				
		    //挑选结点的父结点记录 
	    	(*HFTree)->Tree[x1].parent=flag;
	    	(*HFTree)->Tree[x2].parent=flag;
	    
	    	//新结点创建 
		    (*HFTree)->Tree[flag].weight=(*HFTree)->Tree[x1].weight+(*HFTree)->Tree[x2].weight;//新结点权重 
	    	(*HFTree)->Tree[flag].lchild=x1;												//新结点左孩子 
	    	(*HFTree)->Tree[flag].rchild=x2;	
						
	} 	
	printf("\n"); 
} 

void PrintHuffmanTree(HuffTree *HFTree,int TotalNode)
{
	HuffNode *PNode=(HuffNode*)malloc(sizeof(HuffNode));		//用于指向当前操作结点
	//输出表头 
	printf("\t\tHuffman Graph\t\t\n"); 
	printf("index\t weight\t parent\t lchild\t rchlid\t\n ");
	printf("\n");
	for(HFTree->index=1;HFTree->index<=TotalNode;HFTree->index++){
		PNode=&(HFTree->Tree[HFTree->index]);					//PNode指向当前操作数组单元
		printf(" %d\t  %d\t  %d\t  %d\t  %d\t\n ",HFTree->index,PNode->weight,PNode->parent,PNode->lchild,PNode->rchild);
		printf("\n");
	}	
} 

int main() 
{

	HuffTree *HFTree;	//
	int NodeNum;			//用于记录初始创建结点个数 
	int TotalNode;			//用于记录创建后总结点个数 
	
	printf("请输入创建结点个数:\n");
	scanf("%d",&NodeNum);
	TotalNode=2*NodeNum-1;
		
	HuffmanTreeInit(&HFTree,TotalNode) ;
	CreatHuffmanTree(&HFTree,NodeNum,TotalNode); 
	PrintHuffmanTree(HFTree,TotalNode);
	
	return 0;
}

3.2测试结果

终于实现了!!!!
在这里插入图片描述

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-11-26 09:06:11  更:2021-11-26 09:06:31 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年1日历 -2025/1/9 16:18:38-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码