国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

c語言哈夫曼編碼

2019-11-10 17:55:15
字體:
供稿:網(wǎng)友
#include<stdio.h>#include<string.h>#include<malloc.h>typedef struct character{char str;int  count;int index; } character; //一棵樹需要左孩子,右孩子,非葉子節(jié)點上的數(shù)字  typedef struct Tree {    int left;  int right;  int count;  int index;  char str;  char code[256]; }Tree;//統(tǒng)計字符串的各字符的頻率,以及記錄不同字符的個數(shù),排序character *getCharCount(int *count,char *String);//輸出統(tǒng)計后各個字符,頻率 void showChar(Tree *tree,int count);//形成一個二叉樹 void PRoTree(Tree *tree,int count,character *chars);//形成編碼void decode(Tree *tree,int root,int index,char *code);//編碼void afterDecode(Tree *tree,char *String,int count,char *afterString); //編碼后輸出void putcode(char *String); void putcode(char *String){puts(String);}void afterDecode(Tree *tree,char *String,int count,char *afterString){int i,j;for(i=0;String[i];i++){for(j=0;j<count;j++){if(tree[j].str==String[i]){strcat(afterString,tree[j].code);}}}strcpy(String,afterString);}void decode(Tree *tree,int root,int index,char *code) {if(tree[root].left==-1){code[index]=0;strcpy(tree[root].code,code);}else    {code[index]='1';decode(tree,tree[root].left,index+1,code);code[index]='0';decode(tree,tree[root].right,index+1,code);}}void proTree(Tree *tree,int count,character *chars){int i;int j;for(i=0;i<count;i++){tree[i].index=i;tree[i].left=-1;tree[i].right=-1;tree[i].count=chars[i].count;tree[i].str=chars[i].str; }for(i=count,j=i-2;i<2*count-1;i++){tree[i].index=i;tree[i].left=tree[i-1].index;tree[i].right=tree[j].index;tree[i].count=tree[i-1].count+tree[j--].count;tree[i].str=' '; }}void showChar(Tree *tree,int count) {int i;printf("下標(biāo)  字符   頻率     編碼    左孩子    右孩子/n");for(i=0;i<2*count-1;i++){printf("%2d  %5c  %4d   %7s   %5d    %6d/n",tree[i].index,tree[i].str,tree[i].count,tree[i].code,tree[i].left,tree[i].right);} } character *getCharCount(int *count,char *String){character *p=NULL;character t;int i,j=0;int k=0;int chars[256]={0};for(i=0;String[i];i++)chars[String[i]]++;for(i=0;i<256;i++){if(chars[i]){k++;}}*count=k;p=(character *)(calloc(sizeof(character),k));for(i=0;i<256;i++){if(chars[i]){p[j].str=i;p[j++].count=chars[i];}}for(i=0;i<k;i++)for(j=0;j<k-i-1;j++)if(p[j].count<p[j+1].count){t=p[j];p[j]=p[j+1];p[j+1]=t; }for(i=0;i<k;i++)p[i].index=i;return p; }int main(){char String[256];char afterString[256]={0};character *chars;Tree *tree;int count;char code[256];printf("請輸入一串字符串:/n");gets(String);chars=getCharCount(&count,String);tree=(Tree *)(calloc(sizeof(Tree),2*count-1));proTree(tree,count,chars);decode(tree,2*count-2,0,code);showChar(tree,count);afterDecode(tree,String,count,afterString);putcode(String);free(chars);free(tree); }
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 遂平县| 铁岭市| 湖南省| 唐海县| 沅江市| 黄龙县| 巫溪县| 达拉特旗| 宜章县| 洛扎县| 久治县| 德清县| 南充市| 六枝特区| 阿鲁科尔沁旗| 泸定县| 绵竹市| 大姚县| 中阳县| 泾阳县| 磐安县| 乐东| 绥阳县| 汝城县| 黔西县| 佛教| 阿拉善左旗| 兴业县| 吐鲁番市| 文化| 昭平县| 伊宁县| 三亚市| 昆山市| 铜陵市| 津市市| 阳泉市| 抚松县| 岗巴县| 盐池县| 赫章县|