哈弗曼编码译码系统

/**********************************************************************                                        *

学校:黄淮学院                                                         *

院系:信息工程学院                                                     *

年级专业:网络工程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);

}

时间: 2024-11-08 19:24:45

哈弗曼编码译码系统的相关文章

哈夫曼编码译码系统(c/c++)

哈夫曼编码译码系统的实现,主要包含三部分: 1.创建哈夫曼树 2.编码函数 3.译码函数 编写代码时为了方便,在这里混用了c++的输入输出流.主体用c语言实现. 下面时代码部分: 1.头文件,以及储存结构: #include<stdio.h> #include<iostream> using namespace std; #define MAX 2000 typedef char ElemType; typedef struct{ ElemType data; int w; int

数据结构实验2(设计哈弗曼编码和译码系统)

设计一个哈弗曼编码和译码系统, 要求如下: B--建树:读入字符集和各字符频度,建立哈夫曼树. T--遍历:先序和中序遍历二叉树. E--生成编码:根据已建成的哈夫曼树,产生各个字符的哈夫曼编码. C--编码:输入由字符集中字符组成的任意字符串,利用已生成的哈夫曼编码进行编码,显示编码结果,并将输入的字符串及其编码结果分别保存在磁盘文件textfile.txt和codefile.txt中. D--译码:读入codefile.txt,利用已建成的哈夫曼树进行译码,并将译码结果存入磁盘文件resul

哈弗曼编码和译码.cpp

<span style="color:#6600cc;">#include<stdio.h> #include<string.h> #include<stdlib.h> typedef struct{ char a;//记录对应字符 int weight;//权值 int parent,lchild,rchild; }HTNode,*HuffmanTree; typedef char * *HuffmanCode;//动态分配数组存储哈夫

哈弗曼编码及译码

路径长度:从树的一个结点到另一个结点之间边的条数. 树的路径长度:从树根到每个叶子结点之间路径长度之和. 带权树的路径长度:每个叶子结点带有权值,树根到叶子结点的路径长度乘以该叶子结点的权值之和. 哈弗曼树:带权树的路径长度最小的树,又称作最小二叉树和最优二叉树. 哈夫曼树的构造过程: 1.      根据给定的n个带权的结点,构成含有n棵二叉树(每个结点是一棵树)的集合,该树的左右子树均为空. 2.      从含有n棵子树集合中找出两棵权值最小的树最为左右子树构成一个新的二叉树. 3.   

用哈弗曼编码实现文件压缩和解压

放假了把这个改一下,发现确实用单字节压缩的压缩率要高一些,暂时没去管为什么,不过放假静下心来写的话确实效率高很多. 新版详见:http://blog.csdn.net/tookkke/article/details/50575103 今天脑洞大开突然想写一下,明明都要考试了,唉,怎么就管不住这手啊  总之呢,就是根据每种编码的出现频率把等长的编码换成变长的,据说理论上压缩比率是比较高的,可是为什么经检验我这个大部分时候压缩出来的比源文件还大呢? 哈弗曼编码的时候要先做一颗字典树,查找的时候就按照

uva 10954 Add All(哈弗曼编码)

这道题我一开始想错了,这么简单的题都wa了两发...我往贪心上面想了,每次都找一个最小的数相加,结果就是 排序后直接往后加,还在那纳闷为何出错...其实这道题是哈弗曼编码问题,简直是模板题目,就是每次找两个最 小的结点求和后把他们的和放到节点中去,把这两个点删除...用的multiset,其实和set容器差不多,就是可 以存放重复的元素... 代码: #include<iostream> #include<cstdio> #include<cstdlib> #inclu

java实现哈弗曼编码

根据输入的各个叶节点的权值,构建一棵最优树,根据最小带全路径,确定由0,1组成的哈弗曼编码. 首先在一个封装类TNode中构建一棵树的元素,比如权值,左节点,右节点,同时在TNode类中构建了哈弗曼编码值,以及判断节点是否为叶子节点 package 霍夫曼编码; /** * * @author luckid * @version 2014_10_11 * */ /** * 定义Huffman编码的节点 */ public class TNode { /** * * @param weight *

利用哈弗曼编码进行压缩

// sZipDemo.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include "HuffmanTree.cpp" #include "sZip.h" #include <fstream> #include <iostream> using namespace std; int _tmain(int argc, _TCHAR* argv[]) { char str1[100

哈弗曼编码解码

#lang scheme ( define nil '() ) ( define ( make-leaf symbol weight ) ( list 'leaf symbol weight ) ) ( define ( leaf? obj ) ( eq? ( car obj ) 'leaf ) ) ( define ( symbol-leaf x ) ( cadr x ) ) ( define ( weight-leaf x ) ( caddr x ) ) ( define ( make-co