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

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

?? 哈弗曼樹.cpp

?? 用哈弗曼樹實現實現對文件的編碼與譯碼
?? CPP
字號:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define M 10000    //定義字符串最大長度
#define N 128        //定義葉子節點個數


typedef struct node              //定義哈夫曼樹節點結構體
{
	int weight;
	struct node *LChild,*RChild,*Parent;  //分別指向該節點的左孩子,右孩子,和雙親節點
	struct node *next;                    //指向建立的哈夫曼樹的下一個節點
}HFMNode,*HFMTree;


typedef struct                   //定義哈夫曼編碼的結構體
{
	char ch;                      //存儲對應的字符
	char code[N+1];                //存儲對應字符的編碼
	int start;                     //存儲編碼的起始位置
}CodeNode;

int n;               //存儲真正葉子節點個數



void clearscreen()
{
system("cls");
}


void Open(char s[])               //打開存放字符或編碼的文件,將其存入字符串數組中
{
	char name[10];
	FILE *fp;
	int i=0;
	printf("請輸入要打開的文件名:");
	gets(name);                               //要打開的文件名
	if((fp=fopen(name,"rt"))==NULL)
		{
			printf("打開失敗!\n");             //若打開失敗,則直接退出
			exit(1);
		}
	s[i++]=fgetc(fp);
	while(s[i-1]!=EOF)
		s[i++]=fgetc(fp);
	s[i]='\0';                           //存取字符串結束
	fclose(fp);
}


void Save(char s[])                        //保存字符或編碼到文件中
{
	char name[10];
	FILE *fp;
	printf("請輸入要保存的文件名:");
	gets(name);
	if((fp=fopen(name,"wt"))==NULL)
		{
			printf("存儲失敗!");
			exit(1);
		}
	fputs(s,fp);
	printf("\n保存成功,文件名為:%s。\n",name);
	printf("\n按回車鍵繼續...");
	getchar();
	fclose(fp);

}




void SearchStr(char s[],char str[],int count[])  
{
	//查找字符串中字符的個數和每個字符出現的次數
	int i,j,k=0;
	for(i=0;i<N;i++)    //初始化每個字符出現的次數
		count[i]=0;
	for(i=0;s[i];i++)
		{
			for(j=0;j<k;j++)            //在str[]中查找是否有該字符
				if(str[j]==s[i])
					{
						count[j]++;
						break;
					}
			if(j==k)                     //在str[]中無該字符,將其存入最后一個單元
				{
					str[k]=s[i];
					count[k++]++;
				}
		}
	str[k]='\0';                  //將字符串結尾置\0
	n=k;                            //將實際的字符個數作為葉子節點個數存入n
}

void SelectMin(HFMTree HT,int k,HFMTree *HT1,HFMTree *HT2)
{
	//查找哈夫曼鏈表中兩個權值最小的節點
	int i,min;
	HFMTree p;
	min=32767;
	for(i=0,p=HT;i<k;i++,p=p->next)
		if(p->weight<min&&p->Parent==0)
			{
				min=p->weight;
				*HT1=p;
			}
	min=32767;
	for(i=0,p=HT;i<k;i++,p=p->next)
		if(p->weight<min&&p->Parent==0&&p!=*HT1)  //令第二個最小的節點不等于第一個節點
			{
				min=p->weight;
				*HT2=p;
			}
	
}



void CreatHFMTree(HFMTree *HT,int count[])
{
	//創建哈夫曼樹
	int i;
	HFMTree p,HT1,HT2;   //HT1,HT2分別存放權值最小和次小的節點的位置
	p=*HT=(HFMTree)malloc(sizeof(HFMNode));
	p->next=p->LChild=p->RChild=p->Parent=NULL;  //初始化哈夫曼鏈表且有2n-1個節點
	for(i=1;i<2*n-1;i++)
		{
			p->next=(HFMTree)malloc(sizeof(HFMNode));
			p=p->next;
			p->next=p->LChild=p->RChild=p->Parent=NULL;
		}

	for(i=0,p=*HT;i<n;i++)                //將各個字符出現的次數作為權值
	{		                             //存入哈夫曼鏈表的前n個單元中
			p->weight=count[i];
			p=p->next;
		}

	for(i=n;i<2*n-1;i++)                 //將后n-1個節點賦權值,建樹
		{
			SelectMin(*HT,i,&HT1,&HT2);  //每次從前i個節點中選取權值最小的兩個節點
			HT1->Parent=HT2->Parent=p;    
			p->LChild=HT1;
			p->RChild=HT2;
			p->weight=HT1->weight+HT2->weight;  //將兩個節點的權值相加存入最后一個節點中
			p=p->next;                            //p指向下一個沒有存儲權值的節點
		}

}


