資源描述:
《哈夫曼編碼與解碼C語言.doc》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在教育資源-天天文庫。
1、#include"stdio.h"/*I/O函數(shù)*/#include"stdlib.h"/*其他庫函數(shù)聲明*/intnum;/*記錄結(jié)點數(shù)*/intcodenum=0;/*已經(jīng)獲得的編碼個數(shù)*/charfilename[20]="";/*存儲文件名*/typedefstruct/*哈夫曼結(jié)點存儲結(jié)構(gòu)*/{charch;/*結(jié)點字符*/intw;/*結(jié)點權(quán)值*/intlchild,rchild;/*左右孩子的數(shù)組下標(biāo)*/}HafuNode,*HafuTree;HafuTreeht;/*聲明一個指向樹結(jié)點到指針*/
2、typedefstruct{charch;/*葉子結(jié)點字符*/charcodestr[20];/*字符編碼*/}HafuCode;HafuCodecode[27];/*用于存放對應(yīng)字符到哈夫曼編碼*/voidInitHafuArry(){/*導(dǎo)入文件計算權(quán)值,生成只含有葉子結(jié)點的HafuNode數(shù)組*/intj,i,k;HafuNodetmpht;FILE*fp;/*定義一指向打開文件的指針*/charch;/*用于存儲一個字母*/charlocation[30]="D:\";ht=(HafuTree)mal
3、loc(53*sizeof(HafuNode));/*為哈夫曼數(shù)分配內(nèi)存空間*/if(ht==NULL)return;for(i=0;i<53;i++)/*初始化所以的數(shù)據(jù)單元,每個單元自成一棵樹*/{ht[i].w=0;/*權(quán)值初始化為0*/ht[i].lchild=ht[i].rchild=-1;/*左右子為空*/}num=0;printf("Filename:");scanf("%s",filename);strcat(location,filename);fp=fopen(location,"r");i
4、f(!fp)/*返回1時即存在文件*/{printf("OpenError");return;}while(!feof(fp))/*沒到結(jié)尾時返回0*/{ch=fgetc(fp);if(ch==''
5、
6、ch<='z'&&ch>='a'
7、
8、ch<='Z'&&ch>='A'){printf("%c",ch);if(ch=='')ch='#';for(j=0;j9、權(quán)值加1*/ht[num].w++;num++;}else{ht[j].w++;/*將已有字符權(quán)值加1*/}}}fclose(fp);printf("");for(i=0;i10、]=ht[k];ht[k]=tmpht;}}}intCreateHafuman(HafuTreeht){/*在數(shù)組ht中生成哈夫曼數(shù),返回根節(jié)點下標(biāo)*/inti,k,j,root;HafuNodehfnode;codenum=0;for(i=0;ik;
11、j--)/*將新結(jié)點插入有序數(shù)組中*/{if(ht[j].w>hfnode.w){ht[j+1]=ht[j];}elsebreak;}ht[j]=hfnode;root=j;/*一直跟隨新生成的結(jié)點,最后新生成的結(jié)點為根結(jié)點*/}returnroot;}voidGetHafuCode(HafuTreeht,introot,char*codestr){/*ht是哈夫曼樹,root是根結(jié)點下標(biāo),codestr是來暫時存放葉子結(jié)點編碼的,一開始為空*/FILE*out;intlen,i;FILE*fp;/*定義一指向
12、打開文件的指針*/charch;/*用于存儲一個字母*/charlocation[30]="D:\";if(ht[root].lchild==-1){/*遇到遞歸終點是葉子結(jié)點記錄葉子結(jié)點的哈夫曼編碼*/code[codenum].ch=ht[root].ch;strcpy(code[codenum].codestr,codestr);codenum++;}else/*不是終點則繼續(xù)