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

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

?? huffman.cpp

?? 該源碼實現了從文件中讀取字符串
?? CPP
字號:
/***************************************************/
/*    項目名稱:霍夫曼編碼算法     */
                                  
/***************************************************/
#include <iostream.h>
#include <vector>
#include <string>
#include <stdlib.h>

using namespace std;


//存儲霍夫曼樹節點的數據結構
typedef struct treenode
{
    char data;                    //存儲要編碼的字符
    int weight;                   //存儲要編碼的字符的權重
    struct treenode* parent;    //父節點
    struct treenode* lchild;    //左子樹
    struct treenode* rchild;    //右子樹
}TreeNode;

//存儲霍夫曼碼表單元的數據結構
typedef struct nodecode
{
	char node;     //存儲要編碼的字符
	string huffmancode;//存儲相應字符的霍夫曼碼
}Nodecode;

//定義全局變量
 static int N;  //記錄文件中出現的字符總數
 static nodecode s[30];//計算出的霍夫曼碼表
 static int index=0; 
/*******************************************************************/
/*函數功能:獲得字符cc在文件中出現的次重,以此作為權重
/******************************************************************/
int GetCount(FILE* fp,char cc)
{
    int i=1;
    while(!feof(fp))
    {
        if(cc==fgetc(fp))
            i++;
    }
    rewind(fp);
    return i;
}
/******************************************************************************/
//函數功能:判斷vector中是否已存在指定字符為cc的treenode
/******************************************************************************/
int IsExit(vector<TreeNode*> vec,char cc)
{
    for(int i=0;i<vec.size();i++)
    {
        if(cc==vec[i]->data)
            return 1;
    }
    return 0;
}
/******************************************************************************/
//函數功能:從vector中選擇權重最小的兩個節點lnode,
//         rnode,并將其從vector中移除
/******************************************************************************/
vector<TreeNode*> Select(vector<TreeNode*> vec,TreeNode** lnode,TreeNode** rnode)
{
    int temp=vec[0]->weight;
    vector<TreeNode*>::iterator iter=vec.begin();
    vector<TreeNode*>::iterator it=vec.begin();
    if(vec.size()==1)
        return vec;
    while(iter!=vec.end())
    {
        if(temp>=iter[0]->weight)
        {
            *lnode=iter[0];
            it=iter;
            temp=iter[0]->weight;
        }
        iter++;
    }
    vec.erase(it);//將取出的第一個節點從vector中刪掉
    temp=vec[0]->weight;
    it=iter=vec.begin();
    while(iter!=vec.end())
    {
        if(temp>=iter[0]->weight)
        {
            *rnode=iter[0];
            it=iter;
            temp=iter[0]->weight;
        }
        iter++;
    }

    vec.erase(it);//將取出的第二個節點從vector中刪掉

    return vec;
}
/******************************************************************************/
//函數功能:判斷vector中是否只含有一個父節點為NULL的節點
//         則將此節點作為霍夫曼樹的根節點返回
/******************************************************************************/
TreeNode* Top(vector<TreeNode*> vec)
{
    int flag=0;
    TreeNode* node;
    for(int i=0;i<vec.size();i++)
    {
        if(vec[i]->parent==NULL)
        {
            flag++;
            node=vec[i];
        }
    }
    if(flag>1)
        return NULL;
    return node;
}
/******************************************************************************/
//函數功能:輸出文件的霍夫曼編碼結果
/******************************************************************************/
string output(FILE *fp)
{
	char cc;
	int i,j;
	string ss;
	ss="";
	cout<<"the encode result is :";
	while(!feof(fp))
	{
		cc=fgetc(fp);
	
		if(cc==EOF)
			break;
	
		for(i=0;i<N;i++)
		{
			if(cc==s[i].node)
			{   
				for(j=0;j<s[i].huffmancode.size();j++)
					cout<<s[i].huffmancode[j];
				ss=ss+s[i].huffmancode;
			
			}
			
		}
	}
	cout<<endl;
	return ss;
}
/******************************************************************************/
//函數功能:對霍夫曼編碼后數據解碼,恢復源文件
/******************************************************************************/
void decode(string encode)
{
	int i=0;
	string ss;
	ss="";
	cout<<"the decode result is :";
	while(i<encode.size())
	{
	
		ss=ss+encode[i];
		for(int j=0;j<N;j++)
		{
			if(ss==s[j].huffmancode)
			{
				cout<<s[j].node;
				ss="";
				continue;
			}
		}
		i=i+1;

	}

}
/******************************************************************************/
//函數功能:初始化vector,將文件中的字符及其權重
//                  不重復的寫入treenode,并將其壓入vector
/******************************************************************************/
vector<TreeNode*> InitList(FILE *fp)
{
    
    int i=0,k=0,flag=0,len=0;
    char cc;
    TreeNode* node;
    vector<TreeNode*> vec;

    while(!feof(fp))
    {
	
        cc=fgetc(fp);
		if (cc==EOF)
			break;
        //若數據重復則跳過此次循環
        if(IsExit(vec,cc))
        {
            continue;
        }
		else
		{
        //將本次循環取出的字符作為TreeNode的data,并計算其權重,將TreeNode
        //的左子樹和右字樹以及父節點初始化為NULL,其壓入vector
        node=(TreeNode*)malloc(sizeof(TreeNode));
        node->data=cc;
        node->weight=GetCount(fp,node->data);
		cout<<"the data is : "<<node->data;
		cout<<" the frequency is : "<<node->weight<<endl;
        node->lchild=node->rchild=node->parent=NULL;
        vec.push_back(node);
  
		}
		
	}
   rewind(fp);//將文件指針重定向到文件頭

    return vec;

}
/******************************************************************************/
//函數功能:構造霍夫曼樹
/******************************************************************************/
TreeNode* CreateTree(vector<TreeNode*> vec)
{
    TreeNode* root;        //霍夫曼樹的根節點
    TreeNode* lchild;    //霍夫曼樹的左子樹
    TreeNode* rchild;    //霍夫曼樹的右子樹
    TreeNode* tree;
    tree=(TreeNode*)malloc(sizeof(TreeNode));
    int i=0;
    while(1)
    {
        lchild=rchild=(TreeNode*)malloc(sizeof(TreeNode));
        //從vector中選擇權重最小的兩個節點
        vec=Select(vec,&lchild,&rchild);
        //新建一個TreeNode節點
        TreeNode* node=(TreeNode*)malloc(sizeof(TreeNode));
        //將取出的節點作為TreeNode節點的的左子樹和右子樹
        node->parent=NULL;
        node->lchild=lchild;
        node->rchild=rchild;
        //新節點的權重為其左子樹和右子樹的權重之和
        node->weight=lchild->weight+rchild->weight;
        lchild->parent=rchild->parent=node;    
        //將新建的節點壓入vector
        vec.push_back(node);

        
        if((root=Top(vec))!=NULL)
            break;
    }
    return root;

}
/******************************************************************************/
//函數功能:遞歸遍歷某一支樹,對某一字符進行編碼
/******************************************************************************/
string Trace(TreeNode* Node,string& cc)
{
    if(Node->parent)
    {
        if(Node->parent->lchild==Node)
        {
            cc="1"+cc;
		//	strcpy("1",cc);
        }
        if(Node->parent->rchild==Node)
        {
		//	strcpy("0",cc);
            cc="0"+cc;
        }
        cc=Trace(Node->parent,cc);
    }
    return cc;
}
/******************************************************************************/
//函數功能:對霍夫曼樹的節點進行訪問
/******************************************************************************/
void Visit(TreeNode* Node)
{
   string cc;
   char ss;
   int i;
   int len;
	cc="";
	Trace(Node,cc);	
    if(Node->lchild==NULL&&Node->rchild==NULL)
    {
	   s[index].node=Node->data;
	   s[index].huffmancode=s[index].huffmancode + cc;	   
	  cout<<"the character is: "<<Node->data;
		len=cc.size();
		cout<<"; the encoding is "; 
		for(i=0;i<len;i++)
		{
			ss=cc[i];
			cout<<ss;
		}
		index=index+1;
		cout<<endl;
    }

	
}
/******************************************************************************/
//函數功能:對霍夫曼樹進行中序遍歷
/******************************************************************************/
/*void Inorder(TreeNode* top, void (*Visit)(TreeNode* Node))
{
    if(top)
    {
        Inorder(top->lchild,Visit);
        Visit(top);
        Inorder(top->rchild,Visit);
    }
}*/
void Inorder(TreeNode* top)
{
    if(top)
    {
        Inorder(top->lchild);
        Visit(top);
        Inorder(top->rchild);
    }
}
/******************************************************************************/
//主函數
/******************************************************************************/

