哈夫曼编码引发异常,怎么解决呀(求助帖!!!)

Ghurnid_ 2024-11-07 21:47:58

 

 

#include<iostream>
using namespace std;
typedef struct{
	char data;
	double weight;
	int parent, lchild, rchild;
}HTNode,*HaffmanTree;
typedef char** Code;

void Compare(HaffmanTree HT, int& s1, int& s2, int n) {
	int i, t;
	double min=100000;
	for (i = 1; i <= n; i++)
		if (HT[i].parent == 0 && min > HT[i].weight) {
			min = HT[i].weight;
			s1 = i;
		}
	t = HT[s1].parent;
	HT[s1].parent = -1;
	min = 100000;
	for (i = 1; i <= n; i++)
		if (HT[i].parent == 0 && min > HT[i].weight) {
			min = HT[i].weight;
			s2 = i;
		}
	HT[s1].parent = t;
}

void CreateTree(HaffmanTree &HT,int n) {//构造哈夫曼树
	HT = new HTNode[2*n];
	int i,j,s1,s2;
	cout << "输入节点信息:";
	for (i = 1; i <= n; i++) 
		cin >> HT[i].data;
	cout << "依次输入权值:";
	for (i = 1; i <= n; i++) {
		cin >> HT[i].weight;
		HT[i].parent = 0;
		HT[i].lchild = 0;
		HT[i].rchild = 0;
	}
	for (i = n+1; i <= 2 * n + 1; i++) {
		Compare(HT, s1, s2, i-1);
		HT[i].lchild = s1;
		HT[i].rchild = s2;
		HT[i].weight = HT[s1].weight + HT[s2].weight;
		HT[s1].parent = i;
		HT[s2].parent = i;
	}
}

void CreateCode(HaffmanTree HT, int n,Code &code) {//编码
	int i, j;
	code = new char* [n + 1];
	for (i = 1; i <= n; i++) {
		j = 0;
		int p = HT[i].parent;
		int c = i;
		while (p != 0) {
			if (HT[p].lchild == c)
				code[i][j] = '0';
			else
				code[i][j] = '1';
			j++;
			c = p;
			p = HT[p].parent;
		}
		code[i][j] = '\0';
		for (int k = 0; k < j; k++) {
			int t = code[i][k];
			code[i][k] = code[i][j - k - 1];
			code[i][j - k - 1] = t;
		}
	}
}

int WPL(HaffmanTree HT,int n,char **code) {
	int i,j=0;
	int wpl = 0;
	for (i = 1; i <= n; i++) {
		while (code[i][j] != '\0')
			j++;
		wpl = wpl + HT[i].weight * (j + 1);
	}
	return wpl;
}

int main() {
	HaffmanTree HT;
	Code code;
	int n;
	cout << "输入结点个数:";
	cin >> n;
	CreateTree(HT, n);
	CreateCode(HT, n,code);
	for (int i = 1; i <= n; i++)
		cout << HT[i].data<<code[i]<<endl;
	int wpl = WPL(HT, n, code);
	cout << "wpl=" << wpl;
	return 0;
}

为什么哈夫曼编码时总是会引发异常,这个要怎么解决呀,求解!!! 

 

...全文
89 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

67,946

社区成员

发帖
与我相关
我的任务
社区描述
灌水发信息每周送书 灌水发干货每周送惊喜 谁最水过年送大礼 谁最硬核过年送大礼 谁最贡献过年送大礼
社区管理员
  • 1_bit
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

我们“新手村”社区就是大家的孵化器

你们学习,我来评分

每周最高分送一本书

每月第四周送一份机械键盘

咱们新手村使用一切狂暴手段让优秀的人得到奖励

 

试试用AI创作助手写篇文章吧