哈夫曼编码的译码和解码全代码

哈夫曼编码的译码解码全代码

录入内容的部分并不完整,仅供参考,但是可以运行,需要自行根据需要补充完整

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<string>
#include<fstream>
using namespace std;


typedef struct Hufman {
	int parent=0;
	char data;
	double weight=0.0;
	int lchild=0;
	int rchild=0;
}*HufmanTree;
typedef struct HufmanCode {
	char* ch;
	char data;
}HufmanCode,*hufmancode;
void addData(hufmancode hc, HufmanTree hf,int n);
void save(const hufmancode hf,int n);

void Select(HufmanTree& HT,int x, int& s1, int& s2)
{
	//寻找第一个双亲域为0且权值最小的结点
	int min=0;
	for (int i = 1; i <= x; i++)	//找到第一个双亲域为0的,下标暂存到min
	{
		if (HT[i].parent == 0)
		{
			min = i;
			break;
		}
	}

	for (int i = 1; i <= x; i++)
	{
		if (HT[i].parent == 0)
		{
			if (HT[i].weight < HT[min].weight)
			{
				min = i;
			}
		}
	}
	s1 = min;

	//寻找第二个双亲域为0且权值最小的结点
	for (int i = 1; i <= x; i++)	//找到第一个双亲域为0的,下标暂存到min
	{
		if (HT[i].parent == 0 && i != s1)
		{
			min = i;
			break;
		}
	}

	for (int i = 1; i <= x; i++)
	{
		if (HT[i].parent == 0 && i != s1)
		{
			if (HT[i].weight < HT[min].weight)
			{
				min = i;
			}
		}
	}
	s2 = min;
}

void addData(hufmancode hc, HufmanTree hf,int n) {       //将哈夫曼树中的数据保存到哈夫曼编码的结构体当中
	for (int i = 1; i <= n; i++) {
		hc[i].data = hf[i].data;
	}
}
void save(const hufmancode hf,int n) {          //保存获得的每个字母对应的哈夫曼编码
	ofstream ofs;
	ofs.open("哈夫曼编码值.txt", ios::out);
	for (int i = 1; i <= n; i++) {
		ofs << hf[i].data << " " << hf[i].ch << endl;
	}
	ofs.close();
}
void putPassage() {            //输入想要转换为哈夫曼编码的内容
	ofstream ofs;
	ofs.open("英文电报.txt", ios::out);
	cout << "请输入电报内容(连续不带有空格): " << endl;
	string str;
	cin >> str;
	ofs << str;
	ofs.close();
	return;
}
int num;
void getWeight() {                //获取每个字母的权值
	int countA = 0;
	int countB=0;
	int countC=0;
	int countD=0;
	double aw = 0.0;
	double bw = 0.0;
	double cw = 0.0;
	double dw = 0.0;
	ifstream ifs;
	ifs.open("英文电报.txt", ios::in);
	string str;
	ifs >> str;
	for (int i = 0; i < str.length(); i++) {
		if (str[i] == 'A') {
			++countA;
			++num;
		}
		if (str[i] == 'B') {
			++countB;
			++num;
		}
		if (str[i] == 'C') {
			++countC;
			++num;
		}
		if (str[i] == 'D') {
			++countD;
			++num;
		}
	}
	ifs.close();
	aw = (double)countA / num;
	bw = (double)countB / num;
	cw = (double)countC / num;
	dw = (double)countD / num;
	ofstream ofs;
	ofs.open("结点及其权值的存储.txt", ios::out);
	ofs << "A" << " "<<aw << endl;
	ofs << "B" << " "<<bw << endl;
	ofs << "C" << " "<<cw << endl;
	ofs << "D" << " "<<dw << endl;
	ofs.close();
}
void createHufmanTree(HufmanTree& hf,int n) {       //构建哈夫曼树

	int value1 = 0;
	int value2 = 0;
	if (hf == nullptr)
		return;
	int m = 2 * n - 1;
	hf = new Hufman[m + 1];
	ifstream ifs;
	ifs.open("结点及其权值的存储.txt", ios::in);
	for (int i = 1; i <= n; i++) {

		ifs>> hf[i].data >> hf[i].weight;
	}

	for (int j = (n + 1); j <= m; j++) {
		Select(hf, j - 1, value1, value2);

		hf[j].lchild = value1;
		hf[j].rchild = value2;
		hf[value1].parent = j;
		hf[value2].parent = j;
		hf[j].weight = hf[value1].weight + hf[value2].weight;
	}

}
void CreateHufmanCode(HufmanTree ht, hufmancode& hc,int n) {    //创建哈夫曼编码
	hc = new HufmanCode[n + 1];
	char* cd = new char[n];
	cd[n - 1] = '\0';
	for (int i = 1; i <= n; i++) {
		int start = n - 1;
		int c = i;
		int f = ht[i].parent;
		while (f != 0) {
			--start;
			if (ht[f].lchild == c)
				cd[start] = '0';
			if (ht[f].rchild == c)
				cd[start] = '1';
			c = f;
			f = ht[f].parent;
		}
		hc[i].ch = new char[n - start];
		strcpy(hc[i].ch, &cd[start]);


	}
	addData(hc, ht,n);
	save(hc,n);
	delete[] cd;

}
typedef struct Node {
	char data;
	string code;
}Node;