int main(int argc,char* argv[])
{
   
    vector<TreeNode*> vec;	
	string encode;
    FILE* fp;
    TreeNode* top=(TreeNode*)malloc(sizeof(TreeNode));

    fp=fopen("D:\\test.txt","r");
	if(fp==NULL) 
	{ 
		printf("\nerror on open test.dat!");
		exit(1);
	} 
    vec=InitList(fp);
    N=vec.size();//確定文件中出現的字符數	

    vector<TreeNode*>::iterator iter=vec.begin();
    top=CreateTree(vec);
    
    Inorder(top); 
	encode=output(fp);//霍夫曼編碼輸出結果

    decode(encode);//對霍夫曼碼解碼后源文件輸出
	
    
    return 0;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
2023国产精华国产精品| 免费观看成人av| 亚洲视频免费在线| 欧美国产精品一区二区三区| 久久久亚洲午夜电影| 久久久综合视频| 久久精品一区二区三区av | 午夜欧美2019年伦理| 亚洲国产精品影院| 三级欧美在线一区| 久久国产精品99久久久久久老狼| 免费精品视频最新在线| 久久精品国产亚洲5555| 国产中文字幕精品| 国产精品77777竹菊影视小说| 成人在线视频一区| 91免费精品国自产拍在线不卡| 欧美自拍偷拍午夜视频| 欧美伦理视频网站| 精品福利二区三区| 国产精品无码永久免费888| 亚洲欧洲综合另类| 亚洲444eee在线观看| 久久99精品网久久| 成人av网站免费| 欧美性做爰猛烈叫床潮| 欧美一区二区三区免费观看视频| 亚洲精品一区二区三区99| 欧美国产一区在线| 亚洲午夜一二三区视频| 久久成人麻豆午夜电影| 成人免费高清在线观看| 欧美在线一区二区三区| 日韩欧美另类在线| 中文字幕亚洲在| 日韩高清在线电影| 国产不卡在线播放| 欧美日韩一区二区电影| 精品国产免费一区二区三区四区| 国产精品成人网| 天天综合网天天综合色| 国产sm精品调教视频网站| 欧美在线视频全部完| 久久蜜桃香蕉精品一区二区三区| 一区二区三区中文字幕电影 | 午夜成人在线视频| 国产自产2019最新不卡| 在线观看91视频| 精品sm在线观看| 亚洲综合色成人| 国产精品影视天天线| 在线观看一区不卡| 国产日韩欧美电影| 五月天中文字幕一区二区| 国产69精品久久久久777| 欧美日韩一级大片网址| 欧美韩国日本不卡| 喷水一区二区三区| 色成年激情久久综合| 久久综合狠狠综合久久激情| 亚洲国产综合视频在线观看| 高清在线不卡av| 日韩视频一区在线观看| 一区二区三区四区精品在线视频| 精品在线一区二区| 欧美日韩中文精品| 综合av第一页| 国产乱子轮精品视频| 欧美肥妇毛茸茸| 亚洲欧美日本在线| 国产99精品国产| 欧美zozozo| 日韩不卡一二三区| 中文字幕中文在线不卡住| 精品一区在线看| 欧美精品三级日韩久久| 国产精品天天看| 国产乱码精品一区二区三| 欧美一级生活片| 午夜一区二区三区视频| 91啪九色porn原创视频在线观看| 国产日韩欧美a| 国模套图日韩精品一区二区| 欧美一区二区三区免费观看视频| 亚洲国产精品嫩草影院| 91片在线免费观看| 中文字幕日韩精品一区| 成人一级片在线观看| 国产日韩欧美a| 国产九九视频一区二区三区| 欧美成人精品二区三区99精品| 日韩精品乱码av一区二区| 精品视频资源站| 午夜精品视频在线观看| 欧美视频自拍偷拍| 亚洲一区二区三区影院| 欧美在线免费观看视频| 亚洲丶国产丶欧美一区二区三区| 色综合久久中文综合久久97| 18欧美亚洲精品| 一本一道久久a久久精品综合蜜臀| 中文字幕免费不卡| 国产91丝袜在线播放0| 日本一区二区三区高清不卡| 懂色av一区二区夜夜嗨| 国产欧美久久久精品影院| 高清成人在线观看| 国产精品天美传媒| 色综合久久综合中文综合网| 亚洲精品成人悠悠色影视| 91国偷自产一区二区使用方法| 一区二区在线观看不卡| 欧美在线看片a免费观看| 亚洲444eee在线观看| 欧美一卡2卡3卡4卡| 国产在线麻豆精品观看| 国产三级精品三级在线专区| 99久久夜色精品国产网站| 亚洲视频在线一区观看| 欧美性受xxxx黑人xyx| 水野朝阳av一区二区三区| 日韩欧美成人一区二区| 国产精品1区2区| 最新不卡av在线| 欧美日韩一级片在线观看| 秋霞午夜av一区二区三区| 久久综合九色综合欧美就去吻| 国产.欧美.日韩| 夜夜嗨av一区二区三区中文字幕| 777xxx欧美| 国产裸体歌舞团一区二区| 国产精品久久久久婷婷二区次| 日本高清不卡aⅴ免费网站| 日韩—二三区免费观看av| 2021久久国产精品不只是精品| 成人高清在线视频| 亚洲福利电影网| 久久综合九色综合97婷婷女人 | 欧美日韩国产高清一区二区| 老司机免费视频一区二区| 国产免费成人在线视频| 欧美中文字幕不卡| 国产自产v一区二区三区c| 亚洲人成精品久久久久久| 91精品国产一区二区三区| 夫妻av一区二区| 午夜精品aaa| 日本一区二区三区四区| 欧美视频一区二区三区四区 | 国产精品一卡二卡在线观看| 亚洲欧美精品午睡沙发| 欧美mv日韩mv国产网站| gogo大胆日本视频一区| 日本免费在线视频不卡一不卡二| 国产欧美综合在线观看第十页| 欧美性猛交xxxx黑人交| 国产精品一区在线| 午夜精品福利在线| 亚洲国产岛国毛片在线| 91精品国产色综合久久| 91丨九色丨尤物| 国内成+人亚洲+欧美+综合在线 | av在线一区二区| 六月丁香婷婷久久| 亚洲在线中文字幕| 欧美国产丝袜视频| 欧美一区二区精品久久911| 91色乱码一区二区三区| 黑人巨大精品欧美一区| 五月婷婷综合网| 日韩美女视频一区二区 | 一区二区三区四区乱视频| 久久蜜桃香蕉精品一区二区三区| 欧美日韩国产成人在线免费| av激情综合网| 国产精品自拍网站| 免费观看一级特黄欧美大片| 一区二区三区欧美| 中文字幕不卡在线| 26uuu国产日韩综合| 在线播放国产精品二区一二区四区 | 亚洲gay无套男同| 亚洲天堂免费在线观看视频| 久久精品欧美一区二区三区不卡| 欧美一区二区三区色| 欧美三级视频在线观看| 91视频在线看| 成人美女视频在线看| 国产乱码一区二区三区| 精品系列免费在线观看| 免费的国产精品| 秋霞午夜鲁丝一区二区老狼| 亚洲mv大片欧洲mv大片精品| 亚洲视频网在线直播| 亚洲欧洲av另类| 日韩美女视频19| 亚洲三级在线免费| 国产一区欧美日韩| 狠狠色狠狠色综合| 精品一区免费av|