⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 text.txt

📁 数据结构课程设计
💻 TXT
字号:
#include<stdio.h>
#include<iostream.h>
#include<string.h>
#include <malloc.h>
#define  NULL 0
#define OK 1
#define ERROR 0
typedef struct HTNODE{
	char Code;
    int weight;
	int parent;
	int lchild;
	int rchild; 
}HTNode,*HuffmanTree;
typedef char **HuffmanCode;
typedef struct {
	int num;
	char t;
}statis;
typedef struct 
{
   char bcode[100];
}encodetable[256];
void Select(HuffmanTree &HT,int k,int *s1,int *s2);
void BuildHfTree(HuffmanTree &HT,encodetable &table1,int n);
//--------------------    -----------------//
void  tongji(char *path)
{  
    int num;
	FILE *fp0,*fp1;
	statis statmp[256],sta[256];
	char temp;
	int i,j,tmp=0,flag=0;
	for(j=0;j<255;j++)
	{
		statmp[j].num=0;
		statmp[j].t=0;
	}
	if (path[0]=='*')fp0=fopen("text.txt","rb");
	else	
		fp0=fopen(path,"rb");
	fp1=fopen("tongji.txt","wb");
	for (;fread(&temp,sizeof(char),1,fp0)==1;)	
	{    
		if((int)temp>=0&&(int)temp<=255)
		{
		    statmp[(int)temp].num++;
		    statmp[(int)temp].t=temp;
		}			
	}
	i=0;
	j=0;
	while(i<=255)
	{
		if(statmp[i].num!=0)
		{
			sta[j].t=statmp[i].t;
			sta[j].num=statmp[i].num;
			i++;
			tmp++;
			j++;
		}
		else i++;
	}
	num=tmp-1;
	cout<<num<<endl;
	fwrite(&num,sizeof(int),1,fp1);
	for(i=0;i<num;i++)fwrite(&sta[i],sizeof(statis),1,fp1);
	fclose(fp0);
	fclose(fp1);
	return;
}
//-----------    --------------------//
int Init(encodetable &table)
{   
	FILE *fp[2]; 
	HuffmanTree HT;
	int i,m,n,flag=0;
	statis sta[256];
	if((fp[0]=fopen("huffman.txt","wb"))== NULL)
	{
		cout<<"cannot open file "<<endl;
	    return ERROR;
	}
	if((fp[1]=fopen("tongji.txt","rb"))== NULL)
	{
		cout<<"cannot open file "<<endl;
	    return ERROR;
	}
	fread(&n,sizeof(int),1,fp[1]);
	m=2*n-1;
	for(i=0;i<n;i++)fread(&sta[i],sizeof(statis),1,fp[1]);
	HT=(HuffmanTree)malloc((m+1)*sizeof(HTNode));
	for(i=1;i<=n;++i)
	{ 		  
	  HT[i].Code=sta[i-1].t;
	  HT[i].weight=sta[i-1].num;
	  HT[i].lchild=0;
	  HT[i].rchild=0;
	  HT[i].parent=0;
	}
	for(i=n+1,HT[i].Code=HT[i-1].Code+1;i<=m;++i)
	{
		HT[i].parent=0;
        HT[i].Code='^';
		HT[i].lchild=0;
	    HT[i].rchild=0; 
		HT[i].weight=0;
	  
	}
	BuildHfTree(HT,table,n);
         for(i=1;i<=m;i++)
		   fwrite(&HT[i],sizeof(HTNode),1,fp[0]);
	       fclose(fp[0]); 
	       return OK;

}
//-----------------   -------------------//
void BuildHfTree(HuffmanTree &HT,encodetable &table1,int n)
{  	int i,m,start,c,f;
	char *cd;
	int s1,s2;
	m=2*n-1;
   for(i=n+1;i<=m;++i)
	{ 
	  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;
	}  
    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';}
			else {cd[--start]='1';}
            
		}
        strcpy(table1[(int)HT[i].Code].bcode,&cd[start]);// Assic 
	}
}	
//---------------     --------//
void Select(HuffmanTree &HT,int k,int *s1,int *s2)
{   
    int  i=1,a=1,b=1;
	while(a<=k)
	{
		if(HT[a].parent==0)break;
		else a++;
	}
	while(i<=k)
	{
		if(HT[i].parent==0&&HT[i].weight<HT[a].weight)
		{a=i;i++;}
		else i++;
	}
	*s1=a;
	while(b<=k)
	{
		if(HT[b].parent==0&&b!=a)break;
		else b++;
	}
	i=1;
	while(i<=k)
	{
		if(HT[i].parent==0&&i!=a&&HT[i].weight<HT[b].weight)
		{b=i;i++;}
		else i++;
	}
	*s2=b;
}
//------------------  -----------------------//
int  Tree_prin(HuffmanTree &HT,HTNode &H)
{
    char tmp[256];
	char t=':';
    FILE *fp;
    fp=fopen("PrinTree.txt","a");
    int i;
	fwrite(&H.Code,sizeof(char),1,fp);
	fwrite(&t,sizeof(char),1,fp);
	for(i=0;i<256;i++)tmp[i]='\0';
    if(H.parent)
	{
		for(i=0;i<=H.parent/4;i++)tmp[i]='-';
		tmp[i]='\n';
	}  
	else 
	{
		for(i=0;i<80;i++)tmp[i]='-';
	    tmp[i]='\n';
	}
		fputs(tmp,fp);
		fclose(fp);	
	if(H.lchild&&H.rchild)
	{
	  if(Tree_prin(HT,HT[H.lchild]))
      if(Tree_prin(HT,HT[H.rchild]))
	  return OK;	
	  return ERROR;
	}
    else return OK;
}
  
 //--------------------- CodeFile.txt---------------------------//                                       