void HFMCode(HFMTree HT,CodeNode HC[],char str[])
{
	//從每個葉子節點開始,利用哈夫曼樹對每個字符進行編碼,最終建立一個哈夫曼表
	int i;
	HFMTree q,p=HT;
	for(i=0;i<n;i++)             //將字符存入哈夫曼編碼結構體數組的字符單元中
		{
			HC[i].ch=str[i];
			HC[i].code[n-1]='\0';  //初始化編碼的最后一位
		}
	for(i=0;i<n;i++)
		{
			HC[i].start=n-1;
			for(q=p;q->Parent;q=q->Parent)   //判斷q所指向的節點,左孩子置0,右孩子置1
				if(q==q->Parent->LChild)
					HC[i].code[--HC[i].start]='0';
				else	HC[i].code[--HC[i].start]='1';
			p=p->next;                   //判斷下一個葉子節點
		}


}



void TotalCoding(char s[],CodeNode HC[],char code[])
{
	//利用哈夫曼編碼表對整個字符串進行編碼
	int i,j;
	code[0]='\0';            //編碼數組初始化
	for(i=0;s[i];i++)                 //將每個字符在哈夫曼編碼表中對應的編碼存入存放總編碼的數組中
		for(j=0;j<n;j++)
		if(s[i]==HC[j].ch)
			strcpy(code+strlen(code),HC[j].code+HC[j].start);
}

void DeCoding(char code[],HFMTree HT,char str[],char s[])
{
	//對哈夫曼編碼進行解碼,放入字符串s中
	int i,j,k=0;
	HFMTree root,p,q;
	for(root=HT;root->Parent;root=root->Parent); //用root指向哈夫曼樹的根結點
	for(i=0,p=root;code[i];i++)            //從根結點開始按編碼順序訪問樹
	{                                      
			if(code[i]=='0')
				p=p->LChild;
			else	p=p->RChild;
			if(p->LChild==NULL&&p->RChild==NULL) //到根節點時將該節點對應的字符輸出
				{
					for(j=0,q=HT;q!=p;q=q->next,j++);
						s[k++]=str[j];
					p=root;                  //回溯到根結點
				}	
		}
	s[k]='\0';                //解碼完畢,在字符串最后一個單元存入'\0'
}


void Coding(char s[],char str[],char code[],int count[],HFMTree *HT,CodeNode HC[])
{
	clearscreen();
	printf("\n打開存放字符串的文件...\n\n");
	Open(s);                    //打開源碼文件
	SearchStr(s,str,count);  //查找字符串中不同的字符及其出現的次數
	CreatHFMTree(HT,count); //用每個字符出現的次數作為葉子節點的權值建立哈夫曼樹
	HFMCode(*HT,HC,str);      //利用哈夫曼樹對每個葉子節點進行編碼,存入編碼表中
	TotalCoding(s,HC,code); //利用編碼表對字符串進行最終編碼
	printf("\n讀入的字符串為:\n");
	puts(s);
	printf("\n最終的哈夫曼編碼是:\n");
	puts(code);
	printf("\n保存編碼,");
	Save(code);                 //保存最終的哈夫曼編碼
}


void TransCode(char code[],char str[],char ss[],HFMTree *HT,CodeNode HC[])
{
	clearscreen();
	printf("\n打開編碼的文件...\n\n");
	Open(code);                           //打開編碼文件
	DeCoding(code,*HT,str,ss);  //將編碼進行解碼存入字符串數組ss[]中
	printf("\n得到的最終字符串為:\n");
	puts(ss);
	printf("\n保存譯碼,");
	Save(ss);                        //保存譯碼后的字符串
}

