文档介绍:精品资料,欢迎大家下载!
以上资料仅供参考,如有侵权,留言删除!
数据结构课程设计
报告
题目:一哈夫曼编码/译码学院数学与信息科学学院学科门类na专业数学类学号2021433033姓名田娟
2021年12月30日一、需求分析nNode//哈夫曼树的一个结点(
intweight;
intparent;
intlchild,rchild;
charsourcecode;
std::stringcode;};classHuffmanTree//哈夫曼树(private:
HuffmanNode*Node;//Node[]存放哈夫曼树intLeafNum;:
HuffmanTree();
~HuffmanTree();
voidCreateHuffmanTree();
voidCreateHuffmanTreeFromKeyboard();
voidCreateHuffmanTreeFromFile();
voidEncoder();
voidDecoder();
voidPrintCodeFile();
voidPrintHuffmanTree();
voidPrintHuffmanTree_aoru(intT,intlayer=1);};//构造函数//函数功能:初始化哈夫曼树HuffmanTree::HuffmanTree(){
精品资料,欢迎大家下载!
以上资料仅供参考,如有侵权,留言删除!
Node=NULL;
LeafNum=0;}//函数功能:将哈夫曼的数组的空间释放〃参数返回值:无HuffmanTree::~HuffmanTree()(
delete[]Node;}//建立哈夫曼树函数//函数功能:建立哈夫曼树voidHuffmanTree::CreateHuffmanTree()(
charChoose;
cout<<"从键盘输入哈夫曼树(按2)?";
cin>>Choose;
if(Choose=='2'){
CreateHuffmanTreeFromKeyboard();
}//choose=='2'
else{〃
CreateHuffmanTreeFromFile();
}}//函数功能:从键盘建立哈夫曼树voidHuffmanTree::CreateHuffmanTreeFromKeyboard(){
intNum;cout<<"\n请输入源码字符集个数:
H.
精品资料,欢迎大家下载!
以上资料仅供参考,如有侵权,留言删除!
cin>>Num;
if(Num<=1)(
cout<<"无法建立少丁2个叶子结点的哈夫曼树.\n\n";
return;
}
LeafNum=Num;
Node=newHuffmanNode[2*Num-1];
for(inti=0;i<Num;i++){//读入哈夫曼树的叶子结点信息
cout<<"请输入第"<<i+1<<"个字符值";
getchar();
Node[i].sourcecode=getchar();//源文的字符存入字符数组Info[]
getchar();
cout<<"请输入该字符的权值";
cin>>Node[i].weight;//源文的字符权重存入Node[].weight
Node[i].parent=-1;
Node[i].lchild=-1;
Node[i].rchild=-1;
Node[i].code="\0";
}for(intj=Num;j<2*Num-1;j++){//循环建立哈夫曼树内部结点
intpos1,pos2;
intmax1,max2;
pos2=pos1=j;
max2=max1=numeric_limits<int>::max();
精品资料,欢迎大家下载!
以上资料仅供参考,如有侵权,留言删除!
〃在所有子树的根结点中,选权重最小的两个根结点,pos1最后应指向权重最小的根结点的下标for(intk=j-1;k>=0;k--){
if(Node[k].parent==-1){//如果是某棵子树的根结点
if(Node[k].weight<max1){//发现比当前最大值还大的权重max2=max1;max1=Node[k].weight;pos2=pos1;pos1=k;
}
elseif(Node[k].weight<max2){//发现比当前次大值还大的次大权重max2=Node[k].weight;pos2=k;}
}//if(Node[j].parent==-1)
}//for〃