⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 haff.cpp

📁 利用哈夫曼编码进行信息通信可以大大提高信道利用率
💻 CPP
字号:
#include<iostream.h>
#include<stdlib.h>

const int MaxValue = 10000;					//初始设定的权值最大值
const int MaxBit = 24;						//初始设定的最大编码位数
const int MaxN = 24;						//初始设定的最大结点个数

#include "HaffmanTree.h"
void main()
{
	int n=0,s=0;
	int i,j,k;
	char a[80];                //保存从键盘输入的不超过80个的字符
	char a1[26];               //a1存放共从键盘输入几种字母
	int weight[26];             //weight存放与a1中相应位置字母的个数
	
	int codelist[MaxValue];  //存放a数组的哈夫曼编码
    int y=0;                 //存放总编码位数
	
	cout<<"请输入长度不超过80的字符串,输入'#'号结束,再按回车"<<endl;
	
	for(  i=0;i<80;i++)      //输入不超过80个字符,输入'#'结束,再按回车
	{ char ch;
	   ch=cin.get();
	  if(ch=='#') break;
	  /* if(ch<'A'||ch>'Z'||ch==' ')
	  {cout<<"请输入大写字母且无空格,请重新输入:"<<endl;
	    i=-1; s=0;continue;
	  }
	  */
	  else 
	  { a[i]=ch;s++;}                   //将输入的字母保存在a数组中
	}
	for(  j=0;j<s;j++)                 // 找出a中共有几种不同的字符,存入a1数组
	{                                  //  并将其权值存入对应的weight 数组中
		for(  k=0;k<n;k++)
		{  
			if(a1[k]==a[j])
			{ weight[k]++;break;}
		}
		if(k==n)
		{a1[n]=a[j];weight[n]=1;n++;}
	}

 	HaffNode *myHaffTree = new HaffNode[2*n-1];     // 存放哈夫曼树
	Code *myHaffCode = new Code[n];                 //存放n个叶结点的哈夫曼编码
	if(n > MaxN)
	{
		cout << "定义的n越界,修改MaxN! " << endl;
		exit(0);
	}
	Haffman(a1,weight, n, myHaffTree);
	HaffmanCode(a1,myHaffTree, n, myHaffCode);

	//输出每个叶结点的哈夫曼编码
	for(i = 0; i < n; i++)
	{
		cout <<"letter = "<< myHaffCode[i].letter << "  Weight = " << myHaffCode[i].weight << "   Code = ";
		for(j = myHaffCode[i].start+1; j < n; j++)
			cout << myHaffCode[i].bit[j];
		cout << endl;
	}
 
	encoding(codelist ,a ,s,myHaffCode ,n,y);      //将输入的明文编码
	cout<<endl<<endl;
	decoding(codelist,y,myHaffTree,n);         //将编好的哈夫曼码译码
     cout<<endl;
}
 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -