hafuman编码译码器

// huffman.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define maxStr 10000    
#define maxNode 100       
#define maxBite 200000
int node_num; 

typedef struct huffNode             
{
int weight;
struct huffNode *lchild,*rchild,*parent; 
struct huffNode *next;                    
}huffman_Node,*huffman_Tree;


typedef struct                  
{
char ch;                      
char bites[maxNode+1];               
int loc;                    
}bites_Node;
//获取输入字符串的字符权值
void frequency(char s[],char str[],int count[]) ;
//获取最小的两个结点
void getMinNode(huffman_Tree ht,int k,huffman_Tree *ht1,huffman_Tree *ht2);
//构造huffman树
void build_huffman_Tree(huffman_Tree *ht,int count[]);
//编码
void code(char s[],bites_Node bn[],char bites[]);
void docode(char s[],char str[],char bites[],int count[],huffman_Tree *ht,bites_Node bn[]);
//对每个结点编码
void code_Node(huffman_Tree ht,bites_Node bn[],char str[]);
//译码
void decode(char bites[],huffman_Tree ht,char str[],char s[]);
void show(char bites[],char str[],char ss[],huffman_Tree *ht,bites_Node bn[]);
//文件操作
void openFile(char s[]);
void saveFile(char s[]);
int main()
{
char c;
huffman_Tree ht;
char s[maxStr],ss[maxStr];        
char str[maxNode];             
int count[maxNode];          
char bites[maxStr];        
bites_Node bn[maxNode];       
do
{
printf("   1.输入待编码字符/n");
printf("   2译码/n");
printf("/n");
c=getchar();getchar();
switch(c)
{
case '1':docode(s,str,bites,count,&ht,bn);break;
case'2':show(bites,str,ss,&ht,bn);break;
}
}while(c!='0');
return 1;
}


void frequency(char s[],char str[],int count[])  
{
int i,j,k=0;
for(i=0;i<maxNode;i++)    
count[i]=0;
for(i=0;s[i];i++)
{
for(j=0;j<k;j++)          
if(str[j]==s[i])
{
count[j]++;
break;
}
if(j==k)                     
{
str[k]=s[i];
count[k++]++;
}
}
str[k]='/0';                 
node_num=k;                           
}

void getMinNode(huffman_Tree ht,int k,huffman_Tree *ht1,huffman_Tree *ht2)
{
int i,min;
huffman_Tree p;
min=maxBite;
for(i=0,p=ht;i<k;i++,p=p->next)
if(p->weight<min&&p->parent==0)
{
min=p->weight;
*ht1=p;
}
min=maxBite;
for(i=0,p=ht;i<k;i++,p=p->next)
if(p->weight<min&&p->parent==0&&p!=*ht1)  
{
min=p->weight;
*ht2=p;
}
}

void build_huffman_Tree(huffman_Tree *ht,int count[])
{
int i;
huffman_Tree p,ht1,ht2;   
p=*ht=(huffman_Tree)malloc(sizeof(huffman_Node));
p->next=p->lchild=p->rchild=p->parent=NULL; 
for(i=1;i<2*node_num-1;i++)
{
p->next=(huffman_Tree)malloc(sizeof(huffman_Node));
p=p->next;
p->next=p->lchild=p->rchild=p->parent=NULL;
}

for(i=0,p=*ht;i<node_num;i++)              
{                            
p->weight=count[i];
p=p->next;
}

for(i=node_num;i<2*node_num-1;i++)                 
{
getMinNode(*ht,i,&ht1,&ht2);  
ht1->parent=ht2->parent=p;    
p->lchild=ht1;
p->rchild=ht2;
p->weight=ht1->weight+ht2->weight;  
p=p->next;                           
}

}


void code_Node(huffman_Tree ht,bites_Node bn[],char str[])
{
int i;
huffman_Tree q,p=ht;
for(i=0;i<node_num;i++)            
{
bn[i].ch=str[i];
bn[i].bites[node_num-1]='/0';  
}
for(i=0;i<node_num;i++)
{
bn[i].loc=node_num-1;
for(q=p;q->parent;q=q->parent)   
if(q==q->parent->lchild)
bn[i].bites[--bn[i].loc]='0';
else bn[i].bites[--bn[i].loc]='1';
p=p->next;                  
}


}

void code(char s[],bites_Node bn[],char bites[])
{
int i,j;
bites[0]='/0';           
for(i=0;s[i];i++)              
for(j=0;j<node_num;j++)
if(s[i]==bn[j].ch)
strcpy(bites+strlen(bites),bn[j].bites+bn[j].loc);
}

void decode(char bites[],huffman_Tree ht,char str[],char s[])
{
int i,j,k=0;
huffman_Tree root,p,q;
for(root=ht;root->parent;root=root->parent); 
for(i=0,p=root;bites[i];i++)           
{                                      
if(bites[i]=='0')
p=p->lchild;
else p=p->rchild;
if(p->lchild==NULL&&p->rchild==NULL) 
{
for(j=0,q=ht;q!=p;q=q->next,j++);
s[k++]=str[j];
p=root;                
}
}
s[k]='/0';                
}

void docode(char s[],char str[],char bites[],int count[],huffman_Tree *ht,bites_Node bn[])
char c;
int a;
printf("请输入要编码的字符/n");
    c=getchar();
    for(a=0;c!='/n';a++)
    {
    s[a]=c;
    c=getchar();
    }
    s[a]='/0';
    saveFile(s);                  
frequency(s,str,count); 
build_huffman_Tree(ht,count); 
code_Node(*ht,bn,str);     
code(s,bn,bites); 
printf("/n哈夫曼编码:/n");
puts(bites);
saveFile(bites);   
getchar();
}
void show(char bites[],char str[],char ss[],huffman_Tree *ht,bites_Node bn[])
{
openFile(bites);                          
decode(bites,*ht,str,ss); 
printf("/n译码字符串为:/n");
puts(ss);
}


void openFile(char s[])              
{
char name[10];
FILE *fp;
int i=0;
if((fp=fopen("c:/huffman_Code.txt","rt"))==NULL)
{
printf("打开失败!/n");            
exit(1);
}
s[i++]=fgetc(fp);
while(s[i-1]!=EOF)
s[i++]=fgetc(fp);
s[i]='/0';                          
fclose(fp);
}


void saveFile(char s[])                        
{
char name[10];
FILE *fp;
if((fp=fopen("c:/huffman_Code.txt","wt"))==NULL)
{
printf("存储失败!");
exit(1);
}
fputs(s,fp);
fclose(fp);

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值