亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? huffmancode.cpp

?? /*哈夫曼編/譯碼器 完成Huffman 編碼的譯碼過程。 即輸入一個碼串
?? CPP
字號:
  /*哈夫曼編/譯碼器
完成Huffman 編碼的譯碼過程。
即輸入一個碼串,請翻譯成相應的字符串。
要求有編碼過程和解碼過程。*/
#include<stdio.h>
#include<string.h>
#include<stdlib.h>

#define WordNUM 28//字符集中字符個數
#define MessageNUM 100000//最大信息量

typedef struct {
	int N;
	int SumWeight;
	char word[WordNUM+1];
	int weight[WordNUM+1]; 
}Word,*Wordset;//字符集及其權重.0號單元未用

typedef int Boolean;
typedef char* Message;//動態分配字符串數組存儲信息

typedef struct {
	int n;//n序號
    char data;
	int weight;//權重值
	int parent,lchild,rchild;
}HTNode,*HuffmanTree;//動態分配數組存儲哈夫曼樹;

typedef struct{
    char data;
	char* Code;//動態分配字符串數組存儲哈夫曼編碼表
}HCode,*HuffmanCode;//動態分配字符串數組存儲哈夫曼編碼表

void printstar(){
	printf("************************************************************\n");
}//printstar

Boolean UserSaysYes(){//與用戶對話函數
	int c,t;
	printf("(y,n)?");
	do{
		while((c=getchar())=='\n');//Ignore new line character.
        if(c=='y'||c=='Y'||c=='n'||c=='N')
		{	
			while((t=getchar())!='\n');//讀去'\n'
			return(c=='y'||c=='Y');
		}
		printf("Please respond by typing one of the letters y or n\n");
	}while(1);
}

//字符集Wordset操作
void CreatWordset(Wordset w){//建立自定義字符集和權重
    int i;
	char word[WordNUM+1]={
		'#',' ','\n',
		'a','b','c','d','e','f','g',
		'h','i','j','k','l','m','n',
		'o','p','q','r','s','t',
		'u','v','w','x','y','z'};
	int weight[WordNUM+1]={
		0,186,4,
		60,13,22,32,103,21,15,
		47,57,1,5,32,20,57,
		63,15,1,48,51,80,
		23,8,18,1,16,1};
	w->N =WordNUM;//記錄字符個數
	w->SumWeight=0;//記錄總的權重值
	for(i=1;i<=w->N;i++)
	{
		w->word [i]=word[i];
		w->weight [i]=weight[i];
		w->SumWeight+=weight[i];
	}
}		

void SaveWordsetFile(Wordset w){//保存到文件
	FILE*fp;
	if(!(fp=fopen("wordset","wb")))puts("cann't open file.");
	if(fwrite(w,sizeof(Word),1,fp)!=1)puts("SaveWordsetFile write error!");
	fclose(fp);	
}

void OpenWordsetFile(Wordset w){//讀文件
	FILE*fp;
	w=(Wordset)malloc(sizeof(Word));//字符集及其權重所占空間分配
	if(!(fp=fopen("wordset","rb")))puts("cann't open file.");
	fread(w,sizeof(Word),1,fp);
}

void OutputWordset(Wordset w){//輸出
	int i;
    for(i=1;i<=w->N;i++){
		printf("%c %d\t",w->word [i],w->weight [i]);
	}
	printf("SumWeight=%d\n",w->SumWeight);

}


//Huffman操作
void Select(HuffmanTree HT,int t,int*s1,int*s2){//在HT[1...i-1]選擇parent為0且weight最小的兩個結點,其序號為s1,s2.
	int i;
	HuffmanTree p;
	int weight=99999 ;
	*s1=*s2=0;
	for(i=1,p=HT+1;i<=t;++i,++p)
	{
		if(p->parent==0 )
			if(weight>p->weight)
			{
				*s1=i;
				weight=p->weight ;
			}
	}
	weight=99999 ;
	for(i=1,p=HT+1;i<=t;++i,++p)
	{
		if(p->parent==0 && i!=*s1)
			if(weight>p->weight)
			{
				*s2=i;
                weight=p->weight ;
			}
	}
}

void CreatHuffmanTree(HuffmanTree HT,Wordset w){//建立HuffmanTree
	//w存放n個字符的權值(均>0),構造哈夫曼樹HT,并求出n個字符的哈夫曼編碼HC。
	int i,n,m,s1,s2;
	HuffmanTree p;
    if(w->N<=1)return;
	n=w->N;
	m=2*n-1;//一棵有n個葉子結點的赫夫曼樹共有2n-1個結點
	for(p=HT,i=0;i<=n;++i,++p)//HuffmanTree initing
	{
		p->n =i;
		p->data =w->word [i];
		p->weight =w->weight [i];
		p->lchild =0; p->parent =0; p->rchild =0;
	}
	for(;i<=m;++i,++p){
		p->n =i;p->lchild =0;p->data ='#';p->parent =0;p->rchild =0;p->weight =0;
	}
	printf("初始Huffman樹:\n");
	for(p=&HT[1],i=1;i<=n;++i,++p)
	{
		printf("%d %c %d %d %d %d\t",p->n,p->data,p->weight,p->lchild,p->parent,p->rchild);
	}
	printf("\nCreat HTTree:\n");
	for(i=n+1;i<=m;++i){//建哈夫曼樹
		//在HT[1...i-1]選擇parent為0且weight最小的兩個結點,其序號為s1,s2.
		Select(HT,i-1,&s1,&s2);
		HT[s1].parent=i;HT[s2].parent=i;
		HT[i].lchild=s1;HT[i].rchild=s2;
		HT[i].weight=HT[s1].weight+HT[s2].weight;
		printf("%d %d %d %d %d\t",HT[i].n,HT[i].weight,HT[i].lchild,HT[i].parent,HT[i].rchild);
	}
	printf("\n");
}

void CreatHuffmanCode(HuffmanTree HT,HuffmanCode HC,Wordset w){//建立HuffmanCode
	//---從葉子結點到根逆向求每個字符的哈夫曼編碼---
	char* cd;
	int i,n,start,c,f;
	n=w->N ;
    for(i=1;i<=n;i++)HC[i].data=w->word[i];  
	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';//左0右1
			else cd[--start]='1';
		}
		HC[i].Code=(char*)malloc((n-start)*sizeof(char));//為第i個字符編碼分配空間
		strcpy(HC[i].Code,&cd[start]);
	}
	free(cd);
	for(i=1;i<=n;i++)
		printf("%c %s\n",HC[i].data,HC[i].Code);
    printf("\n");
}//HuffmanCoding

void SaveHuffmanFile(HuffmanTree HT,HuffmanCode HC,int m,int n){//保存HuffmanTree和HuffmanCode
	FILE*fp1,*fp2;
	int i;

	//寫出到文件
	if((fp1=fopen("HT","wb"))==NULL)
	{puts("can't open file \"HT.dat\" .");exit(0); }
	if((fp2=fopen("HC","wb"))==NULL)
	{puts("can't open file \"HC.dat\" .");exit(0); }
	for(i=0;i<=m;i++)
	    if(fwrite(&HT[i],sizeof(HTNode),1,fp1)!=1)puts("write error!\n");
	for(i=0;i<=n;i++)
	    if(fwrite(&HC[i],sizeof(HC[i]),1,fp2)!=1)puts("write error!\n");
	fclose(fp1);fclose(fp2);

}

void OpenHuffmanFile(HuffmanTree HT,HuffmanCode HC){	//從文件讀入
	FILE*fp1,*fp2;

   	HT=(HuffmanTree)malloc((WordNUM+1)*sizeof(HTNode));//0號單元未用
	HC=(HuffmanCode)malloc((WordNUM+1)*sizeof(char*));//分配n個字符編碼的頭指針向量
	if((fp1=fopen("HT","rb"))==NULL)
	{puts("can't open file \"HT.dat\" .");exit(0); }
	if((fp2=fopen("HC","rb"))==NULL)
	{puts("can't open file \"HC.dat\" .");exit(0); }
	fread(&HT,sizeof(HT),1,fp1);
	fread(&HC,sizeof(HC),1,fp2);
	fclose(fp1);fclose(fp2);
}

 void OutputHuffmanTree(HuffmanTree HT,int n,int m){//輸出HuffmanTree
	int i;
	puts("Huffman Tree:");
	printf("%d leaves %d HTNode :\n",n,m);
	puts("非葉節點的data域不是有效字符,不予輸出!");
	for(i=1;i<=m;i++)//非葉節點的data域不是有效字符,不予輸出
	{
		if(i<=n)printf("%d %c %d %d %d %d\t",HT[i].n,HT[i].data,HT[i].weight,HT[i].lchild,HT[i].parent,HT[i].rchild);
		else printf("%d %d %d %d %d\t",HT[i].n,HT[i].weight,HT[i].lchild,HT[i].parent,HT[i].rchild);
	}
	printf("\n");
}

