我是靠谱客的博主 优美香水,最近开发中收集的这篇文章主要介绍课程设计之霍夫曼编码,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

#include<iostream>
#include<stack>
#include<fstream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
using namespace std;
class Huffman
{
private:
typedef struct huffmannode
{
int weight;
int parent;
int lchild;
int rchild;
char data;
huffmannode();
}HTNode,*HuffmanTree;
typedef char **HuffmanCode;
HuffmanTree HT;
HuffmanCode HC;
int n;
public:
Huffman();
void print();
void initialization();
void encoding();
void decoding();
void CreatTree();
void recursion(int f,string s,int cot);
void DFS(huffmannode T,int x,int y);
};
int main()
{
Huffman HT;
while(1)
{
cout<<"_____________________"<<endl;
cout<<"哈夫曼编码、译码系统"<<endl;
cout<<"1:初始化"<<endl;
cout<<"2:编码"<<endl;
cout<<"3:译码"<<endl;
cout<<"4:打印"<<endl;
cout<<"5:退出"<<endl;
cout<<"请输入你的选择t";
int argument;
cin>>argument;
switch(argument)
{
case 1:
HT.initialization();
break;
case 2:
HT.encoding();
break;
case 3:
HT.decoding();
break;
case 4:
HT.print();
break;
default:
exit(0);
}
}
return 0;
}
Huffman::huffmannode::huffmannode()
{
lchild=rchild=parent=-1;
}
Huffman::Huffman()
{
}
void Huffman::CreatTree()
{
ofstream ofile("hfmTree.txt");
if(ofile.is_open())
{
int i,j,k;
HC=(HuffmanCode)malloc(n*sizeof(char*));
char* cd=(char *)malloc(n*sizeof(char));
cd[n-1]='';
int start;
int c,f;
for(i=0;i<n;i++)
{
start=n-1;
for(c=i,f=HT[i].parent;f!=-1;c=f,f=HT[f].parent)
if(HT[f].lchild==c)
cd[--start]='0';
else
cd[--start]='1';
HC[i]=(char*)malloc((n-start)*sizeof(char));
strcpy(HC[i],&cd[start]);
ofile<<HT[i].data<<"t"<<HC[i]<<endl;
}
free(cd);
}
else
{
cerr<<"file open error"<<endl;
return;
}
cout<<"每个字符对应的编码已经生成,你可以到对应的 hfmTree.txt 文件中查看"<<endl;
ofile.close();
}
void Huffman::initialization()
{
cout<<"请输入字符集的大小 n:t";
cin>>n;
HT=new HTNode [2*n-1];
int i,j,k;
int weight;
char ch;
getchar();
cout<<"请输入字符及它的权值(中间用一个空格隔开)"<<endl;
for(i=0;i<n;i++)
{
printf("请输入第%d个字符和它的权值:t",i+1);
scanf("%c %d",&HT[i].data,&HT[i].weight);
getchar();
}
int min1,min2;
int rnode,lnode;
for(i=n;i<2*n-1;i++)
{
min1=min2=10000;
rnode=lnode=-1;
for(j=0;j<i;j++)
{
if(HT[j].parent==-1)
{
if(HT[j].weight<min1)
{
min2=min1;
rnode=lnode;
min1=HT[j].weight;
lnode=j;
}
else if(HT[j].weight<min2)
{
min2=HT[j].weight;
rnode=j;
}
}
}
HT[lnode].parent=HT[rnode].parent=i;
HT[i].lchild=lnode;
HT[i].rchild=rnode;
HT[i].weight=HT[lnode].weight+HT[rnode].weight;
}
CreatTree();
}
void Huffman::encoding()
{
int choice;
int i,j,k;
cout<<"1.从终端输入 2.从文件中读取(注:文件路径以默认指定为 ToBeTran.txt)"<<endl;
cout<<"请选择:t";
cin>>choice;
string s;
getline(cin,s);
if(choice==1)
{
cin>>s;
}
else
{
ifstream ifile("ToBeTran.txt");
if(ifile.is_open())
{
getline(ifile,s);
ifile.close();
}
else
cerr<<"file does not exist"<<endl;
}
ofstream ofile("CodeFile.txt");
for(i=0;i<s.size();i++)
{
for(j=0;j<n;j++)
{
if(s[i]==HT[j].data)
ofile<<HC[j];
}
}
ofile.close();
cout<<"编码已经写到 CodeFile.txt 中,你可以到文件中查看,也可以回到终端点击查看"<<endl;
}
void Huffman::decoding()
{
cout<<"将 CodeFile.txt 中的代码译码到 Textfile.txt 你可以到目录中查看 "<<endl;
string s;
ifstream ifile("CodeFile.txt");
ofstream ofile("Textfile.txt");
getline(ifile,s);
int f=2*n-2;
int i=0;
while(i<s.size())
{
if(s[i]=='0')
{
f=HT[f].lchild;
}
else if(s[i]=='1')
{
f=HT[f].rchild;
}
if(HT[f].lchild==-1&&HT[f].rchild==-1)
{
ofile<<HT[f].data;
cout<<HT[f].data;
f=2*n-2;
}
i++;
}
}
char map[80][80];
int maxx=-1;
int maxy=-1;
void Huffman::DFS(Huffman::huffmannode T,int x,int y)
{
if(T.lchild==-1&&T.rchild==-1)
{
map[x][y]=T.data;
if(maxx<x)
maxx=x;
if(maxy<y)
maxy=y;
return ;
}
if(T.lchild!=-1)
{
map[x+1][y-1]='/';
map[x+2][y-2]='/';
DFS(HT[T.lchild],x+3,y-3);
}
if(T.rchild!=-1)
{
map[x+1][y+1]='\';
map[x+2][y+2]='\';
DFS(HT[T.rchild],x+3,y+3);
}
int i,j,k;
return ;
}
void Huffman::print()
{
cout<<"1:打印哈夫曼编码"<<endl;
cout<<"2:打印哈夫曼树"<<endl;
cout<<"3:打印译码"<<endl;
cout<<"请输入你的选择t";
int choice;
cin>>choice;
switch(choice)
{
case 1:
{
for(int i=0;i<n;i++)
{
cout<<HT[i].data<<" "<<HC[i]<<endl;
}
}
break;
case 2:
{
int i,j;
for(i=0;i<80;i++)
for(j=0;j<80;j++)
map[i][j]=' ';
DFS(HT[2*n-2],0,40);
ofstream ofile("huffmantree.txt");
cout<<maxx<<" "<<maxy<<endl;
for(int i=0;i<=maxx;i++)
map[i][maxy+1]='';
for(i=0;i<=maxx;i++)
ofile<<map[i]<<endl;
for(int i=0;i<=maxx;i++)
cout<<map[i]<<endl;
}
cout<<"你也可以到 huffmantree.txt 下查看 "<<endl;
break;
case 3:
{
ifstream ifile("Textfile.txt");
string s;
while(getline(ifile,s))
{
cout<<s<<endl;
}
}
break;
default:
break;
}
}

最后

以上就是优美香水为你收集整理的课程设计之霍夫曼编码的全部内容,希望文章能够帮你解决课程设计之霍夫曼编码所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(65)

评论列表共有 0 条评论

立即
投稿
返回
顶部