void Encode( encodetable &table,char *path1 ,char *path2)
{   FILE *fp0,*fp1;
    char Asiscode[100];
	char temp;unsigned int j,flag=0;
	if(path1[0]=='*')
	fp0=fopen("text.txt","rb");
	else fp0=fopen(path1,"rb");
	if(path2[0]=='*')
	fp1=fopen("CodeFile.txt","wb");
	else 
	fp1=fopen(path2,"wb");
 	for (;fread(&temp,sizeof(char),1,fp0)==1;)	
	  {	       
	      for(j=0;j<100;j++)
		  Asiscode[j]='\0';		 
          strcpy(Asiscode,table[(int)temp].bcode);
		  fputs(Asiscode,fp1);						
	  }	
	fclose(fp0);
    fclose(fp1);	
}
//------------------- -------------------//
void TrantoBit()
{
    int i,Bit;
	char asc[32];
	FILE *fp1,*fp2;
	if((fp1=fopen("CodeFile.txt","rb"))==NULL)
	{
		cout<<" CodeFile.txt"<<endl;
        return;
	}
	fp2=fopen("CodeBit","wb");
	for(i=0;i<32;i++)asc[i]='0';
	for(;fread(asc,sizeof(char),32,fp1)!=0;)
	{
		Bit=0;
		for(i=0;i<32;i++)
		{
			if(asc[i]=='1')Bit=Bit|(1<<i);
			asc[i]='0';
		}
		fwrite(&Bit,sizeof(int),1,fp2);
	}
	fclose(fp2);
	fclose(fp1);
	cout<<" CodeBit.txt"<<endl;
}
//------------ ---------------//
void Decode(char *path1,char *path2)
{   HuffmanTree  p;	
    FILE *fp[3];
    int num=0,i;
	int cod;
	char txt,code1;
	HuffmanTree HH;
    HH=(HuffmanTree)malloc(257*sizeof(HTNode));
	if (path1[0]=='*')
     fp[0]=fopen("CodeFile.txt","rb");
	else fp[0]=fopen(path1,"rb");
    if((fp[1]=fopen("TextCode.txt","wb"))== NULL)
	{
		cout<<"cannot open file "<<endl;
	    return ;
	}
	if (path2[0]=='*')
     fp[2]=fopen("huffman.txt","rb");
	else fp[2]=fopen(path2,"rb");
   for(i=1;fread(&HH[i],sizeof(HTNode),1,fp[2])==1;){i++;num++;}// 
   for(p=&HH[num];fread(&code1,sizeof(char),1,fp[0])==1;)
	{	     	        
		    if(p->lchild||p->rchild)
			{   cod=(int)code1-48;
		        if(cod==0)p=&HH[p->lchild];
		        else if(cod==1)p=&HH[p->rchild];
			}
		    if(!(p->lchild||p->rchild))
			{
				txt=p->Code;
                fwrite(&txt,sizeof(char),1,fp[1]);
			    p=&HH[num];
			}
	   }
	fclose(fp[0]);
	fclose(fp[1]);
	fclose(fp[2]);
	}
