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

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

?? 54.cpp

?? 實現(xiàn)簡單的壓縮解壓縮功能!具體實現(xiàn)是使用霍夫曼編碼原理
?? CPP
字號:
#include<iostream>
#include<fstream>
#include<string>
using namespace std;
const int defaultsize =256;
struct bintreenode
{
	bintreenode(){leftchild =NULL;rightchild=NULL;}
	bintreenode(char item,bintreenode*left=NULL,bintreenode*right=NULL)
	{
		data=item;
		leftchild=left;
		rightchild=right;
	}
	char data;  //字符
	int lengthofmark;//編碼碼長
    string mark;//字符編碼
	bintreenode *leftchild,*rightchild,*parent;
};
class bintree
{
public:
		bintreenode*root;
	    bintree(){root=NULL;}
		~bintree(){}
		int isempty()const {return root==NULL;}
		bintreenode* maketree(const char &item,bintree&left,bintree&right);
		bintreenode*parent(bintreenode*start,bintreenode*current);
		void preorder();
private:
      void preorder(bintreenode*current);
};
////////////////////////////////////////////////////////////
bintreenode*bintree::parent(bintreenode*start,bintreenode*current)
{
	if(start==NULL)return NULL;
	if(start->leftchild==current||start->rightchild==current)return start;
	bintreenode*p;
	if((p=parent(start->leftchild,current))!=NULL)return p;
	else return parent(start->rightchild,current);
}
bintreenode*bintree::maketree(const char&item,bintree&left,bintree&right)
{
	root=new bintreenode(item,left.root,right.root);
	left.root=right.root=NULL;
	return root;
}
void bintree:: preorder()
{
	preorder(root);                                                                                                        
}
void bintree::preorder(bintreenode*current)
{
	if(current!=NULL)
	{
		cout<<current->data<<"**"<<endl;
	   preorder(current->leftchild);
	   preorder(current->rightchild);
	}
}
//////////////////////////////////////////////////////////////
struct huffman
{
	bintree tree;
	int weight;//權(quán)值
};
class minheap
{
public:
     minheap(int maxsize=defaultsize);
	 minheap(huffman arr[],int n);
	 ~minheap(){delete[]heap;}
	 int insert(const huffman&x);
	 huffman removemin(huffman&x);
	 int isempty()const{return currentsize==0;}
	 int isfull()const{return currentsize==maxheapsize;}
	 huffman getheap(int i){return heap[i];}
private:
	  huffman*heap;
	  int currentsize;
	  int maxheapsize;
	  void filterdown(int i,int m);
	  void filterup(int i);
};
minheap::minheap(int maxsize)
{
	maxheapsize=defaultsize<maxsize?maxsize:defaultsize;
	heap=new huffman[maxheapsize];
    currentsize=0;
}
minheap::minheap(huffman arr[],int n)
{
   maxheapsize=n;
   heap=new huffman[n];
   currentsize=n;
   for(int i=0;i<currentsize;i++)
	   {
	      heap[i].weight=arr[i].weight;
		  heap[i].tree=arr[i].tree;
   }
   int currentpos=(currentsize-2)/2;
   while(currentpos>=0)
   { 
	   filterdown(currentpos,currentsize-1);
	   currentpos--;
   }
}
void minheap::filterdown(const int start ,const int endofheap)
{
	int i=start,j=2*i+1;
	huffman temp=heap[i];
	while(j<=endofheap)
	{
		if(j<endofheap&&heap[j].weight>heap[j+1].weight)j++;
		if(temp.weight<=heap[j].weight)break;
		else 
		{
			heap[i].weight=heap[j].weight;
			heap[i].tree=heap[j].tree;
			i=j;
			j=2*j+1;
		}
	}
		heap[i].weight=temp.weight;
		heap[i].tree=temp.tree;
}
void minheap::filterup(int start)
{
	int j=start,i=(j-1)/2;
	huffman temp=heap[j];
	while(j>0)
	{
		if(heap[i].weight<=temp.weight)break;
		else 
		{
			heap[j].weight=heap[i].weight;
			heap[j].tree=heap[i].tree;
			j=i;
			i=(i-1)/2;
		}
	}
	heap[j].weight=temp.weight;
	heap[j].tree=temp.tree;
}
int minheap::insert(const huffman&x)
{
	if(isfull()){cerr<<"heap full"<<endl;return 0;}
	heap[currentsize]=x;
	filterup(currentsize);
	currentsize++;
	return 1;
}
huffman minheap::removemin(huffman&x)
{
	if(isempty()){cerr<<"heap empty"<<endl;}
	x=heap[0];
	heap[0]=heap[currentsize-1];
	currentsize--;
	if(currentsize==0)filterdown(0,0);
 else if(currentsize>0)
	filterdown(0,currentsize-1);
	return x;
}
////////////////////////////////////////////////////
class compress
{
public:
	compress(){NOofchar=0;}
	void readfile(string filename);
	char*getdata(){return data;}//得到所有的字符
	char getcertaindata(int i);//得到數(shù)組元素第i個元素所對應(yīng)的字符
	int*getfrequence(){return frequence;}//得到所有字符的權(quán)值
	int getNOofchar(){return NOofchar;}//字符的個數(shù)
	int getNOofcertainchar(int i);//第i個元素所對應(yīng)的字符的個數(shù)
private:
	char data[256];//字符
    int frequence[256];//權(quán)值
	int NOofchar;
};
int total;
char compress::getcertaindata(int i)
{
	if(i>=0&&i< NOofchar)
		return data[i];
	return '/';
}
int compress::getNOofcertainchar(int i)
{
	if(i>=0&&i< NOofchar)
		return frequence[i];
	return 0;
}
//////////////////////////////////////////////////////////
/*readfile這個函數(shù)的作用是通過掃描文件近而統(tǒng)計字符的種類個數(shù)和權(quán)值,由于是以二進制的形式打開文件
因此字符的種類個數(shù)和權(quán)值個數(shù)最多有256個
*/
void compress::readfile(string filename)
{
   ifstream in;
	in.open(filename.c_str(),ios::binary);
     if (!in.is_open())
	{
    	cerr<<"couldn't open the file"<<endl;
	}
	int i=0,j;	char ch;
loop: while(in.read(&ch, sizeof(char)))
	{
        total++;
		for(j=0;j<i;j++)
		{
			if(ch == data[j])
			{
				frequence[j]++;	
				goto loop;
			}
		}
		   data[i] = ch;
		   frequence[i] = 1;
		 i++;
	 }
	  NOofchar=i;
	in.close();
}
///////////////////////////////////////////////////////
class edithuffman
{
friend class minheap;
public:
	edithuffman(){Frequence=0;}
    ~edithuffman(){delete []w;}
    void huffmantree(int *arr,int n,char* b);//建一棵霍夫曼樹
	void code();//霍夫曼樹的編碼工作
    void print();//完成打印工作
	void encompress(string oldfilename,string newfilename);//完成壓縮功能
	void dcompress(string oldfilename,string newfilename);//完成解壓縮功能
private:
	int Frequence,len;
	huffman x,y;
	bintree z,zero;
    huffman*w;
	void print(huffman &h);//完成打印工作
	void codehuffman(bintreenode *current,bintreenode*end,string &m,int &no);//霍夫曼樹的編碼工作
    unsigned long string_to_long(string str);
};
//////////////////////////////////////////////////////
void edithuffman::huffmantree(int *arr,int n,char* b)
{
	int i;
	w=new huffman[Frequence=n];
	for(i=0;i<Frequence;i++)
	{
		z.maketree(b[i],zero,zero);
		w[i].weight=arr[i];
		w[i].tree=z;
	}
   minheap h(w,Frequence);
	bintreenode *t1,*t2;
    for(i=0;i<Frequence-1;i++)
	{
		h.removemin(x);	
		t1=x.tree.root;
	    h.removemin(y);
		t2=y.tree.root;
        z.maketree(0,x.tree,y.tree);
        x.weight+=y.weight;
		x.tree=z;
		h.insert(x);
		t1->parent=x.tree.root;
		t2->parent=x.tree.root;
	}
	h.removemin(x);
	  code();
}
///////////////////////////////////////////////
void edithuffman::code()
{
	for(int i=0;i<Frequence;i++)
	  codehuffman(w[i].tree.root,x.tree.root,w[i].tree.root->mark,w[i].tree.root->lengthofmark);
//	print();
}
void edithuffman::codehuffman(bintreenode *current,bintreenode*end,string &m,int &no)
{  
   char *u;
	string str;
    int i;
	no=2;
	while(current->parent!=NULL)
	 {
		 if( current->parent->leftchild==current)
		  u="0";
	     else if(current->parent->rightchild==current)
		  u="1";
		  current=current->parent;
		  str+=u;
		 if(current==end)break;
			no++;
	 }
	const char*h=str.c_str();
	 for(i=str.length()-1;i>=0;i--) m=m+h[i];
}
/////////////////////////////////////////////////
void edithuffman::print(huffman &h)
{ 
	cout<<h.weight<<"**"<<h.tree.root->data<<"**"<<h.tree.root->mark<<"**"<<h.tree.root->lengthofmark<<"**"<<endl;;
}
void edithuffman::print()
{
  for(int i=0;i<Frequence;i++)print(w[i]);
}
///////////////////////////////////////////////
unsigned long edithuffman::string_to_long(string str)
{
	const char*code=str.c_str();
	unsigned long ret = 0;
	int len = (int)strlen(code);
	for(int i = len - 1; i >= 0; i--)
		if (code[i] == '1')
			ret |= (1ul << (len - i - 1));
	return ret;
}
/////////////////////////////////////////////////////////
void edithuffman::encompress(string oldfilename,string newfilename)
{
	ifstream in;
	ofstream out;
	compress temp;
	char ch,d,t;
	int D,i;
   unsigned long key;
	 string k,m;
	 cout<<"COMPRES"<<endl;
	in.open(oldfilename.c_str(),ios::binary);
	out.open(newfilename.c_str(),ios::binary);
	temp.readfile(oldfilename);
	huffmantree(temp.getfrequence(),temp.getNOofchar(),temp.getdata());
    for(int q=0;q<Frequence;q++)
	  {
         d= temp.getcertaindata(q);
		 D=temp.getNOofcertainchar(q);
		 out.write((char*)&d,sizeof(char));
		 out.write((char*)&D,sizeof(unsigned int ));
	  }
	  while(in.read(&ch, sizeof(char)))
	  { 
		  for(i=0;i<Frequence;i++)
			  if(ch==w[i].tree.root->data)k=k+w[i].tree.root->mark;
            if(k.length()<8)continue;
			else
			{
				m = k.substr(0, 8);
                k.erase(0, 8);
	           key=string_to_long(m);
		       t=char(key);
		      out.write(&t,sizeof(char));
			}
	  }
      if(k.length()<8)
	  {
		   len=8-k.length();
		  switch (k.length())
		 {
	       case 1 : k+="0000000"; break;
	       case 2 : k+="000000"; break;
	       case 3 : k+="00000"; break;
	       case 4 : k+="0000"; break;
	       case 5 : k+="000"; break;
	       case 6 : k+="00"; break;
	       case 7 : k+="0"; break;
	       default : break;
		}
	  }
   key=string_to_long(k);
   t=char(key);
  out.write(&t,sizeof(char));
    in.close();
	out.close();
}
void edithuffman::dcompress(string oldfilename,string newfilename)
{
  	ifstream in;
	ofstream out;
	in.open(oldfilename.c_str(),ios::binary);
    char t,ch,store[8],te;
	int i,fre,count=0;
	string temp,m;
	int *cart=new int[Frequence];
	char*dd=new char[Frequence];
	cout<<"DEPRESS"<<endl;
	for ( i = 0; i < Frequence; i++ )
	{
		in.read((char*)&t,sizeof(char));
		dd[i]= t;
		in.read((char*)&fre,4);
		cart[i]= fre;
	}
	out.open(newfilename.c_str(),ios::binary);
	huffmantree(cart,Frequence,dd);
	bintreenode *current=x.tree.root;
loop: while(in.read(&ch, sizeof(char)))
	{
	   for ( int i = 0 ; i < 8 ; i++ )
	   {
			if ( ch & 128 ){ te = '1'; }
			else { te = '0'; }
			ch = ch << 1;
			store [ i ] = te;
		}
	 temp=store;
	   while(current!=NULL)
	   {
         if(count==total)break;
		   if(temp.length()>0)
		   {
		      m=temp.substr(0,1);
			  if(m=="0")
			  current=current->leftchild;
		     else if(m=="1")
			  current=current->rightchild; 
		       temp=temp.erase(0, 1);
			   if(current->data==0)continue;
              else if(current->data!=0)
			  {
				  char o=current->data;
				  count++;
				  out.write(&o,sizeof(char));
				  current=x.tree.root;
			      if(temp.length()>0)continue;
			      else  break;
			  }
		   }
		  else
			  goto loop;
		  }
       }
	in.close();
    out.close();
}
void main()
{
	edithuffman f;
	f.encompress("原始文件.txt","壓縮后的文件.txt");
    f.dcompress("壓縮后的文件.txt","解壓縮文件.txt");

}

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美日本不卡视频| 粉嫩av亚洲一区二区图片| 色哟哟国产精品免费观看| 久久精品亚洲国产奇米99| 久久99精品久久久| 精品国产sm最大网站免费看 | 国产精品久久久久影院老司| 成人性生交大片免费看在线播放| 国产精品麻豆一区二区| 91国偷自产一区二区三区观看 | 欧美午夜精品免费| 天堂蜜桃91精品| 欧美变态口味重另类| 国产一区二区精品久久| 中文字幕色av一区二区三区| 色婷婷国产精品| 日本免费新一区视频| 久久看人人爽人人| 色婷婷综合久久久中文一区二区 | 国产精品三级电影| 91国偷自产一区二区三区观看| 婷婷中文字幕一区三区| 欧美精品一区二区三区视频| 国产成人丝袜美腿| 一区二区成人在线| 精品日韩av一区二区| 91视频免费播放| 成人手机电影网| 日韩高清在线电影| 国产精品欧美久久久久一区二区| 欧美在线短视频| 激情综合五月天| 一区二区高清视频在线观看| 欧美mv和日韩mv的网站| 91浏览器打开| 国产乱码精品一区二区三区av| 亚洲色图19p| 亚洲精品一区二区三区99| 91美女在线看| 国产精品影视天天线| 亚洲一区免费观看| 日本一区二区综合亚洲| 欧美人狂配大交3d怪物一区| jvid福利写真一区二区三区| 日韩成人免费电影| 一区二区三区免费看视频| 久久久久久久久久久久久夜| 欧美日韩午夜影院| 91网站视频在线观看| 精品一区二区综合| 午夜精品久久久久久久| 亚洲欧洲日本在线| 久久婷婷久久一区二区三区| 在线不卡免费欧美| 91福利视频网站| 波多野结衣中文字幕一区二区三区| 久久精品99国产国产精| 亚洲国产综合人成综合网站| 成人免费一区二区三区视频| 久久久久久电影| 日韩免费高清电影| 欧美久久高跟鞋激| 欧美日韩视频专区在线播放| 91在线观看一区二区| 国产69精品久久777的优势| 久久99九九99精品| 青椒成人免费视频| 偷窥少妇高潮呻吟av久久免费| 一区二区三区成人| 亚洲精品精品亚洲| 综合久久久久久| 国产精品成人免费在线| 欧美高清在线视频| 欧美激情一区二区三区| 久久精品日产第一区二区三区高清版| 日韩精品在线一区| 精品国内二区三区| 久久青草欧美一区二区三区| 精品国产乱码久久久久久久久| 欧美电影免费观看高清完整版 | 亚洲精品免费在线| 国产综合色产在线精品| 日韩av网站在线观看| 日韩不卡一区二区三区| 青娱乐精品在线视频| 蜜桃免费网站一区二区三区| 另类欧美日韩国产在线| 国产一区二区精品久久91| 国产精品99久久久久久久女警| 国产精品一区2区| 成人美女视频在线看| eeuss国产一区二区三区| 成人激情文学综合网| 精品久久五月天| 色综合天天综合在线视频| 成人不卡免费av| 色视频一区二区| 91久久香蕉国产日韩欧美9色| 欧美视频在线一区| 日韩一区二区不卡| 久久久精品国产免费观看同学| 国产精品久久久久久久久免费丝袜| 亚洲欧美日韩国产手机在线| 亚洲第一二三四区| 激情深爱一区二区| 不卡一卡二卡三乱码免费网站| 91黄色免费网站| 日韩欧美一区在线| 欧美国产精品久久| 亚洲午夜私人影院| 国产在线观看一区二区| 9色porny自拍视频一区二区| 欧美人与性动xxxx| 国产日产欧产精品推荐色| 夜夜操天天操亚洲| 精品一区二区三区在线观看| 北条麻妃国产九九精品视频| 欧美日韩成人在线一区| 国产日韩精品一区二区三区在线| 一区二区在线观看视频在线观看| 久久av中文字幕片| 91网站视频在线观看| 日韩精品一区二| 亚洲精品自拍动漫在线| 久久99热99| 在线观看亚洲精品视频| 精品国产乱码久久久久久老虎| 亚洲精品第一国产综合野| 看电视剧不卡顿的网站| 色综合一区二区三区| 精品免费一区二区三区| 亚洲一区二区中文在线| 国产成人免费av在线| 欧美顶级少妇做爰| 亚洲人成电影网站色mp4| 九色综合狠狠综合久久| 欧美性感一区二区三区| 国产精品妹子av| 紧缚捆绑精品一区二区| 欧美美女视频在线观看| 国产精品乱子久久久久| 韩国欧美国产1区| 91精品欧美一区二区三区综合在| 国产精品久久久久久久久图文区| 久久精品国产一区二区三 | 91精品午夜视频| 一区二区三区高清| 99久久婷婷国产综合精品电影 | 欧美三级日韩三级| 中文字幕一区二区三区在线观看 | 亚洲第一激情av| 99视频超级精品| 国产亚洲欧美色| 久久www免费人成看片高清| 欧美日韩精品三区| 亚洲一区二三区| 在线观看国产91| 亚洲激情图片一区| 99热99精品| 国产精品超碰97尤物18| 成人av在线一区二区三区| 国产日本欧美一区二区| 国产精品一区在线| 国产三级欧美三级日产三级99| 久久99精品网久久| 26uuu国产在线精品一区二区| 免费成人你懂的| 日韩精品一区二| 狠狠色综合播放一区二区| 欧美精品一区二区三区在线| 经典三级一区二区| 久久久精品免费观看| 国产精品亚洲成人| 国产女主播视频一区二区| 国产成人综合网站| 欧美激情中文字幕| 波多野结衣中文字幕一区二区三区| 日本一区二区成人| 99re这里只有精品视频首页| 亚洲区小说区图片区qvod| 欧美在线观看一区二区| 亚洲成人综合网站| 欧美一级久久久| 国产一区二区福利视频| 国产精品天天看| 色综合久久天天| 日韩精品乱码免费| 精品久久久久久久久久久久久久久| 韩国视频一区二区| 欧美国产日韩亚洲一区| 色94色欧美sute亚洲线路一ni| 一区二区三区产品免费精品久久75| 欧美精品丝袜久久久中文字幕| 免费看黄色91| 国产精品女上位| 欧美三级三级三级爽爽爽| 另类人妖一区二区av| 中文字幕 久热精品 视频在线| 色老汉一区二区三区| 美女视频一区二区三区|