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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? huffman.cpp

?? 關(guān)于哈弗曼樹的編碼譯碼
?? CPP
字號:
#include<stdio.h>
#include<malloc.h>
#include<string.h>
#define CL 16          //編碼的長度
#define NULL 0
#define N 50          //用于存儲基本字符集的字符數(shù)組的長度
#define TL 50         //電文長度
typedef struct
{
	unsigned int weight;
	unsigned int parent,lchild,rchild;
	char date;
}HTNode,*HuffmanTree;
typedef char**HuffmanCode;

void Select(HuffmanTree &HT,unsigned n,int&s1,int&s2)
{// 在HT[1..i-1]中選擇parent為0且weight最小的兩個結(jié)點
	int min=-1;
	for(unsigned i=1;i<=n;i++)
	{
		if(min<0&&HT[i].parent==0){min=HT[i].weight;s1=i;}
		else if(min>HT[i].weight&&HT[i].parent==0){min=HT[i].weight;s1=i;}
	}
	min=-1;
	for(unsigned j=1;j<=n;j++)
	{
		if(min<0&&HT[j].parent==0&&j!=s1){min=HT[j].weight;s2=j;}
		else if(min>HT[j].weight&&HT[j].parent==0&&j!=s1){min=HT[j].weight;s2=j;}
	}
}