void OutputHuffmanCode(HuffmanCode HC,int n){//輸出HuffmanCode
	int i;
	puts("Huffman Code:");
	for(i=1;i<=n;i++)
		printf("%c %s\n",HC[i].data,HC[i].Code);
    printf("\n");
}

 void MessageInput(Message M){//信息輸入
   char  s[1000]={'\0'};//輸入緩沖
   M[0]='\0';
   while(strlen(gets(s))>0)//提供多行信息輸入
   {
	   strcat(M,s);
	   strcat(M,"\n");
   }
}

void SaveMessageFile(Message M){//信息保存
   FILE  *fp;
   if((fp=fopen("Message.txt","w"))==NULL)
   {   printf("cann't open file");exit(0); }
   fputs(M,fp);
   fclose(fp);
}

void MessageFileOutput(Message M){//打開信息文件并輸出
   FILE*fp;
   char s[1000];
   M[0]='\0';
   puts("The message in the Message File is :");
   if((fp=fopen("Message.txt","r"))==NULL){printf("cann't open file");exit(0); }
   while(fgets(s,1000,fp)!=NULL){
      fputs(s,stdout);
	  strcat(M,s);
   }
   fclose(fp);
   printstar();
   puts("MessageSource we code is:");
   puts(M);
}

void MessageCoding(Message M,Message MD,HuffmanCode HC,int n){//信息編碼函數
    int i,k; 
	MD[0]='\0';
	for(i=0;M[i]!='\0';i++)
		for(k=1;k<=n;k++)
			if(M[i]==HC[k].data)strcat(MD,HC[k].Code);
}

void SaveMessageCode(Message MD){//信息編碼保存到文件
   FILE  *fp;
   if((fp=fopen("MessageCode.txt","w"))==NULL)
   {   printf("cann't open file");exit(0); }
   fputs(MD,fp);
   fclose(fp);
}

void OutputMessageCode(Message MD){//信息編碼輸出
   puts("MessageCode is:");
   puts(MD);
   printstar();
   strcat(MD,"#");//作為結束標志
}

 void MessageDecoding(Message MD,HuffmanTree HT){//信息解碼函數
   int i,root,r;
   for(i=1;HT[i].parent!=0;i++);//找根
   r=root=i;
   for(i=0;MD[i]!='#';){
	   while(HT[r].lchild&&HT[r].rchild){//0左走1右走,直到葉節點
		   if(MD[i]=='1')r=HT[r].rchild;
		   else r=HT[r].lchild;
		   i++;
	   }
	   putchar(HT[r].data);//輸出葉節點
	   r=root;
   }
   putchar('\n');
}