void main()
{
	//主函數
	char s[M],ss[M];         //定義字符串數組,s[]存放將要編碼的字符串,ss[]存解碼后的字符串
	char str[N];             //存放輸入的字符串中n個不同的字符
	int count[N];            //存放n個不同字符對應的在原字符串中出現的次數
	char code[M];            //存放最終編碼完成后的編碼
	char choice;
	HFMTree HT;              //定義一個哈夫曼樹的鏈表
	CodeNode HC[N];          //定義一個哈夫曼編碼表的數組,存放每個字符對應的哈夫曼編碼
	do
	{
		clearscreen();
		printf("\n\n");
		printf("                       ************哈夫曼樹************\n");
		printf("                       **                            **\n");
		printf("                       **        1.編碼。            **\n");
		printf("                       **        2.譯碼。            **\n");
		printf("                       **        0.退出。            **\n");
		printf("                       **                            **\n");
		printf("                       **                            **\n");
		printf("                       **                            **\n");
		printf("                       ** 請輸入相應操作的序號(0-2)  **\n");
		printf("                       ********************************\n");
		scanf("%c",&choice);
		getchar();
		switch(choice)
		{
			case '1': Coding(s,str,code,count,&HT,HC);break; //對字符串進行編碼
			case '2': TransCode(code,str,ss,&HT,HC);break;  //對編碼進行解碼
			case '0': break;
			default : printf(" 輸入錯誤!請重新輸入!\n");
		}
	}while(choice!='0');
	
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
在线不卡中文字幕| 97se亚洲国产综合自在线不卡| 午夜激情久久久| 亚洲精品国产无套在线观| 国产精品久久久久桃色tv| 国产欧美一区二区在线观看| 国产亚洲成av人在线观看导航 | 亚洲一区国产视频| 伊人开心综合网| 亚洲永久精品国产| 美女在线一区二区| 黄色日韩三级电影| 岛国精品一区二区| 色94色欧美sute亚洲线路二| 欧美日韩视频在线观看一区二区三区| 日本精品视频一区二区三区| 欧美久久久久久蜜桃| 欧美精品一区二区三区久久久| 精品国产乱码久久久久久夜甘婷婷 | 日本中文在线一区| 国内精品第一页| 97成人超碰视| 日韩你懂的在线观看| 久久久噜噜噜久久中文字幕色伊伊| 国产精品亲子乱子伦xxxx裸| 亚洲狠狠丁香婷婷综合久久久| 亚洲二区在线观看| 国产精品99久久久久| 91老师片黄在线观看| 91精品国产综合久久久久久久| 2024国产精品| 亚洲最大成人综合| 欧美国产精品一区二区| 日韩中文字幕91| 视频一区二区中文字幕| 91国偷自产一区二区使用方法| 在线看日韩精品电影| 欧美一卡2卡3卡4卡| 亚洲欧美综合色| 蜜桃av一区二区| 色女孩综合影院| 久久综合九色综合97_久久久| 中文字幕在线一区免费| 麻豆精品久久精品色综合| 中文字幕一区二区三区色视频| 亚洲综合一区在线| 高清免费成人av| 欧美区视频在线观看| 中文字幕在线不卡国产视频| 老鸭窝一区二区久久精品| www.亚洲激情.com| 精品国产乱码91久久久久久网站| 亚洲精品成人在线| 国产成人夜色高潮福利影视| 8v天堂国产在线一区二区| 国产精品另类一区| 黑人精品欧美一区二区蜜桃 | 精品国产乱码91久久久久久网站| 亚洲国产电影在线观看| 日本中文字幕一区| 欧美三级视频在线观看| 亚洲视频1区2区| 国产福利精品导航| 久久亚洲精华国产精华液| 视频一区二区三区入口| 欧美日韩黄色一区二区| 亚洲一区在线看| eeuss影院一区二区三区| 国产精品天干天干在观线| 青青草伊人久久| 色88888久久久久久影院按摩| 国产精品国产三级国产普通话99| 国产一区二区在线看| 精品免费国产一区二区三区四区| 奇米在线7777在线精品| 欧美一区二区免费| 久久精品国产99| 久久噜噜亚洲综合| 国产a区久久久| 最新国产精品久久精品| 99re免费视频精品全部| 综合久久国产九一剧情麻豆| 在线观看亚洲a| 午夜久久电影网| 欧美xxxxx牲另类人与| 国产成人免费9x9x人网站视频| 国产日韩影视精品| 亚洲私人影院在线观看| 国产精品狼人久久影院观看方式| 久久综合色之久久综合| 麻豆久久一区二区| 日韩久久精品一区| 成人永久免费视频| 亚洲欧美一区二区三区极速播放 | 在线免费视频一区二区| 亚洲亚洲精品在线观看| 欧美丰满高潮xxxx喷水动漫| 久久精品国产999大香线蕉| 欧美激情一区二区三区在线| 97国产精品videossex| 午夜不卡av在线| 国产欧美精品在线观看| 91电影在线观看| 极品尤物av久久免费看| 亚洲精品综合在线| 日韩免费看的电影| 99精品桃花视频在线观看| 视频一区二区中文字幕| 欧美国产精品专区| 9191国产精品| 99国产麻豆精品| 麻豆视频观看网址久久| 国产精品久久久久婷婷二区次| 欧美精品视频www在线观看| 国产成人精品1024| 天天综合天天综合色| 国产精品成人一区二区艾草| 日韩一区二区免费电影| 91亚洲精品乱码久久久久久蜜桃| 久久精品二区亚洲w码| 亚洲午夜日本在线观看| 亚洲国产精品成人综合 | 国产精品一区二区在线播放 | 蜜乳av一区二区| 亚洲色图视频免费播放| 久久色在线观看| 日韩一区二区高清| 国产成人精品在线看| 久久欧美中文字幕| 日日欢夜夜爽一区| 日韩av网站在线观看| 久久久国际精品| 日韩欧美一级在线播放| 欧美最猛性xxxxx直播| 成人午夜短视频| 激情成人午夜视频| 日韩和欧美一区二区三区| 最新国产精品久久精品| 国产精品无人区| 久久久精品日韩欧美| 日韩视频中午一区| 欧美一级日韩免费不卡| 欧美日韩综合色| 色8久久精品久久久久久蜜| 99国产精品久久久久久久久久久| 国产剧情一区二区| 国产原创一区二区三区| 激情综合色综合久久| 日欧美一区二区| 日本vs亚洲vs韩国一区三区二区| 亚洲一区二区欧美激情| 亚洲线精品一区二区三区八戒| 亚洲欧美日韩国产一区二区三区 | 中文成人av在线| 亚洲国产精品精华液ab| 亚洲国产精品精华液2区45| 国产精品视频一区二区三区不卡| 久久久久国产一区二区三区四区| 久久奇米777| 中文字幕一区二区在线观看| 亚洲欧洲一区二区在线播放| 中文字幕日韩一区| 洋洋成人永久网站入口| 亚洲一区二区美女| 麻豆成人av在线| 国产不卡在线一区| 91美女蜜桃在线| 欧美日韩久久久一区| 精品日韩在线观看| 国产人妖乱国产精品人妖| 中文字幕色av一区二区三区| 亚洲成人资源在线| 九九视频精品免费| 91在线丨porny丨国产| 欧美色图一区二区三区| 日韩一区二区电影| 国产精品视频在线看| 亚洲成av人片在www色猫咪| 精品一区二区av| 不卡视频一二三四| 欧美精品一二三四| 国产蜜臀av在线一区二区三区| **网站欧美大片在线观看| 日韩精品一区第一页| 国产成人高清视频| 5566中文字幕一区二区电影| 国产欧美日韩激情| 亚洲chinese男男1069| 高清成人免费视频| 欧美日韩在线免费视频| 国产日产欧产精品推荐色| 亚洲综合在线免费观看| 国产一区二区精品在线观看| 欧美视频一区二区三区四区| 久久精品一区蜜桃臀影院| 日韩高清国产一区在线| 成人av手机在线观看| 日韩一二三区视频| 一区二区三区四区中文字幕| 久久福利资源站|