首页 > 代码库 > 哈弗曼编码译码系统

哈弗曼编码译码系统

/**********************************************************************                                        *
学校:黄淮学院                                                         *
院系:信息工程学院                                                     *
年级专业:网络工程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);
}

哈弗曼编码译码系统