首页 > 代码库 > 哈弗曼编码译码系统
哈弗曼编码译码系统
/********************************************************************** *
学校:黄淮学院 *
院系:信息工程学院 *
年级专业:网络工程1301B *
用户名:xx *
登录密码:xx *
************************************************************************/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#pragma comment(lib, "winmm.lib")//多媒体播放头文件
#include<windows.h>
#include<time.h>
#define CLS system("cls")//系统清屏
#include<windows.h>
#include<time.h>
#define N 35
#define M 2*N-1
int w[N];//存放权值
char str[N];//存放对应字母
int m;
typedef struct
{
int weight;//定义哈弗曼结构
int parent;
int lchild;
int rchild;
char ch;
char s[25];
}HTNode,HafumanTree[M+1];
void Du(char s[]){//从文件中读入到字符串s中
FILE *fp;
char name[25];
int i=0;
printf("输入文件路径\n");
getchar();
gets(name);
if((fp=fopen(name,"r"))==NULL)
{
printf("打开失败!\n");
exit(0);
}
s[i++]=fgetc(fp);
while(s[i-1]!=EOF){
s[i++]=fgetc(fp);
}
s[i-1]=‘\0‘;
fclose(fp);
}
void Save(char *s){//保存编码
FILE *fp;
char name[25],x=strlen(s);
int i=0;
printf("输入保存的文件路径\n");
gets(name);
if((fp=fopen(name,"w"))==NULL)
{
printf("保存失败\n");
exit(0);
}
fputs(s,fp);
fclose(fp);
printf("保存完毕\n");
}
int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
PSTR szCmdLine,
int iCmdShow)
{
//播放音乐
DWORD dwret=mciSendString("open \"1.mp3\" alias aa",NULL,0,NULL);
if(dwret == 0){
mciSendString("play aa wait",NULL,0,NULL);
mciSendString("close aa",NULL,0,NULL);
}
else
{
MessageBox(0,
TEXT("播放文件不存在\n\n\n替换后再尝试\n\n程序自行退出!!")//提示窗口
,TEXT("Error Message"),0x21);
}
return 0;
}
void Weight(char s[],char str[]){//计算文章中每一个字符出现的次数,充当叶子节点,并当作权值,录入哈弗曼树中
int i,j,k=0,x=strlen(s);
for(i=0;i<N;i++)
w[i]=0;
for(i=0;i<x;i++)
{
for(j=0;j<k;j++)
if(str[j]==s[i])
{
w[j]++;
break;
}
if(j==k){
str[k]=s[i];
w[k++]++;
}
}
str[k]=‘\0‘;
m=k;
}
void select(HafumanTree ht,int n,int *p,int *q){//从叶子节点中挑选权值最小的两个节点分别赋给s1,s2;
int min1=32767,min2=32767;
for(int i=1;i<=n;i++)
if(ht[i].parent==0)
{
if(min1>ht[i].weight){
min1=ht[i].weight;
*p=i;
}
}
for(i=1;i<=n;i++)
if(ht[i].parent==0&&i!=*p)
{
if(min2>ht[i].weight&&i!=*p){
min2=ht[i].weight;
*q=i;
}
}
}
void CHafumanTree(HafumanTree ht,int n,char str[]){//构建哈弗曼树
int g,i,s1,s2;
g=2*n-1;
for(i=1;i<=n;i++){
ht[i].weight=w[i-1];//哈弗曼树初始化
ht[i].ch=str[i-1];
ht[i].parent=0;
ht[i].rchild=0;
ht[i].lchild=0;
}
for(i=n+1;i<=g;i++){
ht[i].weight=0;
ht[i].parent=0;
ht[i].rchild=0;
ht[i].lchild=0;
ht[i].ch=‘0‘;
}
for(i=n+1;i<=g;i++){
select(ht,i-1,&s1,&s2);
ht[i].weight=ht[s1].weight+ht[s2].weight;
ht[s1].parent=i;
ht[s2].parent=i;
ht[i].lchild=s1;
ht[i].rchild=s2;
}
}
void CHafumanCode(HafumanTree ht,int n)//已经建好哈弗曼树,进行编码,根据左0右1原则
{
int i,c,p,start;
char *cd;
cd=(char*)malloc(n*sizeof(char));
cd[n-1]=‘\0‘;
for(i=1;i<=n;i++)
{
ht[i].s[0]=‘\0‘;
start=n-1;
c=i;
p=ht[i].parent;
while(p!=0)
{--start;
if(ht[p].lchild==c)
cd[start]=‘0‘;
else
cd[start]=‘1‘;
c=p;
p=ht[p].parent;
}
strcpy(ht[i].s,&cd[start]);
}
free(cd);
}
char* TotalCoding(HafumanTree ht,int m,char s[]){//根据文章,编码,读取每一个字符,字符-编码一一对应,连接起来,便是文章的编码
int i,j,x=strlen(s);
char Code[300005],*p;
Code[0]=‘\0‘;
for(i=0;i<x;i++)
for(j=1;j<=m;j++)
if(s[i]==ht[j].ch)
strcat(Code,ht[j].s);
printf("编码完毕:%s\n",Code);
p=Code;
return p;
}
void DeCoding(HafumanTree ht,int m,char s[]){//读取编码,并根据哈弗曼树解码
int p,i,x=strlen(s);
p=2*m-1;
for(i=0;i<x;i++){
if(s[i]==‘0‘)
p=ht[p].lchild;
else
p=ht[p].rchild;
if(ht[p].lchild==0&&ht[p].rchild==0){
printf("%c",ht[p].ch);
p=2*m-1;
}
}
}
//欢迎界面
void welcome()
{
char s[10]="color 0",str;
int n = 20;
srand((unsigned int) time(NULL));
printf("\n\n\n\n\n");
printf(" * *\n");
printf(" * ******** *\n");
printf(" * **************** *\n");
printf(" * ******************* *\n");
printf(" * * * *************************** * * *\n");
printf(" * * * ** # ** # # ** * * *\n");
printf(" * * *** * #### ##### ** ## # ### * *** * *\n");
printf(" * * * ** # # # # # ** # # # # ** * * *\n");
printf(" * ***** # # # ** ## ### ### ** *** *\n");
printf(" * ** # # # # ** # # # ** *\n");
printf(" * ** # # # ** ########### ** *\n");
printf(" * ** ** ** *\n");
printf(" * ********************************* *\n");
printf(" * ****************************************** *\n");
printf(" * ********哈弗曼编码译码******** *\n");
printf(" * *********************************** *\n");
printf(" * *****系统***** *\n");
printf(" * ******* *\n");
while(n--)
{
Sleep(100);
int num=rand()%9+1;
str=num+‘0‘;
s[7]=str;
s[8] = ‘\0‘;
system(s);
}
system("color 03");
}
void out()
{
char s[10]="color 0",str;
int n = 20;
srand((unsigned int) time(NULL));
printf("\n\n\n\n\n");
printf(" *\n");
printf(" * ******** *\n");
printf(" * **************** *\n");
printf(" * ******************* *\n");
printf(" * THANGKS FOR USING *\n");
printf(" * ********************************* *\n");
printf(" * ****************************************** *\n");
printf(" * ********哈弗曼编码译码******** *\n");
printf(" * ************************************ *\n");
printf(" * *****系统***** *\n");
printf(" * ******* *\n");
while(n--)
{
Sleep(100);
int num=rand()%9+1;
str=num+‘0‘;
s[7]=str;
s[8] = ‘\0‘;
system(s);
}
system("color 07");
}
//改变字体颜色
void set_color()
{
int num;
srand((unsigned int)time(NULL));
char cmd[10] = "color 0" , ch;
num=(int)rand()%10;
ch=num+‘0‘;
cmd[7]=ch;
cmd[8] = ‘\0‘;
system(cmd);
}
//功能选择
void slect(){
int choice=5;
CLS;
HafumanTree ht;
char s[300005];
char g[300005];
char *p;
while(choice!=0){
printf(" ※ ※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※\n");
printf(" ※ [1], 读入文字进行编码 \n");
printf(" ※ ※\n");
printf(" ※ [2],基于当前编码系统,输入文字,进行编码 ※\n");
printf(" ※ ※\n");
printf(" ※ [3],读取编码文件,解码 ※\n");
printf(" ※ [4],换个颜色 ※\n");
printf(" [0],退出 \n");
printf(" ******************************************************************************\n");
scanf("%d",&choice);
switch(choice){
case 1: Du(s);Weight(s,str);CHafumanTree(ht,m,str);CHafumanCode(ht,m);p=TotalCoding(ht,m,s);Save(p);break;
case 2:printf("输入文字\n");getchar();gets(g);p=TotalCoding(ht,m,g);Save(p);break;
case 3:Du(s);DeCoding(ht,m,s);break;
case 4:set_color();break;
case 0:CLS;out();break;
}
system("pause");
CLS;
}
}
void Login(){//系统登录
bool flag=false;
char name[25];
char password[10];
printf("***************************************************************************\n");
printf("**** **************************************** ****\n");
printf("**** *************** 系统登录 ************** **\n");
printf("**** ***************************************** ****\n");
printf("**** **********请输入用户名及密码************* ****\n");
printf("**** ***************************************** ***\n");
printf("***************************************************************************\n");
for(int i=0;i<3;i++){
scanf("%s%s",name,password);
if(strcmp(name,"梁磊")==0&&strcmp(password,"940122")==0){
flag=true;
break;
}
else
printf("亲,输入错误呢,再好好想一想\n");
}
if(flag)
printf("*************************************登陆成功*********************************\n");
else{
printf("对不起,您已经错误3次,系统退出\n");
printf("退出\n");
system("pause");
exit(0);
}
}
void main(){
system("Title 都市桃源");
Login();
WinMain(NULL,0,0,0);
welcome();
slect();
WinMain(NULL,0,0,0);
}
学校:黄淮学院 *
院系:信息工程学院 *
年级专业:网络工程1301B *
用户名:xx *
登录密码:xx *
************************************************************************/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#pragma comment(lib, "winmm.lib")//多媒体播放头文件
#include<windows.h>
#include<time.h>
#define CLS system("cls")//系统清屏
#include<windows.h>
#include<time.h>
#define N 35
#define M 2*N-1
int w[N];//存放权值
char str[N];//存放对应字母
int m;
typedef struct
{
int weight;//定义哈弗曼结构
int parent;
int lchild;
int rchild;
char ch;
char s[25];
}HTNode,HafumanTree[M+1];
void Du(char s[]){//从文件中读入到字符串s中
FILE *fp;
char name[25];
int i=0;
printf("输入文件路径\n");
getchar();
gets(name);
if((fp=fopen(name,"r"))==NULL)
{
printf("打开失败!\n");
exit(0);
}
s[i++]=fgetc(fp);
while(s[i-1]!=EOF){
s[i++]=fgetc(fp);
}
s[i-1]=‘\0‘;
fclose(fp);
}
void Save(char *s){//保存编码
FILE *fp;
char name[25],x=strlen(s);
int i=0;
printf("输入保存的文件路径\n");
gets(name);
if((fp=fopen(name,"w"))==NULL)
{
printf("保存失败\n");
exit(0);
}
fputs(s,fp);
fclose(fp);
printf("保存完毕\n");
}
int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
PSTR szCmdLine,
int iCmdShow)
{
//播放音乐
DWORD dwret=mciSendString("open \"1.mp3\" alias aa",NULL,0,NULL);
if(dwret == 0){
mciSendString("play aa wait",NULL,0,NULL);
mciSendString("close aa",NULL,0,NULL);
}
else
{
MessageBox(0,
TEXT("播放文件不存在\n\n\n替换后再尝试\n\n程序自行退出!!")//提示窗口
,TEXT("Error Message"),0x21);
}
return 0;
}
void Weight(char s[],char str[]){//计算文章中每一个字符出现的次数,充当叶子节点,并当作权值,录入哈弗曼树中
int i,j,k=0,x=strlen(s);
for(i=0;i<N;i++)
w[i]=0;
for(i=0;i<x;i++)
{
for(j=0;j<k;j++)
if(str[j]==s[i])
{
w[j]++;
break;
}
if(j==k){
str[k]=s[i];
w[k++]++;
}
}
str[k]=‘\0‘;
m=k;
}
void select(HafumanTree ht,int n,int *p,int *q){//从叶子节点中挑选权值最小的两个节点分别赋给s1,s2;
int min1=32767,min2=32767;
for(int i=1;i<=n;i++)
if(ht[i].parent==0)
{
if(min1>ht[i].weight){
min1=ht[i].weight;
*p=i;
}
}
for(i=1;i<=n;i++)
if(ht[i].parent==0&&i!=*p)
{
if(min2>ht[i].weight&&i!=*p){
min2=ht[i].weight;
*q=i;
}
}
}
void CHafumanTree(HafumanTree ht,int n,char str[]){//构建哈弗曼树
int g,i,s1,s2;
g=2*n-1;
for(i=1;i<=n;i++){
ht[i].weight=w[i-1];//哈弗曼树初始化
ht[i].ch=str[i-1];
ht[i].parent=0;
ht[i].rchild=0;
ht[i].lchild=0;
}
for(i=n+1;i<=g;i++){
ht[i].weight=0;
ht[i].parent=0;
ht[i].rchild=0;
ht[i].lchild=0;
ht[i].ch=‘0‘;
}
for(i=n+1;i<=g;i++){
select(ht,i-1,&s1,&s2);
ht[i].weight=ht[s1].weight+ht[s2].weight;
ht[s1].parent=i;
ht[s2].parent=i;
ht[i].lchild=s1;
ht[i].rchild=s2;
}
}
void CHafumanCode(HafumanTree ht,int n)//已经建好哈弗曼树,进行编码,根据左0右1原则
{
int i,c,p,start;
char *cd;
cd=(char*)malloc(n*sizeof(char));
cd[n-1]=‘\0‘;
for(i=1;i<=n;i++)
{
ht[i].s[0]=‘\0‘;
start=n-1;
c=i;
p=ht[i].parent;
while(p!=0)
{--start;
if(ht[p].lchild==c)
cd[start]=‘0‘;
else
cd[start]=‘1‘;
c=p;
p=ht[p].parent;
}
strcpy(ht[i].s,&cd[start]);
}
free(cd);
}
char* TotalCoding(HafumanTree ht,int m,char s[]){//根据文章,编码,读取每一个字符,字符-编码一一对应,连接起来,便是文章的编码
int i,j,x=strlen(s);
char Code[300005],*p;
Code[0]=‘\0‘;
for(i=0;i<x;i++)
for(j=1;j<=m;j++)
if(s[i]==ht[j].ch)
strcat(Code,ht[j].s);
printf("编码完毕:%s\n",Code);
p=Code;
return p;
}
void DeCoding(HafumanTree ht,int m,char s[]){//读取编码,并根据哈弗曼树解码
int p,i,x=strlen(s);
p=2*m-1;
for(i=0;i<x;i++){
if(s[i]==‘0‘)
p=ht[p].lchild;
else
p=ht[p].rchild;
if(ht[p].lchild==0&&ht[p].rchild==0){
printf("%c",ht[p].ch);
p=2*m-1;
}
}
}
//欢迎界面
void welcome()
{
char s[10]="color 0",str;
int n = 20;
srand((unsigned int) time(NULL));
printf("\n\n\n\n\n");
printf(" * *\n");
printf(" * ******** *\n");
printf(" * **************** *\n");
printf(" * ******************* *\n");
printf(" * * * *************************** * * *\n");
printf(" * * * ** # ** # # ** * * *\n");
printf(" * * *** * #### ##### ** ## # ### * *** * *\n");
printf(" * * * ** # # # # # ** # # # # ** * * *\n");
printf(" * ***** # # # ** ## ### ### ** *** *\n");
printf(" * ** # # # # ** # # # ** *\n");
printf(" * ** # # # ** ########### ** *\n");
printf(" * ** ** ** *\n");
printf(" * ********************************* *\n");
printf(" * ****************************************** *\n");
printf(" * ********哈弗曼编码译码******** *\n");
printf(" * *********************************** *\n");
printf(" * *****系统***** *\n");
printf(" * ******* *\n");
while(n--)
{
Sleep(100);
int num=rand()%9+1;
str=num+‘0‘;
s[7]=str;
s[8] = ‘\0‘;
system(s);
}
system("color 03");
}
void out()
{
char s[10]="color 0",str;
int n = 20;
srand((unsigned int) time(NULL));
printf("\n\n\n\n\n");
printf(" *\n");
printf(" * ******** *\n");
printf(" * **************** *\n");
printf(" * ******************* *\n");
printf(" * THANGKS FOR USING *\n");
printf(" * ********************************* *\n");
printf(" * ****************************************** *\n");
printf(" * ********哈弗曼编码译码******** *\n");
printf(" * ************************************ *\n");
printf(" * *****系统***** *\n");
printf(" * ******* *\n");
while(n--)
{
Sleep(100);
int num=rand()%9+1;
str=num+‘0‘;
s[7]=str;
s[8] = ‘\0‘;
system(s);
}
system("color 07");
}
//改变字体颜色
void set_color()
{
int num;
srand((unsigned int)time(NULL));
char cmd[10] = "color 0" , ch;
num=(int)rand()%10;
ch=num+‘0‘;
cmd[7]=ch;
cmd[8] = ‘\0‘;
system(cmd);
}
//功能选择
void slect(){
int choice=5;
CLS;
HafumanTree ht;
char s[300005];
char g[300005];
char *p;
while(choice!=0){
printf(" ※ ※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※\n");
printf(" ※ [1], 读入文字进行编码 \n");
printf(" ※ ※\n");
printf(" ※ [2],基于当前编码系统,输入文字,进行编码 ※\n");
printf(" ※ ※\n");
printf(" ※ [3],读取编码文件,解码 ※\n");
printf(" ※ [4],换个颜色 ※\n");
printf(" [0],退出 \n");
printf(" ******************************************************************************\n");
scanf("%d",&choice);
switch(choice){
case 1: Du(s);Weight(s,str);CHafumanTree(ht,m,str);CHafumanCode(ht,m);p=TotalCoding(ht,m,s);Save(p);break;
case 2:printf("输入文字\n");getchar();gets(g);p=TotalCoding(ht,m,g);Save(p);break;
case 3:Du(s);DeCoding(ht,m,s);break;
case 4:set_color();break;
case 0:CLS;out();break;
}
system("pause");
CLS;
}
}
void Login(){//系统登录
bool flag=false;
char name[25];
char password[10];
printf("***************************************************************************\n");
printf("**** **************************************** ****\n");
printf("**** *************** 系统登录 ************** **\n");
printf("**** ***************************************** ****\n");
printf("**** **********请输入用户名及密码************* ****\n");
printf("**** ***************************************** ***\n");
printf("***************************************************************************\n");
for(int i=0;i<3;i++){
scanf("%s%s",name,password);
if(strcmp(name,"梁磊")==0&&strcmp(password,"940122")==0){
flag=true;
break;
}
else
printf("亲,输入错误呢,再好好想一想\n");
}
if(flag)
printf("*************************************登陆成功*********************************\n");
else{
printf("对不起,您已经错误3次,系统退出\n");
printf("退出\n");
system("pause");
exit(0);
}
}
void main(){
system("Title 都市桃源");
Login();
WinMain(NULL,0,0,0);
welcome();
slect();
WinMain(NULL,0,0,0);
}
哈弗曼编码译码系统
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。