void welcome(){
	puts("-----------------HuffmanCoding---------------");
	puts("\t\t\t\tJS000603-060059-李建平");
}

 void main(){//主函數,安排流程。
	HuffmanTree HT;
	HuffmanCode HC;
	Wordset w;
	Message M,MD;
	int n=WordNUM,m,i; 
	m=2*n-1;//一棵有n個葉子結點的赫夫曼樹共有2n-1個結點
	printstar();
	welcome();
	printstar();
    
	//初始化
	for(i=0;i<5E8;i++);
	printstar();
	puts("初始化....");
	printstar();
	HT=(HuffmanTree)malloc((m+1)*sizeof(HTNode));//0號單元未用
	HC=(HuffmanCode)malloc((n+1)*sizeof(HCode));//分配n個字符編碼的頭指針向量
	w=(Wordset)malloc(sizeof(Word));//字符集及其權重所占空間分配
    MD=(Message)malloc(MessageNUM*sizeof(char));
	M=(Message)malloc(MessageNUM*sizeof(char));
	for(i=0;i<5E8;i++);
	puts("Init OK!");
	printstar();

	//字符集操作與保存
	puts("創建字符集和權重....");
	printstar();
	for(i=0;i<5E8;i++);
	CreatWordset(w);//創建字符集和權重
    puts("CreatWordset ok!");
	printstar();
	for(i=0;i<5E8;i++);
	puts("Saving to file....");
	printstar();
	for(i=0;i<5E8;i++);
	SaveWordsetFile(w);//保存到文件
	puts("save OK!");
	printstar();
	puts("reading from the wordset file...");
	printstar();
	for(i=0;i<5E8;i++);
	OpenWordsetFile(w);//讀文件
	puts("The wordset and each word's weight are:");
	printstar();
 	OutputWordset(w);//輸出
	printstar();

    //HuffmanTree和HuffmanCode的建立與保存
	puts("建立HuffmanTree....");
	printstar();
	for(i=0;i<5E8;i++);
    CreatHuffmanTree(HT, w);//建立HuffmanTree
	printstar();
	puts("建立HuffmanCode....");
	printstar();
	for(i=0;i<5E8;i++);
	CreatHuffmanCode(HT,HC,w);//建立HuffmanCode
	printstar();
	puts("寫入文件前輸出HuffmanTree和HuffmanCode....");//寫入文件前輸出
	printstar();
	for(i=0;i<5E8;i++);
	OutputHuffmanTree(HT,n,m);//輸出HuffmanTree
	printstar();
	for(i=0;i<5E8;i++);
    OutputHuffmanCode(HC,n);//輸出HuffmanCode
	printstar();
	puts("Saving to file....");
    printstar();
	for(i=0;i<5E8;i++);
	SaveHuffmanFile(HT,HC,n,m);//保存HuffmanTree和HuffmanCode到文件
	puts("save OK!");
	printstar();
    puts("從文件讀入后輸出HuffmanTree和HuffmanCode....");//讀入文件后輸出
	printstar();
	for(i=0;i<5E8;i++);
	OpenHuffmanFile(HT,HC);//打開HuffmanTree和HuffmanCode文件
	OutputHuffmanTree(HT,n,m);//輸出HuffmanTree
	printstar();
	for(i=0;i<5E8;i++);
    OutputHuffmanCode(HC,n);//輸出HuffmanCode
	printstar();
    
	do{//信息輸入及其編碼與解碼
		puts("please input the message you want to code....");
		printstar();
		MessageInput(M);//信息輸入
		printstar();
		puts("saving to file....");//保存信息至文件
		printstar();
	    for(i=0;i<5E8;i++);
        SaveMessageFile(M);
        puts("MessageSave OK!");
	    printstar();
		puts("信息從文件讀出并輸出....");
		printstar();
	    for(i=0;i<5E8;i++);
	    MessageFileOutput(M);//信息從文件讀出并輸出
	    printstar();
		puts("信息編碼....");
	    for(i=0;i<5E8;i++);
	    MessageCoding(M,MD,HC,n);//信息編碼
	    printstar();
		puts("saving to file....");
		printstar();
	    for(i=0;i<5E8;i++);
        SaveMessageCode(MD);
		puts("save OK!");
		printstar();
		puts("編碼輸出");
		printstar();
	    OutputMessageCode(MD);//編碼輸出
	    printstar();
		puts("信息解碼....");
		for(i=0;i<5E8;i++);
	    printf("The message after decoding is:\n");
		MessageDecoding(MD,HT);//解碼輸出
	    printstar();
		puts("源碼輸出對比....");
	    for(i=0;i<5E8;i++);
        puts("The MessageSource is:");
        puts(M);//源碼輸出對比
		printstar();
		printf("Try again?");
	}while(UserSaysYes());//提供重復進行信息輸入
}//main

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲成人动漫av| 日韩精品三区四区| 亚洲图片欧美视频| 国产在线精品一区二区不卡了 | 调教+趴+乳夹+国产+精品| 精品在线播放免费| 91福利小视频| 中文字幕乱码亚洲精品一区| 美女性感视频久久| 欧美三级电影网| 亚洲天堂成人网| 国产91丝袜在线播放九色| 欧美一区二区三区日韩| 亚洲免费观看高清完整版在线观看 | 欧美午夜电影网| 亚洲国产精品t66y| 日本一不卡视频| 欧美性色黄大片| 亚洲男人的天堂一区二区| 国产99精品在线观看| 精品久久久久久无| 裸体在线国模精品偷拍| 51久久夜色精品国产麻豆| 一区二区三区加勒比av| 91麻豆免费视频| 国产精品国产三级国产普通话蜜臀| 九九精品视频在线看| 日韩三级高清在线| 久久91精品久久久久久秒播| 日韩欧美国产综合在线一区二区三区 | 香蕉成人伊视频在线观看| 色系网站成人免费| 亚洲激情图片一区| 91国产免费观看| 亚洲国产中文字幕在线视频综合| 99精品久久久久久| 一区二区在线看| 精品视频免费在线| 日韩成人dvd| 欧美大肚乱孕交hd孕妇| 国产一区二区三区四区在线观看| 欧美xxxxxxxxx| 国产一区二区精品久久| 国产欧美日韩综合| 99久久久久久| 亚洲国产精品久久人人爱蜜臀| 欧美日韩一区二区不卡| 蜜臀国产一区二区三区在线播放| 日韩精品一区二区三区中文精品 | 色菇凉天天综合网| 亚洲国产wwwccc36天堂| 日韩欧美一级在线播放| 国产成人在线看| 亚洲免费成人av| 欧美日韩高清影院| 狠狠色丁香久久婷婷综| 国产精品亲子伦对白| 日本二三区不卡| 免费久久精品视频| 国产精品视频一区二区三区不卡| 91网站在线观看视频| 偷拍自拍另类欧美| 久久久久久免费网| 在线免费不卡电影| 久草在线在线精品观看| 日韩一区在线看| 在线播放欧美女士性生活| 国产精品一区免费视频| 一区二区在线观看视频| 日韩一区二区三区在线| 成人精品鲁一区一区二区| 亚欧色一区w666天堂| 欧美国产一区二区| 欧美日韩国产成人在线免费| 国产·精品毛片| 日韩和的一区二区| 中文字幕精品综合| 日韩一区二区免费电影| 91丨九色丨国产丨porny| 看片的网站亚洲| 亚洲自拍欧美精品| 国产三区在线成人av| 欧美精品xxxxbbbb| 成人app软件下载大全免费| 日本sm残虐另类| 亚洲男同1069视频| 中文无字幕一区二区三区 | 久久精品久久精品| 亚洲靠逼com| 欧美激情中文字幕一区二区| 91麻豆精品国产无毒不卡在线观看| 成人夜色视频网站在线观看| 蜜桃视频第一区免费观看| 亚洲日本在线看| 中文av一区特黄| 五月婷婷欧美视频| 亚洲日本一区二区| 国产亚洲午夜高清国产拍精品| 91超碰这里只有精品国产| 日本道色综合久久| 99re视频这里只有精品| 成人综合在线观看| 国产一区二区三区四区五区美女| 日韩精品欧美精品| 日韩精品国产精品| 日韩高清电影一区| 婷婷成人综合网| 天堂久久久久va久久久久| 夜夜亚洲天天久久| 亚洲一区视频在线| 亚洲精品美国一| 亚洲精品久久嫩草网站秘色| 国产精品久久福利| 国产精品伦一区| 国产日韩欧美精品在线| 久久久99精品久久| 国产清纯白嫩初高生在线观看91| 久久午夜老司机| 久久天堂av综合合色蜜桃网| 26uuu色噜噜精品一区| 久久亚洲影视婷婷| 国产调教视频一区| 国产三级欧美三级| 日韩一区有码在线| 一级精品视频在线观看宜春院 | 久久精品视频一区| 久久久久久电影| 中文一区二区在线观看| 美女视频黄 久久| 国产一区二区伦理| 成人黄色国产精品网站大全在线免费观看| 国产成人免费9x9x人网站视频| 国产精品1区二区.| av中文字幕亚洲| 在线一区二区三区做爰视频网站| 欧美亚男人的天堂| 日韩欧美电影一二三| 国产亚洲午夜高清国产拍精品| 中文字幕中文字幕一区二区| 亚洲精品日韩专区silk| 热久久国产精品| 国产激情一区二区三区四区| 99久久久久久| 678五月天丁香亚洲综合网| 久久综合久久综合九色| 国产精品高潮呻吟| 视频一区免费在线观看| 黄色日韩网站视频| 91免费国产在线观看| 欧美一区二区成人6969| 国产精品久久福利| 日韩精品一二三| 成人爱爱电影网址| 欧美电影影音先锋| 亚洲国产高清在线观看视频| 亚洲成人你懂的| 国产成人亚洲综合色影视| 欧美性猛交xxxx黑人交| 国产亚洲污的网站| 午夜精品福利一区二区蜜股av | 精品制服美女丁香| 91网上在线视频| 精品成人私密视频| 一区二区三区成人在线视频| 老司机午夜精品99久久| 在线观看日韩一区| 久久久久久综合| 三级欧美韩日大片在线看| 成人在线视频一区| 欧美变态tickle挠乳网站| 一区二区三区不卡在线观看| 国产一区二区女| 日韩女优视频免费观看| 亚洲高清免费观看| www.性欧美| 久久精品视频免费| 久久超级碰视频| 欧美另类videos死尸| 亚洲免费成人av| 99re这里都是精品| 日本一区二区视频在线| 久久91精品久久久久久秒播| 欧美美女一区二区三区| 一区二区三区四区乱视频| 成人免费va视频| 久久精品人人做人人爽97 | 日韩精品亚洲一区二区三区免费| 91丨porny丨在线| 国产精品欧美综合在线| 国产成人av一区| 久久久久国产免费免费| 欧美a级一区二区| 884aa四虎影成人精品一区| 亚洲国产精品尤物yw在线观看| 99国产精品久久| 亚洲欧洲一区二区在线播放| 波多野结衣精品在线| 国产精品久久久久久久岛一牛影视 | 99re免费视频精品全部| 国产精品天美传媒沈樵|