- 1、本文档共8页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
自适应哈弗曼编码c实现zzia
///用数组array存放自适应哈弗曼树
///通过各元素的下标指针构建哈弗曼树
#includeiostream
#includestring
using namespace std;
struct node
{
char elem; //字符元素
int weight; //字符的权重
int flag; //标记,判断是否是字符节点,编码使用
int rparent; //字符是否为父节点的右孩子判别标志,是的话该值为1 否则为0 编码用
int parent; //父结点的序号
int lchild; //节点的左孩子下标
int rchild; //节点的右孩子下标
};
node array[200];
int n=2;
string str;
int count=0;
int exchange(int m, int k) //两节点交换函数,对应下标分别为m,k
{
// cout交换结点开始endl;
int p = array[m].rparent;
int q = array[k].rparent;
int a = array[m].parent;
if(q p)//都是右结点
{
array[array[m].parent].rchild = k;
array[m].parent = array[k].parent;
array[array[k].parent].rchild = m;
array[k].parent = a;
// cout交换节点完毕endl;
return 0;
}
else if(!q !p)//都是左结点
{
array[array[m].parent].lchild = k;
array[m].parent = array[k].parent;
array[array[k].parent].lchild = m;
array[k].parent = a;
// cout交换节点完毕endl;
return 0;
}
else if(!q p)
{
array[array[m].parent].rchild = k;
array[m].parent = array[k].parent;
array[array[k].parent].lchild = m;
array[k].parent = a;
array[m].rparent = 0;
array[k].rparent = 1;
// cout交换节点完毕endl;
return 0;
}
else if(q !p)
{
array[array[m].parent].lchild = k;
array[m].parent = array[k].parent;
array[array[k].parent].rchild = m;
array[k].parent = a;
array[m].rparent = 1;
array[k].rparent = 0;
// cout交换节点完毕endl;
return 0;
}
else
{
return -1;
}
}
void coding() //对生成的哈弗曼树编码
{
// cout开始编码endl;
for(int i=0; icount; i++) //输出当前录入的字符串
coutstr.at(i);
coutendl;
int* code=new int[20];
int k,l;
for(i=1;i=n;i++)
{
if(array[i].flag==0)
{continue; } //该节点不是叶子节点,对下一节点编码
k=i;
l=0;
while(array[k].parent != -1)
{
code[l]=array[k].rparent;
k=array[k].parent;
l++;
}
cout.setf(ios::left);
cout.width(3);
coutarray[i].weight; //输出该节点字符的权重
if(array[i].weight==0)
coutnew:;
else
cout array[i].elem:;
for(l=l-1;l=0;l--) //输出字符编码
coutcode[l];
coutendl;
您可能关注的文档
最近下载
- 江苏开放大学行政伦理学综合大作业.doc
- 政治选择性必修2一民事权利与义务.docx
- 启迪幼儿园防汛安全演练方案.doc VIP
- 学校安全工作台账(最完整版).doc VIP
- 第11课 整理信息资源 教案 义务教育人教版信息科技三年级全一册.pdf
- 4.3.2等比数列的前n项和公式(教案)-高中数学人教A版(2019)选择性必修第二册.docx
- 八上必读名著《昆虫记》《红星照耀中国》复习资料.doc VIP
- CQC1143-2019电力储能系统用电池连接电缆认证技术规范.pdf VIP
- 铁路机车车辆驾驶人员(J6类)考前通关必练题及答案.doc VIP
- 幼儿园小班科学活动《小动物找尾巴》课件.pptx
文档评论(0)