void InitHfmTree() 
{ // w存放n個字符的權(quán)值(均>0),構(gòu)造哈夫曼樹HT, 并求出n個字符的哈夫曼編碼HC
  FILE*fp;
  HuffmanTree HT;
  int n,i,j,s1,s2,root,w[N];   
  char str[N],ch;	
  printf("請輸入字符總數(shù):\n");
  scanf("%d",&n);
  ch=getchar();  //接收執(zhí)行scanf時最后輸入的回車
  root=2*n-1;
  printf("請輸入字符串:\n");
  gets(str);
  printf("請依次輸入權(quán)值:\n");
	for(i=0;i<n;i++)
	{
		scanf("%d",&w[i]);
		ch=getchar();  //接收執(zhí)行scanf時最后輸入的回車
	}
  if(n<=1)return;
  root=2*n-1;
  HT=(HuffmanTree)malloc((root+1)*sizeof(HTNode));  // 0號單元未用
  for (i=1; i<=n; i++) 
  { //初始化
    HT[i].weight=w[i-1];
    HT[i].parent=0;
    HT[i].lchild=0;
    HT[i].rchild=0;
	HT[i].date=str[i-1];
  }
  for (i=n+1; i<=root; i++)
  { //初始化
    HT[i].weight=0;
    HT[i].parent=0;
    HT[i].lchild=0;
    HT[i].rchild=0;
	HT[i].date=14;
  }
  printf("\n哈夫曼樹的構(gòu)造過程如下所示:\n");
  printf("HT初態(tài):\n  結(jié)點  weight  parent  lchild  rchild   date");
  for (i=1; i<=root; i++)
    printf("\n%4d%8d%8d%8d%8d%8c",i,HT[i].weight,HT[i].parent,HT[i].lchild, HT[i].rchild,HT[i].date);
    printf("    按任意鍵,繼續(xù) ...");
  ch=getchar();
  for (i=n+1; i<=root; ++i) 
  {  // 建哈夫曼樹
    Select(HT, i-1, s1, s2);// 在HT[1..i-1]中選擇parent為0且weight最小的兩個結(jié)點,其序號分別為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("\nselect: s1=%d   s2=%d\n", s1, s2);
    printf("  結(jié)點  weight  parent  lchild  rchild   date");
    for (j=1; j<=i; j++)
      printf("\n%4d%8d%8d%8d%8d%8c",j,HT[j].weight,HT[j].parent,HT[j].lchild, HT[j].rchild,HT[j].date);
    printf("    按任意鍵,繼續(xù) ...");//程序執(zhí)行暫停
    ch=getchar();
  }
  //---建立文件hfmTree并將哈弗曼樹存入文件---
	if((fp=fopen("htmTree","wb"))==NULL)
	{printf("CANNOT OPEN FILE!\n");return;}
	for(i=1;i<=root;i++)
		if(fwrite(&HT[i],sizeof(HTNode),1,fp)!=1)printf("FILE WRITE ERROR!\n");
	fclose(fp);
	printf("*********哈弗曼樹已存入文件htmTree*********\n");
	free(HT);
} //  HuffmanTree
void EnCoding()//編碼函數(shù)
{ //對電文tbt進行編碼并存儲到文件CodeFile中
	FILE*fp;
	char *cd,TBT[TL];
	int  start,root=0,n,tbl;
	unsigned int i,flag=0,c,f;
	HuffmanTree HT;
	HuffmanCode hc,HC;
	HT=(HuffmanTree)malloc((2*N-1)*sizeof(HTNode));
	hc=(HuffmanCode)malloc(TL*sizeof(char*));
	HC=(HuffmanCode)malloc(N*sizeof(char*));
	//---從文件hfmTree讀取哈弗曼樹---
	if((fp=fopen("htmTree","rb"))==NULL)
	{printf("CANNOT OPEN FILE!\n");return;}
	flag=fread(&HT[root+1],sizeof(HTNode),1,fp);
	while(flag==1)
	{
		root++;
		flag=fread(&HT[root+1],sizeof(HTNode),1,fp);	
	}
	fclose(fp);
	//--- 從葉子到根逆向求每個字符的哈夫曼編碼 ---
	n=(root+1)/2;
	HC=(HuffmanCode)malloc((n+1)*sizeof(char*));
	cd = (char *)malloc(n*sizeof(char));    // 分配求編碼的工作空間
	cd[n-1] = '\0';                         // 編碼結(jié)束符。
	for (i=1; i<=n; ++i)                    // 逐個字符求哈夫曼編碼
	{                  
		start = n-1;                          // 編碼結(jié)束符位置
		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
	}	
	free(cd);// 釋放工作空間	
	printf("請輸入電文:\n");
	gets(TBT);
	for(tbl=0;TBT[tbl]!=NULL;tbl++)
	{
		i=1;
		while(TBT[tbl]!=HT[i].date&&TBT[tbl]!=NULL&&HT[i].date!=NULL)i++;
		if(TBT[tbl]==HT[i].date){hc[tbl]=(char*)malloc(CL*sizeof(char));strcpy(hc[tbl],HC[i]);}
		else hc[tbl]=NULL;
	}
	printf("電文編碼如下:\n");
	for(i=0;i<tbl;i++)printf("%s ",hc[i]);
	printf("\n");
	//---建立文件codeFile并將電文編碼存入文件---
	if((fp=fopen("codeFile","wb"))==NULL)
	{printf("CANNOT OPEN FILE!\n");return;}
	for(i=0;i<tbl;i++)
		if(fwrite(hc[i],CL*sizeof(char),1,fp)!=1)printf("FILE WRITE ERROR!\n");
	fclose(fp);
	free(HT);
	free(HC);
	free(hc);	
}//EnCoding
void DeCoding()//譯碼函數(shù)
{
	FILE*fp;
	char TBT[TL];
	int tbl=0,flag=0,root=0;
	HuffmanTree HT=(HuffmanTree)malloc((2*N-1)*sizeof(HTNode));
	HuffmanCode hc=(HuffmanCode)malloc(TL*sizeof(char*));;
	unsigned i,m;
	//---從文件hfmTree讀取哈弗曼樹---
	if((fp=fopen("htmTree","rb"))==NULL)
	{printf("CANNOT OPEN FILE!\n");return;}
	flag=fread(&HT[root+1],sizeof(HTNode),1,fp);
	while(flag==1)
	{
		root++;
		flag=fread(&HT[root+1],sizeof(HTNode),1,fp);	
	}
	fclose(fp);
	//---從文件codeFile讀取電文編碼---
	if((fp=fopen("codeFile","rb"))==NULL)
	{printf("CANNOT OPEN FILE!\n");return;}	
	hc[tbl]=(char*)malloc(CL*sizeof(char));
	flag=fread(hc[tbl],CL*sizeof(char),1,fp);
	while(flag==1)
	{
		tbl++;
		hc[tbl]=(char*)malloc(CL*sizeof(char));
		flag=fread(hc[tbl],CL*sizeof(char),1,fp);
	}
	fclose(fp);
	printf("電文如下:\n");
	for(i=0;i<tbl;i++)
	{	
		m=root;
		int j=0;
		while(HT[m].lchild!=0&&HT[m].rchild!=0&&hc[i][j]!=NULL)
		{
			if(hc[i][j]=='0'){m=HT[m].lchild;j++;}
			else if(hc[i][j]=='1'){m=HT[m].rchild;j++;}
			else {printf("ERROR!\n");break;}
		}
		TBT[i]=HT[m].date;
	};
	TBT[tbl]=NULL;
	//建立文件textFile并將譯碼結(jié)果存入文件
	if((fp=fopen("textFile","wb"))==NULL)
	{printf("CANNOT OPEN FILE!\n");return;}
	for(i=0;i<tbl;i++)
		if(fwrite(&TBT[i],sizeof(char),1,fp)!=1)printf("FILE WRITE ERROR!\n");
	fclose(fp);
	printf("%s\n",TBT);
}//DeCoding
void Print()//以緊湊格式輸出
{
	FILE*fp;
	HuffmanCode hc=(HuffmanCode)malloc(TL*sizeof(char*));
	int tbl=0,flag=0;
	char str[TL*CL];
	//---從文件codeFile讀取電文編碼---
	if((fp=fopen("codeFile","rb"))==NULL)
	{printf("CANNOT OPEN FILE!\n");return;}	
	hc[tbl]=(char*)malloc(CL*sizeof(char));
	flag=fread(hc[tbl],CL*sizeof(char),1,fp);
	while(flag==1)
	{
		tbl++;
		hc[tbl]=(char*)malloc(CL*sizeof(char));
		flag=fread(hc[tbl],CL*sizeof(char),1,fp);
	}
	fclose(fp);
	strcpy(str,hc[0]);
	for(unsigned i=1;i<tbl;i++)strcpy(str,strcat(str,hc[i]));
	printf("緊湊格式的電文編碼如下:\n");
	for(i=0;str[i]!=NULL;i++)
	{
		printf("%c",str[i]);
		if((i+1)%50==0)printf("\n");
	}
	printf("\n");
	//---建立文件codePrin并將緊湊格式編碼寫入文件---
	if((fp=fopen("codePrin","wb"))==NULL)
	{printf("CANNOT OPEN FILE!\n");return;}
	if(fwrite(str,strlen(str),1,fp)!=1)printf("FILE WRITE ERROR!");
	fclose(fp);
}//Print
void PrintTree()//以凹入表示法輸出
{
	FILE*fp;
	char type,ch=2,**str;
	int flag=0,root=0,level[2*N-1][2],top,n,i,j=0,l,width=4;
	HuffmanTree stack,HT=(HuffmanTree)malloc((2*N-1)*sizeof(HTNode));
	HTNode p;
	HT[0].weight=-1;
	//---從文件hfmTree讀取哈弗曼樹---
	if((fp=fopen("htmTree","rb"))==NULL)
	{printf("CANNOT OPEN FILE!\n");return;}
	flag=fread(&HT[root+1],sizeof(HTNode),1,fp);
	while(flag==1)
	{
		root++;
		flag=fread(&HT[root+1],sizeof(HTNode),1,fp);	
	}
	fclose(fp);
	//------------------------------
	str=(char**)malloc(root*sizeof(char*));
	stack=(HuffmanTree)malloc(root*sizeof(HTNode));
	top=1;
	stack[top]=HT[root];
	level[top][0]=0;
	level[top][1]=2;
	while(top>0)
	{
		l=0;
		str[j]=(char*)malloc(100*sizeof(char));
		p=stack[top];
		n=level[top][0];
		switch(level[top][1])
		{
		case 0:type='0';break;//左節(jié)點之前輸出(0)
		case 1:type='1';break;//右節(jié)點之前輸出(1)
		case 2:type='r';break;//根節(jié)點之前輸出(r)
		}
		//把凹入表示法表示的一行存入一個字符串
		for(i=1;i<=n;i++)str[j][l++]=' ';
		str[j][l++]=p.date;str[j][l++]='(';str[j][l++]=type;str[j][l++]=')';
		for(i=n;i<=root;i++)str[j][l++]=ch;
		str[j][l++]='\0';
		top--;
		if(HT[p.rchild].weight!=-1)
		{
			top++;
			stack[top]=HT[p.rchild];
			level[top][0]=n+width;
			level[top][1]=1;
		}
		if(HT[p.lchild].weight!=-1)
		{
			top++;
			stack[top]=HT[p.lchild];
			level[top][0]=n+width;
			level[top][1]=0;
		}
		j++;
	}
	printf("凹入表示法表示的哈弗曼樹如下:\n");
	for(i=0;i<root;i++)printf("%s\n",str[i]);
	//---建立文件treePrint并將凹入表示法表示的哈弗曼樹寫入文件---
	if((fp=fopen("treePrint","wb"))==NULL)
	{printf("CANNOT OPEN FILE!\n");return;}
	for(i=0;i<root;i++)
		if(fwrite(str[i],strlen(str[i]),1,fp)!=1)printf("FILE WRITE ERROR!");
	fclose(fp);
}//PrintTree
int main()
{
	bool s=1;
	char sw,ch;
	while(s)
	{	
		printf("請選擇操作:\n1:初始化'i'\n2:編碼'e'\n3:譯碼'd'\n4:印代碼'p'\n5:凹入表輸出't'\n6:退出程序'q'\n");
		scanf("%c",&sw);
		ch=getchar(); 
		switch(sw)
		{
		case'i':InitHfmTree();printf("初始化完畢\n");break;
		case'e':EnCoding();printf("編碼完畢\n");break;
		case'd':DeCoding();printf("譯碼完畢\n");break;
		case'p':Print();printf("印代碼完畢\n");break;
		case't':PrintTree();printf("凹入表輸出完畢\n");break;
		case'q':s=0;break;
		default:printf("輸入錯誤!");break;
		}
	}
}


