#includestdio.h
成都創(chuàng)新互聯(lián)公司專業(yè)為企業(yè)提供虎林網(wǎng)站建設(shè)、虎林做網(wǎng)站、虎林網(wǎng)站設(shè)計(jì)、虎林網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計(jì)與制作、虎林企業(yè)網(wǎng)站模板建站服務(wù),十年虎林做網(wǎng)站經(jīng)驗(yàn),不只是建網(wǎng)站,更提供有價(jià)值的思路和整體網(wǎng)絡(luò)服務(wù)。
#includestring.h
#includestdlib.h
#includectype.h
int n;
struct node{
int w;
int flag;
char c;
struct node *plink,*llink,*rlink;
char code[50];
}*num[100],*root;
FILE *fp;
char tmpcode[50];
int t=0;
void main(void)
{
int i;
void settree(void); //建立樹
void code(void); //對文件編碼
void decode(void); // 譯碼
void disp(void);
root=(struct node*)malloc(sizeof(struct node));
puts("*******************哈夫曼編/譯碼器演示******************************");
while(1){
start:
puts("1. 初始化 2. 編碼 3. 譯碼 4.顯示編碼表 5. 退出");
while(scanf("%d",i)!=1)
{
while(getchar()!='\n')
continue;
puts("輸入錯(cuò)誤!");
puts("請重新輸入!");
puts("1. 初始化 2. 編碼 3. 譯碼 4.顯示編碼表 5. 退出");
}
switch (i)
{
case 1:
settree();
break;
case 2:
code();
break;
case 3:
decode();
break;
case 4:
disp();
break;
case 5:
exit(0);
default:
puts("輸入錯(cuò)誤!");
puts("請重新輸入!");
goto start;
}
}
}
void settree(void)
{
int i,j,k;
struct node *p1,*p2,*tmp,*p;
void go(struct node *);
void setcode(struct node *);//建立每一個(gè)字符的編碼
void printtree(struct node *);
puts("輸入字符集的大?。?);
scanf("%d",n);
while(getchar()!='\n')
continue;
for(i=0;in;i++)
{
p=(struct node *)malloc(sizeof(struct node));
puts("請輸入一個(gè)字符");
scanf("%c",p-c);
while(getchar()!='\n')
continue;
puts("請輸入該字符的權(quán)值:");
scanf("%d",p-w);
while(getchar()!='\n')
continue;
p-plink=NULL;
p-rlink=NULL;
p-llink=NULL;
num[i]=p;
}
for(i=0;in-1;i++) //(遞增)排序
{
for(j=i+1;jn;j++)
{
if(num[i]-wnum[j]-w)
{
tmp=num[i];
num[i]=num[j];
num[j]=tmp;
}
}
}
/*******************************開始建立樹***********************/
num[n]=NULL; //結(jié)束標(biāo)志
k=n;
while(num[1]!=NULL)
{
p=(struct node *)malloc(sizeof(struct node));
p1=num[0];
p2=num[1];
p-llink=p1;
p-rlink=p2;
p-plink=NULL;
p1-plink=p;
p2-plink=p;
p-w=p1-w+p2-w;
for(i=1;ik;i++)
{
num[i]=num[i+1];
}
k--;
num[0]=p;
for(i=0;ik-1;i++) //排序
{
for(j=i+1;jk;j++)
{
if(num[i]-wnum[j]-w)
{
tmp=num[i];
num[i]=num[j];
num[j]=tmp;
}
}
}
}
root=num[0];
/*建立完畢*/
/*寫入文件,前序*/
if((fp=fopen("c:\\hfmtree.wxl","wb"))==NULL)
{
puts("文件打開錯(cuò)誤!");
getchar();
exit(0);
}
setcode(root);
go(root);
fclose(fp);
}
void setcode(struct node *p)
{
if(p-llink==NULLp-rlink==NULL)
{
tmpcode[t]='\0';
strcpy(p-code,tmpcode);
}
else
{
tmpcode[t++]='0';
setcode(p-llink);
t--;
tmpcode[t++]='1';
setcode(p-rlink);
t--;
}
}
void go(struct node *p)
{
if(p-llink==NULLp-rlink==NULL)
{
fputc('(',fp);
fputc(p-c,fp);
fputs(p-code,fp);
fputc(')',fp);
}
else
{
go(p-llink);
go(p-rlink);
}
}
void code(void)
{
FILE *fp1,*fp2,*fp3;
char ch1,ch2,c;
if((fp1=fopen("c:\\hfmtree.wxl","rb"))==NULL)
{
puts("文件打開錯(cuò)誤!");
getchar();
exit(0);
}
if((fp2=fopen("c:\\tobetrans.txt","wb"))==NULL)
{
puts("文件打開錯(cuò)誤!");
getchar();
exit(0);
}
if((fp3=fopen("c:\\codefile.wxl","wb"))==NULL)
{
puts("文件打開錯(cuò)誤!");
getchar();
exit(0);
}
while((ch1=fgetc(fp2))!=EOF)
{
t=0;
while((ch2=fgetc(fp1))!=EOF)
{
if(ch1==ch2)
{
while((c=fgetc(fp1))!=')')
{
tmpcode[t++]=c;
}
tmpcode[t]='\0';
fputs(tmpcode,fp3);
fputc('@',fp3);
rewind(fp1);
break;
}
}
}
fclose(fp1);
fclose(fp2);
fclose(fp3);
}
void decode(void)
{
FILE *fp1,*fp2,*fp3;
char ch1,ch2,ch3;
char temp_3[20];
char temp_1[20];
int t1,t3;
if((fp1=fopen("c:\\hfmtree.wxl","rb"))==NULL)
{
puts("文件打開錯(cuò)誤!");
getchar();
exit(0);
}
if((fp2=fopen("c:\\textfile.txt","wb"))==NULL)
{
puts("文件打開錯(cuò)誤!");
getchar();
exit(0);
}
if((fp3=fopen("c:\\codefile.wxl","rb"))==NULL)
{
puts("文件打開錯(cuò)誤!");
getchar();
exit(0);
}
while((ch3=fgetc(fp3))!=EOF)
{
t3=0;
while(ch3!='@')
{
temp_3[t3++]=ch3;
ch3=fgetc(fp3);
}
temp_3[t3]='\0';
while((ch1=fgetc(fp1))!=EOF)
{
if(isalpha(ch1))
{
ch2=ch1;
t1=0;
while((ch1=fgetc(fp1))!=')')
{
temp_1[t1++]=ch1;
}
temp_1[t1]='\0';
if(strcmp(temp_1,temp_3)==0)
{
fputc(ch2,fp2);
rewind(fp1);
break;
}
}
}
}
fclose(fp1);
fclose(fp2);
fclose(fp3);
}
void disp(void)
{
FILE *fp1,*fp2;
char ch1,ch2;
char tmp[20];
int t;
if((fp1=fopen("c:\\hfmtree.wxl","rb"))==NULL)
{
puts("文件打開錯(cuò)誤!");
getchar();
exit(0);
}
if((fp2=fopen("c:\\hfmcode.txt","wb"))==NULL)
{
puts("文件打開錯(cuò)誤!");
getchar();
exit(0);
}
while((ch1=fgetc(fp1))!=EOF)
{
if(ch1=='(')
{
t=0;
ch1=fgetc(fp1);
ch2=ch1;
while((ch1=fgetc(fp1))!=')')
{
tmp[t++]=ch1;
}
tmp[t]='\0';
printf("%c-----%s\n",ch2,tmp);
fputc(ch2,fp2);
fputc('-',fp2);
fputc('-',fp2);
fputc('-',fp2);
fputs(tmp,fp2);
fputc('\n',fp2);
}
}
fclose(fp1);
fclose(fp2);
}
這是以前寫的,可是我不想加注釋了,Huffman編碼其實(shí)原理很簡單的,你自己好好學(xué)下吧,一句一句注釋也太夸張了啊。
#includestring.h
#includestdlib.h
#includestdio.h
int m,s1,s2;
typedef struct {
unsigned int weight;
unsigned int parent,lchild,rchild;
}HTNode,*HuffmanTree;
typedef char ** HuffmanCode;
void Select(HuffmanTree HT,int n)
{
int i,j;
for(i=1;i=n;i++)
if(HT[i].parent==0)
{s1=i;
break;
}
for(j=i+1;j=n;j++)
if(HT[j].parent==0)
{
s2=j;
break;
}
for(i=1;i=n;i++)
{
if(HT[i].parent==0)
if(HT[s1].weightHT[i].weight)
if(s2!=i)
s1=i;
}
for(j=1;j=n;j++)
{
if(HT[j].parent==0)
if(HT[s2].weightHT[j].weight)
if(s1!=j)
s2=j;
}
if(s1s2)
{
int temp=s1;
s1=s2;
s2=temp;
}
}
void HuffmanCoding(HuffmanTree HT, HuffmanCode HC, int *w, int n)
{
int i,j;
char *cd;
int p;
int cdlen;
if (n=1) return;
m = 2 * n - 1;
HT = (HuffmanTree)malloc((m+1) * sizeof(HTNode));
for (i=1; i=n; i++)
{
HT[i].weight=w[i-1];
HT[i].parent=0;
HT[i].lchild=0;
HT[i].rchild=0;
}
for (i=n+1; i=m; i++)
{
HT[i].weight=0;
HT[i].parent=0;
HT[i].lchild=0;
HT[i].rchild=0;
}
//添加查看,便于調(diào)試
printf("構(gòu)造過程顯示:\n");
for(i=1;i=m;i++)
printf("%4d%4d%4d%4d%4d\n",i,HT[i].weight, HT[i].parent,HT[i].lchild, HT[i].rchild);
system("pause");
for(i=n+1;i=m;i++)
{
Select(HT,i-1);
HT[s1].parent = i; HT[s2].parent = i;
HT[i].lchild = s1; HT[i].rchild = s2;
HT[i].weight = HT[s1].weight + HT[s2].weight;
//添加查看,便于調(diào)試
/*printf("s1=%d,s2=%d\n",s1,s2);
for(j=1;j=i;j++)
printf("%d%4d%4d%4d",j,HT[j].weight,HT[j].parent,HT[j].lchild, HT[j].rchild);
system("pause");
*/
}
cd = (char *)malloc(n*sizeof(char));
p=m;
cdlen=0;
for(i=1;i=m;i++)
HT[i].weight=0;
while(p)
{
if(HT[p].weight==0)
{
HT[p].weight=1;
if(HT[p].lchild!=0)
{
p=HT[p].lchild;
cd[cdlen++]='0';
}
else if(HT[p].rchild==0)
{
HC[p]=(char *)malloc((cdlen+1)*sizeof(char));
cd[cdlen]='\0';
strcpy(HC[p],cd);
}
}
else if(HT[p].weight==1)
{
HT[p].weight=2;
if(HT[p].rchild!=0)
{
p=HT[p].rchild;
cd[cdlen++]='1';
}
}
else
{
HT[p].weight=0;
p=HT[p].parent;
--cdlen;
}
}
}
int main()
{
HuffmanTree HT;
HuffmanCode HC;
int *w,n,i;
printf("請輸入節(jié)點(diǎn)數(shù):\n");
scanf("%d",n);
HC = (HuffmanCode)malloc(n*sizeof(HuffmanCode));
w=(int *)malloc(n*sizeof(int));
printf("請輸入節(jié)點(diǎn)的權(quán)值:\n");
for(i=0;in;i++)
scanf("%d",w[i]);
HuffmanCoding(HT,HC,w,n);
printf("輸出編碼:\n");
for(i=1;i=n;i++)
printf("%2d(%4d):%s\n",i,w[i-1],HC[i]);
return 0;
system("pause");
}
//D:\2010 代碼\haffman\haffman\Node_statement.h
#define MAXVALUE 1000//定義最大權(quán)值
#define MAXBIT 100//定義哈夫曼樹中葉子結(jié)點(diǎn)個(gè)數(shù)
typedef struct
{
char data;//字符值
int num;//某個(gè)值的字符出現(xiàn)的次數(shù)
}TotalNode;
//統(tǒng)計(jì)結(jié)點(diǎn),包括字符種類和出現(xiàn)次數(shù)
typedef struct
{
TotalNode tot[300];//統(tǒng)計(jì)結(jié)點(diǎn)數(shù)組
int num;//統(tǒng)計(jì)數(shù)組中含有的字符個(gè)數(shù)
}Total;
//統(tǒng)計(jì)結(jié)構(gòu)體,包括統(tǒng)計(jì)數(shù)組和字符種類數(shù)
typedef struct
{
char mes[300];//字符數(shù)組
int num;//總字符數(shù)
}Message;
//信息結(jié)構(gòu)體,包括字符數(shù)組和總字符數(shù)
typedef struct{
int locked[500];//密碼數(shù)組
int num;//密碼總數(shù)
}Locking;
//哈夫曼編碼后的密文信息
typedef struct
{
char data;//字符
int weight;//權(quán)值
int parent;//雙親結(jié)點(diǎn)在數(shù)組HuffNode[]中的序號
int lchild;//左孩子結(jié)點(diǎn)在數(shù)組HuffNode[]中的序號
int rchild;//右孩子結(jié)點(diǎn)在數(shù)組HuffNode[]中的序號
}HNodetype;
//哈夫曼樹結(jié)點(diǎn)類型,包括左右孩子,權(quán)值和信息
typedef struct
{
int bit[MAXBIT];
int start;
}HCodetype;
//哈夫曼編碼結(jié)構(gòu)體,包括編碼數(shù)組和起始位
void reading_file(Message *message);//從文件中讀取信息
int writing_file(Message *message);//將信息寫進(jìn)文件
void total_message(Message *message,Total *total);//統(tǒng)計(jì)信息中各字符的次數(shù)
void HaffmanTree(Total *total,HNodetype HuffNode[]);//構(gòu)建哈夫曼樹
void HaffmanCode(HNodetype HuffNode[],HCodetype HuffCode[],Total *total);//建立哈夫曼編碼
void writing_HCode(HNodetype HuffNode[],HCodetype HuffCode[],Total *total);//將編碼規(guī)則寫進(jìn)文件
void lock(Message *message,HNodetype HuffNode[],HCodetype HuffCode[],Total *total,Locking *locking);//給文件信息加密編碼
void writing_lock(Locking *locking);//將已編碼信息寫進(jìn)文件
void first_function(HNodetype HuffNode[],HCodetype HuffCode[],Total *total,Message *message);
void display(Total *total,HNodetype HuffNode[]);
void writing_translate(Locking *locking,HCodetype HuffCode[],HNodetype HuffNode[],Total *total);//將已編碼信息翻譯過來并寫進(jìn)文
//D:\2010 代碼\haffman\haffman\function_mian.cpp
#include"Node_statement.h"
#includeiostream
#includefstream
#include "cstdlib"
using namespace std;
int main()
{
int i,j,choice,mark=0;//mark標(biāo)記文件信息是否讀入到內(nèi)存中
HNodetype HuffNode[500];//保存哈夫曼樹中各結(jié)點(diǎn)信息
HCodetype HuffCode[300];
Locking *locking;
Total *total;
Message *message;
locking=new Locking;
locking-num=0;
total=new Total;
total-num=0;
message=new Message;
message-num=0;
//初始化變量
printf("┏ ┓\n");
printf("┣ haffman_code system ┫ \n");
printf("┗ ┛\n");
printf("\n\n");
choice=0;
while(choice!=7 )
{
printf("#〓§〓〓〓〓〓§〓〓〓〓§〓〓〓〓§〓# \n ");
printf(" 0:go \n");
printf("※********** 1:從文件讀取信息**********************※\n");
printf(" *********** 2:顯示編碼規(guī)則 ********************* \n");
printf(" ********** 3:將原文件信息寫進(jìn)文件 ************ \n");
printf(" ********* 4:將編碼規(guī)則寫進(jìn)文件 ************ \n");
printf(" ********** 5:將編碼后的信息寫進(jìn)文件 ********** \n");
printf(" *********** 6:將譯碼后的信息寫進(jìn)文件 *********\n");
printf("※***********7:退出 *****************************※\n");
printf("#〓§〓〓〓〓〓§〓〓〓〓§〓〓〓〓§〓# \n ");
printf(" please input the choice ");
cinchoice;
switch(choice)
{
case 1:
reading_file(message);//從文件中讀取信息
mark=1;
break;
case 2://顯示編碼規(guī)則
if(mark==0)cout"請先從文件中讀取信息!"endl;
else
{
first_function(HuffNode,HuffCode,total,message);
cout"編碼規(guī)則為"endl;
for(i=0;itotal-num;i++)//顯示編碼規(guī)則
{
couttotal-tot[i].data" ";
for(j=HuffCode[i].start+1;jtotal-num;j++)
coutHuffCode[i].bit[j];
coutendl;
}
}
break;
case 3://將原文件信息寫進(jìn)文件a_test1.txt
if(mark==0)cout"請先從文件中讀取信息!"endl;
else
writing_file(message);//將信息寫進(jìn)文件
break;
case 4://將編碼規(guī)則寫進(jìn)文件
if(mark==0)cout"請先從文件中讀取信息!"endl;
else
{
first_function(HuffNode,HuffCode,total,message);
writing_HCode(HuffNode,HuffCode,total);//將編碼規(guī)則寫進(jìn)文件
}
break;
case 5://將編碼后的信息寫進(jìn)文件
if(mark==0)cout"請先從文件中讀取信息!"endl;
else
{
first_function(HuffNode,HuffCode,total,message);
writing_lock(locking);//將已編碼信息寫進(jìn)文件
}
break;
case 6://將譯碼后的信息寫進(jìn)文件
if(mark==0)cout"請先從文件中讀取信息!"endl;
else
{
first_function(HuffNode,HuffCode,total,message);
writing_translate(locking,HuffCode,HuffNode,total);//將已編碼信息翻譯過來并寫進(jìn)文件
}
break;
}
}
/**
打印haffman樹
**/
display(total,HuffNode);
system("PAUSE");
return 0;
}
void display(Total *total,HNodetype HuffNode[])
{
int i,j;
for(i=0;i2*total-num-1;i++)
{
printf("data weight lchild rchild parent \n");
printf(" %c %d %d %d %d\n",HuffNode[i].data,HuffNode[i].weight,HuffNode[i].lchild,HuffNode[i].rchild,HuffNode[i].parent);
}
}
void reading_file(Message *message)
/**
絕對路徑下讀取a_test.txt file
message 中的num記錄suoyou字符總數(shù) ,放在nes【】中
equal to the buffer
**/
{
int i=0;
char ch;
ifstream infile("a_test.txt",ios::in | ios::out);
if(!infile)//打開失敗則結(jié)束
{
cout"打開a_test.txt文件失敗"endl;
exit(1);
}
else
cout"讀取文件成功"endl;
while(infile.get(ch) ch!='#')//讀取字符直到遇到#
{
message-mes[i]=ch;
i++;
}
message-num=i;//記錄總字符數(shù)
infile.close();//關(guān)閉文件
}
int writing_file(Message *message)
/**
把從數(shù)組message 的信息write to disk,a_test1.txt to save
**/
{ /*
int i;
ifstream outfile("a_test1.txt",ios::in ); //打開文件
if( !outfile )//打開失敗則結(jié)束
{
cout"打開a_test1.txt文件失敗"endl;
return -1;
}
for(i=0;imessage-num;i++)//寫文件
outfile.put(message-mes[i]);
cout"信息寫進(jìn)文件成功"endl;
outfile.close();//關(guān)閉文件
return 0;*/
int i;
FILE *fp1=NULL;
if((fp1 = fopen("a_test1.txt","at"))==NULL)
{
printf("can't open the file\n");
exit(0);
}
for(i=0;imessage-num;i++)
fprintf(fp1,"%d ",message-mes[i]);
printf("文件寫入成功!\n");
i=fclose(fp1);
if(i==0)
printf("文件關(guān)閉成功!\n");
else
printf("文件關(guān)閉失敗!\n");
}
void total_message(Message *message,Total *total)
/**
統(tǒng)計(jì)message中不同字符 的個(gè)數(shù),和相同字符重復(fù)的次數(shù),重復(fù)字符用mark標(biāo)記,
total.tot[] 放不同字符,TotalNode 類型(char,num)
total.num 統(tǒng)計(jì)不同字符個(gè)數(shù)
使total這塊內(nèi)存空間有數(shù)據(jù),
**/
{
int i,j,mark;
for(i=0;imessage-num;i++)//遍歷message中的所有字符信息
{
if(message-mes[i]!=' ')//字符不為空格時(shí)
{
mark=0;
for(j=0;jtotal-num;j++)//在total中搜索當(dāng)前字符
if(total-tot[j].data==message-mes[i])//搜索到,則此字符次數(shù)加1,mark標(biāo)志為1
{
total-tot[j].num++;
mark=1;
break;
}
if(mark==0)//未搜索到,新建字符種類,保存進(jìn)total中,字符類加1
{
total-tot[total-num].data=message-mes[i];
total-tot[total-num].num=1;
total-num++;
}
}
}
}
void HaffmanTree(Total *total,HNodetype HuffNode[])
/**create the haffman tree
不同字符個(gè)數(shù)為葉子節(jié)點(diǎn)個(gè)數(shù)對應(yīng)書上的n,
相同字符的個(gè)數(shù)為其權(quán)值weight;
get HuffNode to store the tree
**/
{
int i,j,min1,min2,x1,x2;
for(i=0;i2*(total-num)-1;i++)//初始化哈夫曼樹并存入葉子結(jié)點(diǎn)權(quán)值和信息
{
if(i=total-num-1)
HuffNode[i].data=total-tot[i].data;
HuffNode[i].weight=total-tot[i].num;
HuffNode[i].parent=-1;
HuffNode[i].lchild=-1;
HuffNode[i].rchild=-1;
}
for(i=0;itotal-num-1;i++)
{
min1=min2=MAXVALUE;
x1=x2=0;
for(j=0;jtotal-num+i;j++)//選取最小x1和次小x2的兩權(quán)值
{
if(HuffNode[j].parent==-1HuffNode[j].weightmin1)
{
min2=min1;
x2=x1;
min1=HuffNode[j].weight;
x1=j;
}
else
if(HuffNode[j].parent==-1HuffNode[j].weightmin2)
{
min2=HuffNode[j].weight;
x2=j;
}
}
HuffNode[x1].parent=total-num+i;//修改親人結(jié)點(diǎn)位置
HuffNode[x2].parent=total-num+i;
HuffNode[total-num+i].weight=HuffNode[x1].weight+HuffNode[x2].weight;
HuffNode[total-num+i].lchild=x1;//左孩子比右孩子權(quán)值小
HuffNode[total-num+i].rchild=x2;
}
}
void HaffmanCode(HNodetype HuffNode[],HCodetype HuffCode[],Total *total)
/***
haffman to code (0,10,110,)
得到每個(gè)不同字符(葉子)的編碼,
存貯在數(shù)組HuffCode【】中,bit[] store the char,start store the loction
**/
{
int i,j,c,p;
HCodetype cd;
for(i=0;itotal-num;i++)//建立葉子結(jié)點(diǎn)個(gè)數(shù)的編碼
{
cd.start=total-num-1;//起始位初始化
p=HuffNode[i].parent;
c=i;
while(p!=-1)//從葉結(jié)點(diǎn)向上爬直到到達(dá)根結(jié)點(diǎn)
{
if(HuffNode[p].lchild==c)//左分支則為0
cd.bit[cd.start]=0;
else
cd.bit[cd.start]=1;//右分支則為1
cd.start--;//起始位向前移動(dòng)
c=p;
p=HuffNode[p].parent;
}
for(j=cd.start+1;jtotal-num;j++)//保存求出的每個(gè)葉結(jié)點(diǎn)編碼和起始位
HuffCode[i].bit[j]=cd.bit[j];
HuffCode[i].start=cd.start;
}
}
void writing_HCode(HNodetype HuffNode[],HCodetype HuffCode[],Total *total)
/**
HuffNode[]to input the leaf
HuffCode[]to input the code
all is to the a_test2.txt ,save the code
**/
{
/*打開HCode文件,失敗則結(jié)束。將信息寫進(jìn)文件*/
int i,j;
FILE *fp2=NULL;
if((fp2 = fopen("a_test2.txt","at"))==NULL)
{
printf("can't open the file\n");
exit(0);
}
for(i=0;itotal-num;i++)
{fprintf(fp2,"%d ",HuffNode[i].data);
printf(" ");
for(j=HuffCode[i].start+1;jtotal-num;j++)
fprintf(fp2,"%d ",HuffCode[i].bit[j]);
}
printf("編碼規(guī)則寫進(jìn)文件成功!\n");
i=fclose(fp2);
if(i==0)
printf("文件關(guān)閉成功!\n");
else
printf("文件關(guān)閉失敗!\n");
}
void lock(Message *message,HNodetype HuffNode[],HCodetype HuffCode[],Total *total,Locking *locking)
/***
對messag操作,對所有字符加密,
結(jié)果存貯在數(shù)組locked[]中,locking 記錄已經(jīng)加密后的密文
**/
{
int i,j,m;
for(i=0;imessage-num;i++)//把相同的不同的字符全部 遍歷
{
if(message-mes[i]==' ')//碰到空格則以-1形式保存進(jìn)locked數(shù)組中
{
locking-locked[locking-num]=-1;
locking-num++;
}
else
for(j=0;jtotal-num;j++)//從total中找到對應(yīng)的字符
{
if(HuffNode[j].data==message-mes[i])
//找到在HuffNode 中對應(yīng)字符,找到下標(biāo)j
// 在HuffCode
for(m=HuffCode[j].start+1;mtotal-num;m++)///////// !
{
locking-locked[locking-num]=HuffCode[j].bit[m];//加密
locking-num++;
}
}
}
}
void writing_lock(Locking *locking)
/*
將密文寫到a_test3.txt
*/
{
int i;
FILE *fp3=NULL;
if((fp3= fopen("a_test3.txt","at"))==NULL)
{
printf("can't open the file\n");
exit(0);
}
for(i=0;ilocking-num;i++)
{
if(locking-locked[i]==-1)
printf(" ");
else
fprintf(fp3,"%d ",locking-locked[i]);
}
printf("已編碼信息寫進(jìn)文件成功!\n");
i=fclose(fp3);
if(i==0)
printf("文件關(guān)閉成功!\n");
else
printf("文件關(guān)閉失敗!\n");
}
void writing_translate(Locking *locking,HCodetype HuffCode[],HNodetype HuffNode[],Total *total)
/**
密文翻譯成明文,然后存到文件 a_test4.txt
**/
{
int i,j,mark[100],start[100],min,max;
FILE *fp4=NULL;
if((fp4 = fopen("a_test4.txt","at"))==NULL)
{
printf("can't open the file\n");
exit(0);
}
for(i=0;itotal-num;i++)//start數(shù)組初始化
{
start[i]=HuffCode[i].start+1;//。。。。
}
for(i=0;itotal-num;i++)//mark數(shù)組初始化
{
mark[i]=1;
}
min=0;
for(max=0;maxlocking-num;max++)//寫文件
{
if(locking-locked[max]==-1)//碰到空格信息則直接輸出空格
{
printf(" ");//把空格寫到文件
min++;
}
else
{
for(i=min;i=max;i++)//查找從min開始到max的編碼對應(yīng)的信息
{
for(j=0;jtotal-num;j++)
{
if(start[j] == total-num+1)
mark[j]=0; //對應(yīng)編碼比所給編碼短則不在比較
if(mark[j]==1locking-locked[i]==HuffCode[j].bit[start[j]])
start[j]++;
else
mark[j]=0;
}
}
for(i=0;itotal-num;i++)//找到對應(yīng)信息,則寫進(jìn)文件
{
if(mark[i]==1start[i]==total-num)
{
fprintf(fp4,"%d ",HuffNode[i].data);//寫到文件outfile
break;
}
}
if(i!=total-num)
min=max+1;
for(i=0;itotal-num;i++)//start數(shù)組初始化
{
start[i]=HuffCode[i].start+1;
}
for(i=0;itotal-num;i++)//mark數(shù)組初始化
{
mark[i]=1;
}
}
}
printf("文件寫入成功!\n");
i=fclose(fp4);
if(i==0)
printf("文件關(guān)閉成功!\n");
else
printf("文件關(guān)閉失敗!\n");
}
void first_function(HNodetype HuffNode[],HCodetype HuffCode[],Total *total,Message *message)
{
total_message(message,total);//統(tǒng)計(jì)信息中各字符的出現(xiàn)次數(shù)
HaffmanTree(total,HuffNode);//構(gòu)建哈夫曼樹
HaffmanCode(HuffNode,HuffCode,total);//建立哈夫曼編碼
}
官方標(biāo)準(zhǔn)庫對flate包的定義是:flate包實(shí)現(xiàn)了deflate壓縮數(shù)據(jù)格式,參見 RFC 1951 。gzip包和zlib包實(shí)現(xiàn)了對基于deflate的文件格式的訪問。
這邊什么是deflate?
維基百科給出的解釋是: DEFLATE 是同時(shí)使用了 LZ77 算法與 哈夫曼編碼 (Huffman Coding)的一個(gè) 無損數(shù)據(jù)壓縮 算法 。它最初是由 菲爾·卡茨 (Phil Katz)為他的 PKZIP 軟件第二版所定義的,后來被 RFC 1951 標(biāo)準(zhǔn)化。
1)func NewReader(r io.Reader) io.ReadCloser
2)func NewReaderDict(r io.Reader, dict []byte) io.ReadCloser
3)func NewWrite(w io.Write, level int) (*Write, error)
4)func NewWriteDict(w io.Writer, level int, dict []byte) (*Writer, error)
5)func (e InternalError) Error() string
6)func (e *ReadError) Error() string
7)func (e *WriteError) Error() string
8)func (w *Writer) Close() error
9)func (w *Writer) Flush() error
9)func (w *Writer) Reset(dst io.Writer)
10)func (w *Writer) Write(data []byte) (n int, err error)
非常好的一個(gè)資源鏈接:
如果有很好的資源,歡迎在評論區(qū)留言分享