真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

go語言實(shí)現(xiàn)哈夫曼編碼,go語言編碼規(guī)范

哈夫曼編碼問題,高手幫我

#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);

}

哈夫曼樹及哈夫曼編碼譯碼的實(shí)現(xiàn)(根據(jù)程序畫流程圖及對每句程序注釋)

這是以前寫的,可是我不想加注釋了,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");

}

利用 數(shù)據(jù)結(jié)構(gòu) 實(shí)現(xiàn) 哈夫曼編碼/譯碼實(shí)現(xiàn)

//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);//建立哈夫曼編碼

}

golang中compress/flate包

官方標(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ū)留言分享


本文名稱:go語言實(shí)現(xiàn)哈夫曼編碼,go語言編碼規(guī)范
網(wǎng)頁路徑:http://weahome.cn/article/heejdg.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部