?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
99久久免费视频.com| 蜜臀久久久久久久| youjizz久久| 亚洲欧洲性图库| 波多野结衣中文一区| 中文字幕一区三区| 色综合久久中文字幕| 福利电影一区二区| 亚洲人成网站精品片在线观看| 99re8在线精品视频免费播放| 亚洲视频在线一区| 欧美性生活大片视频| 蜜臀久久99精品久久久画质超高清 | 欧美狂野另类xxxxoooo| 日韩精品一卡二卡三卡四卡无卡| 日韩三级精品电影久久久 | 美女视频一区在线观看| 精品国产免费一区二区三区香蕉| 国产久卡久卡久卡久卡视频精品| 中文字幕一区二区三| 在线亚洲免费视频| 男女男精品视频网| 欧美激情在线一区二区三区| 在线日韩一区二区| 久久精品av麻豆的观看方式| 中文字幕一区二区三区色视频| 欧美视频一区二区三区在线观看| 麻豆91精品91久久久的内涵| 国产精品久久久久久久岛一牛影视 | 亚洲美腿欧美偷拍| 欧美一区二区私人影院日本| 国产九色精品成人porny| 一区二区三区欧美| 2020日本不卡一区二区视频| 色欧美88888久久久久久影院| 美美哒免费高清在线观看视频一区二区| 国产丝袜在线精品| 宅男在线国产精品| 91碰在线视频| 精品在线视频一区| 亚洲午夜国产一区99re久久| 久久品道一品道久久精品| 欧美日韩你懂得| 成人精品视频一区| 蜜臀av国产精品久久久久| 亚洲欧美国产三级| 国产日产欧美精品一区二区三区| 在线不卡欧美精品一区二区三区| 成人久久18免费网站麻豆| 麻豆91在线播放| 午夜日韩在线电影| 国产高清久久久久| 日韩一区精品字幕| 一区二区三区日韩欧美精品| 国产婷婷精品av在线| 日韩一区二区三区视频| 色噜噜狠狠成人中文综合| 国产成人综合亚洲91猫咪| 五月激情六月综合| 亚洲精品你懂的| 国产精品美女久久久久高潮| 精品久久久久久久久久久久包黑料| 91视频免费观看| 国产成人精品1024| 狠狠狠色丁香婷婷综合激情 | 亚洲宅男天堂在线观看无病毒| 久久女同精品一区二区| 91精品国产91综合久久蜜臀| 欧美亚洲国产一区在线观看网站 | 日韩中文字幕91| 亚洲一区二区三区精品在线| 亚洲私人黄色宅男| 国产精品久99| 亚洲国产经典视频| 国产欧美日产一区| 国产日本欧美一区二区| 精品国产一区久久| 欧美mv日韩mv亚洲| 2023国产精品自拍| 久久久久久**毛片大全| 日韩欧美第一区| 久久在线免费观看| 国产日韩欧美在线一区| 中文字幕免费不卡在线| 国产拍揄自揄精品视频麻豆| 国产婷婷精品av在线| 国产精品免费网站在线观看| 亚洲国产精华液网站w| 日韩一区中文字幕| 亚洲精品自拍动漫在线| 亚洲一区二区三区爽爽爽爽爽| 亚洲丰满少妇videoshd| 日韩精品福利网| 狠狠网亚洲精品| 成人午夜电影网站| 色综合中文字幕国产 | 狠狠色狠狠色综合| 国产精品白丝jk黑袜喷水| 丁香婷婷综合激情五月色| 不卡一区二区三区四区| 日本精品视频一区二区| 欧美三区在线观看| 日韩欧美中文一区| 久久久国产综合精品女国产盗摄| 国产丝袜欧美中文另类| 亚洲欧美日韩国产综合| 天天av天天翘天天综合网色鬼国产| 天天射综合影视| 国产精品正在播放| eeuss鲁片一区二区三区在线看| 在线亚洲欧美专区二区| 亚洲成精国产精品女| 美女在线视频一区| 成人精品鲁一区一区二区| 欧美优质美女网站| 欧美成人vps| 亚洲欧美日韩系列| 美女视频一区在线观看| www.性欧美| 91麻豆精品国产91久久久更新时间| 国产日韩欧美在线一区| 亚洲一区在线观看免费 | 亚洲国产综合色| 精品一区二区在线观看| 91亚洲精品久久久蜜桃| 日韩一二三区不卡| 亚洲视频一区二区免费在线观看| 男男视频亚洲欧美| 91日韩一区二区三区| 久久综合九色综合欧美就去吻 | 亚洲一区二区美女| 国产精品18久久久久久久久| 在线一区二区三区| 欧美国产精品一区二区三区| 亚洲成人三级小说| 不卡高清视频专区| 久久综合色鬼综合色| 午夜亚洲国产au精品一区二区| 国产精品99久久久久久有的能看| 欧美精品一级二级| 成人免费在线播放视频| 国产一区在线视频| 欧美一区二区三区婷婷月色| 亚洲欧美日韩国产手机在线 | 成人开心网精品视频| 精品免费一区二区三区| 亚洲成人动漫在线免费观看| 成人app在线| 国产校园另类小说区| 日本91福利区| 欧美区视频在线观看| 亚洲综合一区二区三区| 99久久久免费精品国产一区二区| 欧美精品一区二区久久久| 婷婷综合久久一区二区三区| 色综合久久综合| 亚洲视频你懂的| 99精品国产一区二区三区不卡| 国产女同互慰高潮91漫画| 国产一区二区三区最好精华液| 91精品国产乱码久久蜜臀| 亚洲一二三区不卡| 在线中文字幕不卡| 一区二区三区在线观看国产| av成人动漫在线观看| 亚洲欧洲精品一区二区三区| 成人性色生活片免费看爆迷你毛片| 欧美mv和日韩mv国产网站| 欧美aaaaa成人免费观看视频| 在线不卡一区二区| 日韩国产一区二| 欧美一级精品在线| 久久超级碰视频| 欧美成人精精品一区二区频| 久久se这里有精品| 2021久久国产精品不只是精品| 国产精品资源站在线| 国产欧美视频一区二区| 国产ts人妖一区二区| 中文字幕一区二区三区在线不卡| 成人激情文学综合网| 亚洲视频精选在线| 欧美日韩一本到| 欧美中文一区二区三区| 亚洲国产精品久久久久婷婷884 | 国产成a人无v码亚洲福利| 欧美国产日韩a欧美在线观看| 成人黄色在线网站| 亚洲精品日韩一| 欧美乱妇20p| 精品一区二区三区日韩| 久久久精品人体av艺术| 97久久精品人人做人人爽50路| 亚洲你懂的在线视频| 欧美精品在线一区二区三区| 韩国一区二区三区| 国产精品视频一二三区| 日本久久电影网| 久久爱www久久做| 亚洲欧美在线视频观看|