資源描述:
《數(shù)據(jù)結(jié)構(gòu)實驗報告huffman編碼和解碼算法》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在工程資料-天天文庫。
1、(規(guī)格為A4紙或A3紙折疊)佛山科學技術(shù)學院(用四號宋體)實驗報告(用小二號黑體)課程名稱數(shù)據(jù)結(jié)構(gòu)實驗實驗項目用Huffman樹進行編碼和解碼算法專業(yè)班級—姓名學號—指導教師成績H期(用小四號宋體)一、目的和要求1、通過本實驗,熟悉二叉樹、Huffman樹的基本概念,掌握二叉樹的存儲結(jié)構(gòu)及各種算法。2、熟悉用Huffman樹進行電文的加密與解密算法。二、實驗原理Huffman樹是一種特殊的二叉樹,其葉結(jié)點的編碼是一種前綴碼,同時,通過統(tǒng)計字符的頻度,能夠達到編碼電文的最小化。三、實驗步驟1.統(tǒng)計電文中字符的出現(xiàn)頻率。2.用統(tǒng)計頻率建立Hffman樹。3.生成前綴碼;4.建立huffm
2、an樹的解碼算法.5.用隨機輸入的電文完成編碼與解碼過程。四、源程序#include^include#includc〈string.h>#defineMAX100structHTNode{chara;intweight;intparent,lchild,rchild;}*HT;//動態(tài)分配數(shù)組存儲赫夫曼樹char**HC;intn=0,m=0;char*writc()〃存儲輸入的電文{char*p,*q;printf(,z請輸入電文(結(jié)束輸入請按enter):〃);p=(char*)malloc(MAX*sizeof(char));//申請存
3、儲輸入的屯文的空間if(!p)exit(0);q=p;scanf(〃%c〃,q);while(*q!二'){//******錄入電文,每錄入一個字符同時給電文長度計數(shù)器n加一*******n=n+l;if(n>二MAX)//判斷己中請的空間是否足夠錄入,不足則追加空間{p=(char*)realloc(q,(MAX+10)*sizeof(char));if(!p)exit(0);}q++;scanf(〃%c〃,q);}return(p);}voidweight(char*p)//求電文中各字符的概率,并將該概率當作各字符的權(quán)值{char*q,*ql,temp;structHTNo
4、de*q2;inti,j,t;ql=q=(char*)malloc(n*sizeof(char));for(;*p!二';p++,ql++)*ql=*p;//將電文存放到ql指向的空間中qi=q;for(i=0;i5、出現(xiàn)過不同的字符的個數(shù){ql++;if(temp!=*ql){m++;//字符種類計數(shù)器加一temp=*ql;}}ql二q;HT=(structHTNodc*)malloc(2*m*sizeof(structHTNode));/*申請赫夫曼樹HT的空間,其中0號單元不用*/q2二HT+1;//*****************初女臺化赫夫曼樹HT*********************for(i=l;i〈二n;)t=0;for(q2-〉a=*ql;*ql二二q2-〉a;ql++)t++;i++;}q2-〉weight二(int)(t*100/n);q2->lchild=0;q2->
6、parent二0;q2->rchild=0;q2++;}for(i=m+l;i<=2*m-l;i++,q2++){q2->lchild=0;q2->parcnt二0;q2->rchild=0;q2-〉weight二0;}free(q);}voidSelect(intt,int*sl,int*s2){/************在HT[1,t]選擇parent為0且weight最小的兩個結(jié)點,其序號分別為si和s2o**********************/inttemp,j;for(j=l;j<=t;j++)if(HT[jJ.parent==0){*sl二j;for(j=j+l;j
7、<=t;j++)if(HT[j].parcnt==0){*s2二j;break;}break;}if(HT[*sl].weight>HT[*s2].weight)temp=*s2;*s2=*sl;*sl二temp;for(;t>0;t-一)if(t!=*sl&&t!=*s2)if(HT[t]?parent==0)if(HT[*sl].weight〈二HT[t].weight&&HT[*s2]?weight>HT[t].weight)*s2二t;elseif