//------------- ----------------//
void BitDcode()
{
    int i,Bit;
	char asc[32];
	FILE *fp1,*fp2;
	if((fp1=fopen("CodeBit","rb"))==NULL)
	cout<<" CodeBit.txt"<<endl;
	fp2=fopen("CodeFile.txt","wb");
	for(;fread(&Bit,sizeof(int),1,fp1)>0;)
	{   for(i=0;i<32;i++)asc[i]='0';
	    for(i=0;i<32;i++)
		if(Bit&(1<<i))asc[i]='1';
		fwrite(asc,sizeof(char),32,fp2);
	}
	fclose(fp2);
	fclose(fp1);
}
//-------------- -------------//
void main()
{   char SEL;
    int i,flag1=0,flag2=0,num=0;
	char path1[40],path2[40];
	FILE *fp0,*fp1,*fpx;
	encodetable table;
	HuffmanTree HH;
    HH=(HuffmanTree)malloc(257*sizeof(HTNode));
	while(!flag2)
	{
	      while(!flag1)
		  {	
		      cout<<" :E, :B, & :D, :T, :Q"<<endl;
		      cin>>SEL;
		      if(SEL!='E'&&SEL!='D'&&SEL!='T'&&SEL!='Q'&&SEL!='B')cout<<"  "<<endl;
		      else flag1=1;
		  }
		  switch(SEL)
		  {
		      case 'E':
				  {  
		  
		             
			         for (i=0;i<40;i++){path1[i]='\0';path2[i]='\0';}
			         cout<<" text.txt)"<<endl;
			         cin>>path1;
                     cout<<" CodeFile.txt)"<<endl;
			         cin>>path2;
                     tongji(path1);
			         Init(table);
			         Encode(table,path1,path2);
			         cout<<" :hffman.txt"<<endl;
					 flag1=0;
       
			         break;
				  }
			  case 'B':
				  { 
					
					  TrantoBit();
                      flag1=0;      
			          break;
				  }			   			  
		      case 'D':
				  { 
			         for (i=0;i<40;i++){path1[i]='\0';path2[i]='\0';}
					 if(((fopen("CodeFile.txt","r"))==NULL)&&((fpx=fopen("CodeBit","r"))==NULL))
                     cout<<" CodeFile.txt或CodeBit"<<endl;
                     path1[0]='*';	
					 if((fpx=fopen("CodeBit","r")))
					 {
						 fclose(fpx);
						 BitDcode();
					 }
                     cout<<" huffman.txt)"<<endl;
			         cin>>path2;
                     Decode(path1,path2);
			         cout<<" TextFile.txt"<<endl; 
					 flag1=0;      
			         break;                                                  
				  }
		     case 'T':
				 {  
                    fp0=fopen("huffman.txt","rb");
                    fp1=fopen("PrinTree.txt","wb");
					fclose(fp1);
                    for(i=1;fread(&HH[i],sizeof(HTNode),1,fp0)==1;){i++;num++;}
					Tree_prin(HH,HH[num]);
					cout<<" PrinTree.txt"<<endl;
					flag1=0;
			        break;
                    
				 }
	     	case 'Q':
				{ 
	               flag2=1;
		           break;
				}
		  } 
	}
		  
	 
	
}



⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -