哈弗曼編碼和解碼.cpp

來源:互聯網
上載者:User

標籤:style   blog   color   檔案   2014   os   

<span style="color:#6600cc;">#include<stdio.h>#include<string.h>#include<stdlib.h>typedef struct{     char a;//記錄對應字元     int weight;//權值     int parent,lchild,rchild;}HTNode,*HuffmanTree;typedef char * *HuffmanCode;//動態分配數組儲存哈夫曼編碼錶void Select(HuffmanTree HT,int m,int *s1)//選擇雙親節點為0且權值最小的節點{int i,j,k,h,a,b;    for(a=1;a<=m;a++)        if(HT[a].parent==0)             break;    i=a;k=a; for(;i<=m;i++)    if(HT[i].weight<HT[k].weight&&HT[i].parent==0)           k=i;    *s1=k;}//求哈夫曼編碼void HuffmanCoding(HuffmanTree *HT,HuffmanCode *HC,int *w,char *s,int n){ int m,i,start,s1,s2,c,f; char *cd; HuffmanTree p; if(n<=1) return; m=2*n-1; *HT=(HuffmanTree)malloc((m+1)*sizeof(HTNode)); for(i=1;i<=n;i++,w++,s++)  {(*HT)[i].weight=*w;//葉子節點的權值不變  (*HT)[i].a=*s;  (*HT)[i].parent=0,(*HT)[i].lchild=0,(*HT)[i].rchild=0;}    for(i=n+1;i<=m;i++)        (*HT)[i].parent=0;//parent初始化 for(i=n+1;i<=m;++i){//建哈夫曼樹  Select(*HT,i-1,&s1);(*HT)[s1].parent=i;        Select(*HT,i-1,&s2);/*選擇parent為0且權值最小的兩個節        點分別作為s1和s2*/  (*HT)[s2].parent=i;  (*HT)[i].lchild=s1;(*HT)[i].rchild=s2;(*HT)[i].a='0';  (*HT)[i].weight=(*HT)[s1].weight+(*HT)[s2].weight; } //從葉子到根逆向求每個字元的哈夫曼編碼 (*HC)=(HuffmanCode)malloc((n+1)*sizeof(char *));/*分配n個 字元編碼的頭指標向量*/ cd=(char *)malloc(n*sizeof(char));//分配求編碼的工作區間 cd[n-1]='\0';//編碼結束符 for(i=1;i<=n;i++){//逐個字元求哈夫曼編碼  start=n-1;//編碼結束符位置  for(c=i,f=(*HT)[i].parent;f!=0;c=f,f=(*HT)[f].parent)/*從葉  子到根逆向求編碼*/   if((*HT)[f].lchild==c) cd[--start]='0';        else cd[--start]='1'; (*HC)[i]=(char *)malloc((n-start)*sizeof(char));/*為第i 個字元編碼分配空間*/ strcpy((*HC)[i],&cd[start]);//從cd複製編碼到HC }}//解碼void HUffmanDising(HuffmanTree HT,int n){  FILE *fp3,*fp4;HuffmanTree p;  int c,m;char b;  p=HT;m=2*n-1;*p=HT[m];  fp3=fopen("File3.txt","r");  fp4=fopen("File4.txt","w");  if(fp3!=NULL) {fscanf(fp3,"%c",&b);/*讀入一個字元,如果為‘0’遍曆左子樹,    為‘1’遍曆右子樹,遇到葉子節點輸出*/  while(!feof(fp3)){           if(b=='0'){                if((*p).a=='0')                c=(*p).lchild,(*p)=HT[c];//指向左孩子               }            if(b=='1'){                if((*p).a=='0')                 c=(*p).rchild,(*p)=HT[c];//指向右孩子               }            if((*p).a!='0')  fprintf(fp4,"%c",(*p).a),//葉子節點輸出            (*p)=HT[m];//指向根結點            if(!feof(fp3)) fscanf(fp3,"%c",&b); }  }   fclose(fp4);fclose(fp3);}void PrintfBitree(HuffmanTree *HT,HuffmanCode *HC,int n){int i,j=1,m=n*2-1; printf("序號   字元   權值   雙親   左孩子    右孩子  哈夫曼碼\n");  for(i=1;i<=m;i++,j++)    {printf(" %02d     %c      %2d     %2d    %2d        %2d",i,(*HT)[i].a,(*HT)[i].weight,(*HT)[i].parent,(*HT)[i].lchild,(*HT)[i].rchild);    if(j<=n) printf("       %s ",(*HC)[j]);    printf("\n");}}int main(){   int a[258],n,c[100],i,j,k,z;char e;char m[100],b;    HuffmanTree HT;HuffmanCode HC; FILE *fp1,*fp2,*fp3,*fp4; for(i=0;i<=256;i++)   a[i]=0;//讀入一個字元,在數組a中的位置由其ASCII嗎決定    for(i=0;i<100;i++)         c[i]=0;//記錄每一個字元的權值 fp1=fopen("File1.txt","r"); if(fp1!=NULL) {  while(!feof(fp1)){   fscanf(fp1,"%c",&e);  if(!feof(fp1)) a[(int)e]++;//統計出現次數  } } fclose(fp1); for(i=0,j=0;i<=256;i++)   if(a[i]!=0)   c[j++]=a[i],m[j-1]=(char)i;//將字元存到數組m中 HuffmanCoding(&HT,&HC,c,m,j); fp1=fopen("File1.txt","r"); fp2=fopen("File2.txt","w"); fp3=fopen("File3.txt","w+"); if(fp1!=NULL)//在檔案二語三中輸出檔案一中內容所對應的哈夫曼嗎 {  while(!feof(fp1)){   fscanf(fp1,"%c",&e);   if(feof(fp1)) break;       for(i=0;i<j;i++)          if(m[i]==e) break;          fprintf(fp2,"%s",HC[i+1]);           fprintf(fp3,"%s",HC[i+1]);  } } fclose(fp1); fclose(fp2); fclose(fp3); PrintfBitree(&HT,&HC,j);//輸出相關資訊    HUffmanDising(HT,j);//解碼函數} </span>


 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.