資源描述:
《哈夫曼編碼與解碼C語言知識講解.doc》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在工程資料-天天文庫。
1、哈夫曼編碼與解碼C語言精品文檔#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ù)組下標*/}HafuNode,*HafuTree;HafuTreeht;/*
2、聲明一個指向樹結(jié)點到指針*/typedefstruct{charch;/*葉子結(jié)點字符*/charcodestr[20];/*字符編碼*/}HafuCode;HafuCodecode[27];/*用于存放對應字符到哈夫曼編碼*/voidInitHafuArry(){/*導入文件計算權(quán)值,生成只含有葉子結(jié)點的HafuNode數(shù)組*/intj,i,k;HafuNodetmpht;FILE*fp;/*定義一指向打開文件的指針*/charch;/*用于存儲一個字母*/charlocation[30]="D:\";ht=
3、(HafuTree)malloc(53*sizeof(HafuNode));/*為哈夫曼數(shù)分配內(nèi)存空間*/if(ht==NULL)return;for(i=0;i<53;i++)/*初始化所以的數(shù)據(jù)單元,每個單元自成一棵樹*/收集于網(wǎng)絡,如有侵權(quán)請聯(lián)系管理員刪除精品文檔{ht[i].w=0;/*權(quán)值初始化為0*/ht[i].lchild=ht[i].rchild=-1;/*左右子為空*/}num=0;printf("Filename:");scanf("%s",filename);strcat(location,
4、filename);fp=fopen(location,"r");if(!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、*找到新字符*/{ht[num].ch=ch;/*將新字符存入并將權(quán)值加1*/ht[num].w++;num++;}else{ht[j].w++;/*將已有字符權(quán)值加1*/}收集于網(wǎng)絡,如有侵權(quán)請聯(lián)系管理員刪除精品文檔}}fclose(fp);printf("");for(i=0;i10、(k!=i)/*如果權(quán)值最小的不是第i個元素則交換位置,將小的放到前面*/{tmpht=ht[i];ht[i]=ht[k];ht[k]=tmpht;}}}intCreateHafuman(HafuTreeht){/*在數(shù)組ht中生成哈夫曼數(shù),返回根節(jié)點下標*/inti,k,j,root;HafuNodehfnode;codenum=0;for(i=0;i11、.w;hfnode.lchild=k-1;hfnode.rchild=k;for(j=num+i;j>k;j--)/*將新結(jié)點插入有序數(shù)組中*/{if(ht[j].w>hfnode.w){收集于網(wǎng)絡,如有侵權(quán)請聯(lián)系管理員刪除精品文檔ht[j+1]=ht[j];}elsebreak;}ht[j]=hfnode;root=j;/*一直跟隨新生成的結(jié)點,最后新生成的結(jié)點為根結(jié)點*/}returnroot;}voidGetHafuCode(HafuTreeht,introot,char*codestr){/*ht是哈夫曼
12、樹,root是根結(jié)點下標,codestr是來暫時存放葉子結(jié)點編碼的,一開始為空*/FILE*out;intlen,i;FILE*fp;/*定義一指向打開文件的指針*/charch;/*用于存儲一個字母*/charlocation[30]="D:\";if(ht[root].lchild==-1){/*遇到遞歸終點是葉子結(jié)點記錄葉子結(jié)點的哈夫曼編碼*/code[coden