void changetohufman() {              //存储电报转换后的哈夫曼编码值
	ifstream ifs;
	ifs.open("英文电报.txt", ios::in);
	string str;
	ifs >> str;
	ifs.close();
	ifs.open("哈夫曼编码值.txt", ios::in);
	Node* n = new Node[4];
	for (int i = 0; i < 4; i++) {
		ifs >> n[i].data >> n[i].code;
	}
	ofstream ofs;
	ofs.open("获得的哈夫曼编码.txt", ios::out);
	
	for (int i = 0; i < str.length(); i++) {
		bool flag = true;
		for (int j = 0; j < 4&&flag; j++) {
			if (str[i] == n[j].data) {
				ofs << n[j].code;
				flag = false;
			}

		}
	}
	
	ofs.close();
	delete[] n;
	
}
void showCode() {            //展示转换结果
	ifstream ifs;
	ifs.open("获得的哈夫曼编码.txt", ios::in);
	string str;
	ifs >> str;
	cout << str;
}
void changetoChar() {
	ifstream ifs;
	ifs.open("获得的哈夫曼编码.txt", ios::in);
	string str;
	ifs >> str;
	ifs.close();
	ifs.open("哈夫曼编码值.txt", ios::in);
	Node* n = new Node[4];
	for (int i = 0; i < 4; i++) {
		ifs >> n[i].data >> n[i].code;
	}
	
	
	ifs.close();
	string temp = "";
	string last="";
	for (int i = 0; i < str.size(); i++) {
		temp = temp + str[i];
		for (int j = 0; j < 4; j++) {
			if (n[j].code == temp) {
				last += n[j].data;
				temp = "";
				break;
			}
			else if (i == str.length() - 1 && j == 3 && temp != "") {
				cout << "解码错误" << endl;
			}
		}
	}
	ofstream ofs;
	ofs.open("哈夫曼码转换为电报内容.txt", ios::out);
	ofs << last;
	ofs.close();
	return;
	delete[] n;
}
int main() {
	putPassage();
	getWeight();
	HufmanTree ht;
	hufmancode hc;

	cout << "请输入叶子结点的数目(4) :" << endl;
	int n;
	cin >> n;
	createHufmanTree(ht, n);
	CreateHufmanCode(ht, hc, n);
	changetohufman();
	changetoChar();
	showCode();
	
	return 0;
}
哈夫曼编码译码 包括默认编码 和 自定义编码 数据结构课程设计 一、题目: 哈夫曼编码/译码的设计与实现 二、目的与要求 1、目的: 通过布置具有一定难度的实际程序设计项目,使学生进一步理解和掌握课堂上所学各种基本抽象数据类型的逻辑结构、存储结构和操作实现算法,以及它们在程序中的使用方法;使学生掌握分析问题,求解问题的方法并提高学生设计编程实现的能力。 2、要求: 基本要求: 1. 要求利用C\C++语言来完成系统的设计; 2. 突出C语言的函数特征(以多个函数实现每一个子功能)或者C++语言面向对象的编程思想; 3. 画出功能模块图; 4. 进行简单界面设计,能够实现友好的交互; 5. 具有清晰的程序流程图和数据结构的详细定义; 6. 熟练掌握C语言或者C++语言的各种操作。 创新要求: 在基本要求达到后,可进行创新设计,如系统用户功能控制,改进算法的实现,实现友好的人机交互等等 三、问题描述和求解方法: 首先根据给定的n个权值构造哈夫曼树。通过遍历此二叉树完成哈夫曼编码。 四、解题过程 1. 分析程序的功能要求,划分程序功能模块。 2. 画出系统流程图。 3. 代码的编写。定义数据结构和各个功能子函数。 4. 程序的功能调试。 5. 完成系统总结报告以及使用说明书 五、进度安排 此次课程设计时间为一周,分以下几个阶段完成: 1. 选题与搜集资料:每人选择一题,进行课程设计课题的资料搜集。 2. 分析与概要设计:根据搜集的资料,进行程序功能与数据结构分析,并选择合适的数据结构、并在此基础上进行实现程序功能的算法设计。 3. 程序设计:运用掌握C/C++语言编写程序,实现各个模块功能。 4. 调试与测试:调试程序,并记录测试情况。 5. 完成课程设计报告。 6. 验收与评分:指导教师对每个同学的开发的系统进行综合验收,并由学院考核小组进行随机抽查评分。 六、撰写课程设计报告或课程设计总结 课程设计报告要求: 课程设计报告要求规范书写,应当包括如下6个部分: 1. 问题描述 2. 基本要求 3. 系统分析与设计 4. 测试数据及结果 5. 总结 6. 附录:源程序清单 七、答辩与评分标准: 1 、作业文档: 50 分; 2 、基本功能和要求: 20 分; 2 、设计报告及使用说明书: 10 分; 3 、设置错误或者按照要求改变结果: 10 分; 4 、回答问题: 10 分。 八、参考资料 《数据结构(C语言版)》 网上相关资料(....略) printf("---------------------------------------------\n"); printf(" 哈夫曼编码译码 \n"); printf(" 1.使用默认初始化 \n"); printf(" 2.使用自定义初始化 \n"); printf(" 3.进行哈夫曼编码 \n"); printf(" 4.进行哈夫曼译码 \n") ; printf(" 5.退出哈夫曼操作 \n"); printf(" 请输入1.2.3.4.5 \n"); printf(" ---------------------------------------------\n");
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值