精华内容
下载资源
问答
  • 哈夫曼编码译码器

    千次阅读 2020-02-08 16:47:21
    标题数据结构课设:哈夫曼编码译码器 总结一下这次的课程设计,遇到的问题是如何解决的。 功能: 将权值数据存放在数据文件data.txt中。 键盘输入字符集大小n、n个字符和n个权值,建立哈夫曼树。 利用建好的哈夫曼...

    标题数据结构课设:哈夫曼编码译码器

    总结一下这次的课程设计,遇到的问题是如何解决的。

    功能:

    1. 将权值数据存放在数据文件data.txt中。
    2. 键盘输入字符集大小n、n个字符和n个权值,建立哈夫曼树。
    3. 利用建好的哈夫曼树生成哈夫曼编码。
    4. 使用data.txt中的权值数据生成的哈夫曼编码,将文件Text.txt中的字符串编码保存到HuffmanCode.txt文件中。
    5. 使用data.txt中的权值数据生成的哈夫曼编码,将文件HuffmanCode.txt中的哈夫曼编码解码生成字符串保存到Text.txt文件中。
    6. 输出哈夫曼编码到code.txt文件。

    其中,功能1、2、3、6是基本课程设计要求的功能,为了增加代码的实用性,
    导师提议我增加4、5功能。

    结构体定义:

    typedef struct { //定义二叉树结点类型
        char data ;
    	double weight;
        int lchild, rchild ,parent; 
    } HTNode , *HuffmanTree;//定义二叉树结点指针类型
    typedef struct{//定义哈夫曼编码的结构体
    	char cd[11];
    	char data;
    	int len;
    }HCNode , *HuffmanCode;
    

    实现代码:

    功能:

    • 建立哈夫曼树哈夫曼编码
    • 键盘输入字符
    • 完成哈夫曼编码和字符的转换
    • 从文件中读取数据并保存
    • 将得到的数据保存到文件中
    #include <stdio.h>
    #include <stdlib.h>
    #include <conio.h>
    #include <string.h>
    #include "huff2.h"
    #define MAX_LINE 1024
    //选择最小的两个结点
    void Select(HuffmanTree &HT,int i,int &s1,int &s2){
    	int k=0;
    	s1=i-1;
    	s2=i;
    	for(int j=i;j>0;j--){
    		if(HT[j].parent==0){
    			if(HT[j].weight<HT[s2].weight){
    				s1=s2;
    				s2=j;
    			
    			}
    			if(HT[j].weight<HT[s1].weight&&j!=s2){
    				s1=j;
    			}
    		
    		}
    
    	}
     	if(HT[s1].parent!=0){
    		s1=1;
    		for(;k<i;k++){
    			if(HT[k].parent==0){
    				if(HT[k].weight<HT[s1].weight){
    					s1=k;
    				}
    			}
    		}
    	}
    }
    //构造哈夫曼树及求字符的编码
    void HuffmanCoding(HuffmanTree &HT,HuffmanCode &HC,char data[],double weight[],int n){
    	int i,m,start,c,f;
    	char cd[26]={0};
    	if(n<=1) return;
    	m = 2*n-1;
    	HT = (HuffmanTree)malloc((m+1)*sizeof(HTNode));
    	HC = (HuffmanCode)malloc((n+1)*sizeof(HCNode));
    	//构建哈夫曼树
    	for(i=1;i<=n;i++) {
    		HT[i].data = data[i-1];
    		HT[i].weight = weight[i-1];
    		HT[i].parent = 0;
    		HT[i].lchild = 0;
    		HT[i].rchild = 0;
    	}
    
    	for(;i<=m;i++) {
    		HT[i].data = NULL;
    		HT[i].weight = 0.000000;
    		HT[i].parent = 0;
    		HT[i].lchild = 0;
    		HT[i].rchild = 0;
    	}
    	for(i=n+1;i<=m;i++){
    		int s1,s2;
    		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;
    	}
    	//求哈夫曼编码
    	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';
    		}
    		HC[i].len = n-start-1;
    		for(int z=0;start<n;start++,z++){
    			
    			HC[i].cd[z] = cd[start];
    			
    		}
    		HC[i].data = HT[i].data;
    	}
    
    }
    //将编码表输出到文件code.txt中
    void CreateHuffman(HuffmanCode &HC,int n){
    	FILE * fp=fopen("code.txt","w+");
    	if(fp==NULL){
    		printf("无法打开code.txt");
    		exit(0);
    	}
        for(int i=1;i<=n;i++){
    		fputc(HC[i].data,fp);
    		fputs("    ",fp);
    		fputs(HC[i].cd,fp);
    		fputc('\n',fp);
    	}
    	if(fclose(fp)){
    		printf("无法关闭code.txt");
    		exit(0);
    	}
    }
    
    //将编码保存到文件HuffmanCode.txt
    void CodePrintTxt(char code[],int i){
    	FILE * fp=fopen("HuffmanCode.txt","w+");
    	int j;
    	if(fp==NULL){
    		printf("无法打开HuffmanCode.txt");
    		exit(0);
    	}
        for(j=0;j<=i;j++){
    		fputc(code[j],fp);
    	}
    	if(fclose(fp)){
    		printf("无法关闭HuffmanCode.txt");
    		exit(0);
    	}
    }
    //将编码保存到文件Text.txt
    void DataPrintTxt(char data[],int i){
    	FILE * fp=fopen("Text.txt","w+");
    	int j;
    	if(fp==NULL){
    		printf("无法打开Text.txt");
    		exit(0);
    	}
        for(j=0;j<=i;j++){
    		fputc(data[j],fp);
    	}
    	if(fclose(fp)){
    		printf("无法关闭Text.txt");
    		exit(0);
    	}
    }
    
    
    
    //初始化数据之从文件data.txt中读出权值数据
    void init1(HuffmanTree &HT,HuffmanCode &HC){
    	int j,q,w;
    	char data[52]={0};
    	double weight[52]={0};
    
    	FILE *file=fopen("data.txt","r");
    	if(file==NULL){
    		printf("数据为空!!!");
    	}else{
    		for(j=0;j<182;j++){		
    			fscanf(file, "%c%lf", &data[j],&weight[j]);
    		}
    		fclose(file);
    		//将数据正常填装到两个数据集合中
    		for(q=0;q<26;q++){
    			data[q]=data[2*q];
    			weight[q]=weight[2*q];
    		}
    		for(w=0;w<25;w++){
    			for(q=0;q<25;q++){
    				if(weight[q]<weight[q+1]){
    					char d;
    					double w;
    					w=weight[q+1];
    					weight[q+1]=weight[q];
    					weight[q]=w;
    					d=data[q+1];
    					data[q+1]=data[q];
    					data[q]=d;
    				}
    			}
    		}
    	}
    	HuffmanCoding(HT,HC,data,weight,26);
    
    	CreateHuffman(HC,26);
    }
    //从键盘输入
    void init2(HuffmanTree &HT,HuffmanCode &HC){
    	int q,e,i;
    	double w;
    	char data[26]={0};
    	char d[26]={0};
    	double weight[26]={0};
    
    	printf("请输入您想定义的字符串\n");
    	scanf("%s",data);
    	
    	//排除相同的字符
    	q=0;
    	while(data[q]){
    		e=q+1;
    		while(data[e]){
    			if(data[e]==data[q]){
    				i=e;	
    				while(data[i+1]){
    					data[i]=data[i+1];
    					i++;
    				}
    				data[i]=NULL;
    			}
    			else
    				e++;
    		}
    		q++;
    	}
    	q=0;
    	while(data[q]){
    		printf("请输入%c的权值:\n",data[q]);
    		scanf("%lf",&w);
    		weight[q] = w;
    		q++;
    	}	
    	for(i=0;data[i];i++){
    		for(q=0;data[q];q++){
    			if(weight[q]<weight[q+1]){
    				char d;
    				double w;
    				w=weight[q+1];
    				weight[q+1]=weight[q];
    				weight[q]=w;
    				d=data[q+1];
    				data[q+1]=data[q];
    				data[q]=d;
    			}
    		}
    	}
    	HuffmanCoding(HT,HC,data,weight,q);
    	
    	CreateHuffman(HC,q);
    }
    
    //将编码转换成数据(解码)
    void CodeToData(HuffmanTree HT,char code[]){//n为编码的长度,data为编码
    	int i,m,w,c;
    	char data[MAX_LINE]={0};
    	i=0;c=0;w=0;	
    	while(HT[w].parent!=0){
    		w++;
    	}
    	printf("解码为:");
    	i=0;
    	while(code[i]){
    		if(code[i]==' '){
    			data[c++] = ' ';
    			printf(" ");
    		}
    		m=w;
    		while(1){
    			if(code[i]=='0') m=HT[m].lchild;
    			else if(code[i]=='1') m = HT[m].rchild;
    			else {
    				i++;
    				if(!code[i])
    					break;
    				continue;
    			}
    			i++;
    			if(HT[m].lchild==0&&HT[m].rchild==0){
    				data[c++] = HT[m].data;
    				printf("%c",HT[m].data);
    				break;
    			}
    		}
    	}
    	printf("\n");
    	DataPrintTxt(data,i);//将数据保存到文件Text.txt
    }
    //将数据转换成编码(编码)
    void DataToCode(HuffmanCode HC,char data[]){//data为字符数据,p为保存的编码,n为字符的长度
    	int j,k,l,i;
    	char code[10000]={0};
    	j=0;i=0;
    	while(data[j]){
    		if(data[j]==' ')
    			code[i++] = ' ';
    		for(k=1;k<27;k++){
    			if(data[j]==HC[k].data){
    				//把每个字符的哈夫曼码保存到p中
    				for(l=0;l<HC[k].len;l++){
    					code[i++] = HC[k].cd[l];
    				}
    			}
    		}
    		j++;
    	}
    	printf("哈夫曼编码为:");
    	for(j=0;j<=i;j++){
    		printf("%c",code[j]);
    	}
    	printf("\n");
    	CodePrintTxt(code,i);//将编码保存到文件HuffmanCode.txt
    }
    //读取Text文件内容并保存
    void ReadTxtT(HuffmanCode HC,char data[]){//n的作用:用来识别读出哪种文件.
    	FILE * fp=fopen("Text.txt","r");
    	if(fp==NULL){
    		printf("无法打开Text.txt");
    		exit(0);
    	}
    
    	while(fgets(data,MAX_LINE,fp) != NULL)
    	{
    		DataToCode(HC,data);//将数据转换成编码
    	}
    
    	if(fclose(fp)){
    		printf("无法关闭Text.txt");
    		exit(0);
    	}	
    }
    //读取HuffmanCode文件内容并保存
    void ReadTxtH(HuffmanTree HT,char code[]){//n的作用:用来识别读出哪种文件.
    	FILE * fp=fopen("HuffmanCode.txt","r");
    	if(fp==NULL){
    		printf("无法打开HuffmanCode.txt");
    		exit(0);
    	}
    	while(fgets(code,MAX_LINE,fp) != NULL)
    	{
    		CodeToData(HT,code);//将编码转换成数据
    	}
    
    	if(fclose(fp)){
    		printf("无法关闭HuffmanCode.txt");
    		exit(0);
    	}	
    }
    
    
    

    二级菜单的显示:

    直观的显示出程序的功能

    void menu1(){
    	printf("		|*******************************************************************************|\n");
    	printf("		|-------------------Huffman编码解码器使用菜单-----------------------------------|\n");
    	printf("		|-------------------功能1:读取文件并建立哈夫曼树和哈夫曼编码--------------------|\n");
    	printf("		|-------------------功能2:键盘输入字符以及权值建立哈夫曼树和哈夫曼编码----------|\n");
    	printf("		|-------------------功能3:编码或解码文件中的数据--------------------------------|\n");	
    	printf("		|-------------------功能0:退出系统----------------------------------------------|\n");
    	printf("		|-------------------请输入数字:0、1、2使用相对应的功能-------------------------|\n");
    	printf("		|*******************************************************************************|\n");
    }
    void menu2(){	
    	printf("		|*******************************************************************************|\n");
    	printf("		|-------------------Huffman编码解码器使用菜单-----------------------------------|\n");
    	printf("		|-------------------功能1:编码--------------------------------------------------|\n");
    	printf("		|-------------------功能2:解码--------------------------------------------------|\n");
    	printf("		|-------------------功能0:退出系统----------------------------------------------|\n");
    	printf("		|-------------------请输入数字:0、1、2使用相对应的功能-------------------------|\n");
    	printf("		|*******************************************************************************|\n");
    }
    

    主函数小黑窗功能选项的实现:

    显示出代码的功能,二级菜单的穿接,友好的提示词。

    
    void main()
    {
    	int fun;
    	char data[MAX_LINE]={0};
    	char code[10000]={0};
    	HuffmanTree HT; 
    	HuffmanCode HC;
    	menu1();
    	scanf("%d",&fun);
    	switch(fun){
    		case 1:
    			init1(HT,HC);
    			menu2();
    			scanf("%d",&fun);		
    			while(fun){
    				switch(fun){
    					case 1:
    						printf("请输入A-Z字符(大写):\n");
    						scanf("%s",data);
    						printf("(如果您输入了错误的字符串,则编码为空!)");
    						DataToCode(HC,data);
    						break;
    					case 2:
    						printf("请输入编码:\n");
    						scanf("%s",code);
    						printf("(如果您输入了错误的字符,则跳过错误的字符,不够一个编码的舍去。)");
    						CodeToData(HT,code);
    						break;
    					case 0:
    						printf("谢谢使用!\n");
    						break;
    					default:
    						printf("你的输入错误!请重新输入!\n");
    						break;
    				}
    				menu2();
    				scanf("%d",&fun);
    			}
    			
    			break;
    		case 2:
    			init2(HT,HC);
    			menu2();
    			scanf("%d",&fun);
    			while(fun){
    			   switch(fun){
    					case 1:
    						printf("请输入您设定的字符串:\n");
    						scanf("%s",data);
    						printf("(如果您输入了错误的字符串,则编码为空!)");
    						DataToCode(HC,data);
    						break;
    					case 2:
    						printf("请输入编码:\n");
    						scanf("%s",code);
    						printf("(如果您输入了错误的字符,则跳过错误的字符,不够一个编码的舍去。)");
    						CodeToData(HT,code);
    						break;
    					case 0:
    						printf("谢谢使用!\n");
    						break;
    					default:
    						printf("你的输入错误!请重新输入!\n");
    						break;
    				}
    				menu2();
    				scanf("%d",&fun);
    			}
    			break;
    		case 3:
    			init1(HT,HC);
    			menu2();
    			scanf("%d",&fun);
    			while(fun){
    				switch(fun){
    					case 1:
    						ReadTxtT(HC,data);
    						break;
    					case 2:
    						ReadTxtH(HT,code);
    						break;
    					case 0:
    						printf("谢谢使用!\n");
    						break;
    					default:
    						printf("你的输入错误!请重新输入!\n");
    						break;
    				}
    				menu2();
    				scanf("%d",&fun);
    			}
    			break;
    		case 0:
    		    printf("谢谢使用!\n");
    		    exit(0);
    		default:
    			printf("你的输入错误!请重新启动!\n");
    			break;
    	}
    }
    

    总结:这次的数据结构使我认识到了,代码应该要认识到代码存在的意义,是为什么服务的,要充分的想到使用者会遇到的误点,通过代码强制阻止或者友好的提示词提示使用者,从而增强代码的健壮性。当实现了最基本的功能之后要看看能不能提高代码的实用性。毕竟只有有用的代码才有存在的意义。最后,bug无处不在,只有一次次的调试、修改才能使bug无处可躲,当遇到暂时无法解决的bug,可以先进行其他的地方,并从别的方向带入,或许就可以解决了。

    展开全文
  • 哈夫曼编码译码器实验报告.rar
  • 哈夫曼编码译码器 数据结构课程设计 哈夫曼树以及编码译码问题
  • 哈夫曼编码译码器,任务书,看清楚
  • java哈夫曼编码译码器

    2017-12-23 17:46:47
    java实现对文件进行哈夫曼编码译码实现。。。。。。。。
  • 哈夫曼编码译码器课程设计,非常好的课程设计文档案例。希望可以帮助您的课程设计更加顺利。
  • 用python写的,面向对象的哈夫曼编码译码器,有基于Tkinter简单图形界面,可从文件中导入,每个字符的频度存储在文件nodes.txt中,可自行修改,可通过类似于Tree命令的方式输出哈夫曼树,解压后运行dialog.pyw
  • 很好的的哈夫曼编码译码器源码。。。。。。。。。。。。。。。。。。。。
  • 这个简单的小程序用C语言编写,实现了简单的哈夫曼编码译码,是通过文件操作实现的,数据结构很实用的代码,更好理解。
  • 哈夫曼编码译码器.rar

    2020-07-11 15:53:03
    利用哈夫曼树生成最优编码,程序可以写文件,进而从写文件中再读取文件,然后对读取的文件进行哈夫曼编码,对文件进行编码,然后将编码文件存储成huf文件,然后再对huf文件进行译码译码后再将译码文件保存成txt...
  • 哈夫曼编码译码器 利用哈夫曼算法的编码和译码系统,重复地显示并处理以下项目,直到选择退出为止 。
  • 课程设计 大二的自己的课程设计 主要是哈夫曼编码和译码的c++的程序 包括根据字符的权重进行编码 并对文件进行编码译码
  • 编译环境:VC++ 6.0编程要求简述:[问题描述]利用哈夫曼编码进行信息通讯可以大大提高信道利用率,缩短信息传输时间,降低传输成本。但是,这要求在发送端通过一个编码系统对待传数据预先编码;在接收端将传来的数据...

    编译环境:VC++ 6.0编程要求简述:

    [问题描述]

    利用哈夫曼编码进行信息通讯可以大大提高信道利用率,缩短信息传输时间,降低传输成本。但是,这要求在发送端通过一个编码系统对待传数据预先编码;在接收端将传来的数据进行译码(复原)。对于双工信道

    (即可以双向传输信息的信道),每端都需要一个完整的编/译码系统。试为这样的信息收发站写一个哈夫曼码的编译码系统。

    [基本要求]

    一个完整的系统应具有以下功能:

    (l)I:初始化

    (Initialization)。从终端读入字符集大小n,及n个字符和m个权值,建立哈夫曼树,并将它存于文件hfmtree中。

    (2)C:编码

    (Coding)。利用已建好的哈夫曼树(如不在内存,则从文件hfmtree中读入),对文件tobetrans中的正文进行编码,然后将结果存入文件codefile中。

    (3)D:编码

    (Decoding)。利用已建好的哈夫曼树将文件codefile中的代码进行译码,结果存入文件textfile中。

    (4)P:印代码文件

    (Print)。将文件codefile以紧凑格式显示在终端上,每行50个代码。同时将此字符形式的编码文件写入文件codeprint中。

    (5)T:印哈夫曼树 (Tree

    printing)。将已在内存中的哈夫曼树以直观的方式

    (树或凹入表形式)显示在终端上,同时将此字符形式的哈夫曼树写入文件treeprint中。

    程序源代码:

    文件一:my.h(自定义头文件)

    //调用有文件以及定义常数值

    #include "stdio.h"

    #include "string.h"

    #define MAXLEN 100

    #define MAXLEN_1 1000

    //自定义类型声明

    typedef struct

    {

    int weight;

    char data;

    int lchild,rchild,parent;

    }HFMTnode;

    typedef HFMTnode HFMT[MAXLEN];

    typedef

    struct

    {

    char code[MAXLEN];

    char data;

    }HFMCnode;

    typedef HFMCnode HFMC[MAXLEN];

    typedef

    struct

    {

    char data[MAXLEN];

    int top;

    }seqstack;

    //文件全局变量外部声明

    extern int n;

    //所有子函数声明

    void InitializeTree(HFMT T);

    void InputTree(HFMT T);

    void Selectleast(HFMT T,int *p1,int *p2);

    void CreateHFMT(HFMT T);

    void push(char x);

    void hfmc(HFMT T,int i);

    void CreateHFMC(HFMT T,HFMC C);

    void Initialization(HFMT T,HFMC C);

    void Codeing(HFMC C);

    void Decodeing(HFMC C);

    void Showcodefile();

    void Showhfmt(HFMT T);

    int TreeDepth(HFMT T,int i);

    void print(HFMT T,int i,int a);

    文件二:Initialization.c(初始化)

    #include

    "my.h"

    seqstack

    s;

    //初始化树

    void InitializeTree(HFMT T)

    {

    int i;

    printf("请输入要输入的字符个数n(n应大于1):");

    scanf("%d",&n);

    for(i=0;i<2*n-1;i++)

    {

    T.weight=-1;

    T.lchild=-1;

    T.rchild=-1;

    T.parent=-1;

    T.data='\0';

    }

    }

    //输入树

    void InputTree(HFMT T)

    {

    int i;

    for(i=0;i

    {

    printf("请输入第%d个字符与权重:",i+1);

    getchar();

    scanf("%c %d",&T.data,&T.weight);

    }

    }

    //从树数组中选取权值最小的两个元素

    void Selectleast(HFMT T,int *p1,int *p2)

    {

    long min1,min2;

    int i;

    min1=min2=999999;

    for(i=0;i<2*n-1;i++)

    {

    if(T.parent==-1&&T.weight!=-1)

    if(T.weight

    {

    min1=T.weight;

    *p1=i;

    }

    }

    for(i=0;i<2*n-1;i++)

    {

    if(T.parent==-1&&T.weight!=-1)

    if(T.weight

    {

    min2=T.weight;

    *p2=i;

    }

    }

    }

    //构建哈夫曼树

    void CreateHFMT(HFMT T)

    {

    int i,p1,p2;

    InitializeTree(T);

    InputTree(T);

    for(i=n;i<2*n-1;i++)

    {

    Selectleast(T,&p1,&p2);

    T.weight=T[p1].weight+T[p2].weight;

    T.lchild=p1;

    T.rchild=p2;

    T[p1].parent=T[p2].parent=i;

    }

    }

    //入栈

    void push(char x)

    {

    s.top++;

    s.data[s.top]=x;

    }

    //构建哈夫曼树编码库递归调用函数

    void hfmc(HFMT T,int i)

    {

    int j;

    j=T.parent;

    if(j!=-1)

    {

    if(i==T[j].lchild)

    push('0');

    if(i==T[j].rchild)

    push('1');

    hfmc(T,j);

    }

    }

    //构建哈夫曼树编码库

    void CreateHFMC(HFMT T,HFMC C)

    {

    int i,j;

    s.top=-1;

    for(i=0;i

    {

    hfmc(T,i);

    C.data=T.data;

    for(j=0;s.top!=-1;j++)

    {

    C.code[j]=s.data[s.top];

    s.top--;

    }

    C.code[j]='\0';

    }

    }

    //初始化函数

    void Initialization(HFMT T,HFMC C)

    {

    FILE *out;

    int i;

    CreateHFMT(T);

    CreateHFMC(T,C);

    if((out=fopen("hfmt.dat","w"))!=NULL)

    {

    fprintf(out,"%d",n);

    for(i=0;i

    fprintf(out,"%c",T.data);

    for(i=0;i<2*n-1;i++)

    fprintf(out,"\n%d %d %d

    %d",T.weight,T.parent,T.lchild,T.rchild);

    }

    else

    {

    printf("\n文件打开错误!");

    return;

    }

    fclose(out);

    printf("\n初始化完毕!");

    }

    文件三:Codeing.c(编码)

    #include

    "my.h"

    //编码函数

    void Codeing(HFMC C)

    {

    FILE

    *in,*out;

    char zw[MAXLEN],code[MAXLEN_1];

    int i=0,j,k,c_len,error=1;

    c_len=0;//编码正文初始长度置零

    //打开文件toberrans.dat并读取正文存入正文数组zw

    if((in=fopen("tobetrans.dat","r"))!=NULL)

    {

    zw=fgetc(in);

    while(feof(in)==0)

    {

    i++;

    zw=fgetc(in);

    }

    zw='\0';

    }

    else

    {

    printf("\n文件打开错误!");

    return;

    }

    fclose(in);

    //进行编码

    for(i=0;zw!='\0';i++)

    {

    error=1;//错误置为真

    for(j=0;j

    {

    if(zw==C[j].data)

    {

    for(k=0;C[j].code[k]!='\0';k++)

    {

    code[c_len]=C[j].code[k];

    c_len++;

    }

    error=0;//若编码库存在匹配字符,则错误为假

    break;

    }

    }

    if(error==1)

    break;

    }

    code[c_len]='\0';

    if(error)

    {

    printf("\n编码错误,请重新检查!");

    return;

    }

    else

    {

    printf("\n正文为:%s",zw);

    printf("\n编码为:%s",code);

    //打开文件codefile.dat,并将编码正文写入文件

    if((out=fopen("codefile.dat","w"))!=NULL)

    fprintf(out,"%s",code);

    else

    {

    printf("\n打开文件错误!");

    return;

    }

    fclose(out);

    printf("\n编码成功!");

    }

    }

    文件四:Decodeing.c(译码)

    #include

    "my.h"

    //译码函数

    void Decodeing(HFMC C)

    {

    FILE *in,*out;

    int i,j,k,c_max,c_len,dq,dq_len,flag,error=0;//error初始状态为假

    char code[MAXLEN_1],a[MAXLEN],zw[MAXLEN];

    code[0]='\0';

    //打开文件codefile.dat,读取编码正文写入内存,存入数组code

    if((in=fopen("codefile.dat","r"))!=NULL)

    {

    fscanf(in,"%s",code);

    }

    else

    {

    printf("\n打开文件错误!");

    return;

    }

    fclose(in);

    //求编码正文长度c_len

    for(i=0;code!='\0';i++);

    c_len=i;

    if(c_len==0)

    error=1;//错误情况1

    //求编码库最长编码长度c_max

    c_max=0;

    for(i=0;i

    {

    for(j=0;C.code[j]!='\0';j++);

    if(c_max

    c_max=j;

    }

    //进行译码

    dq=0; //dq用来记录code数组的读取位置

    k=0; //k用来记录zw数组读取位置

    while(dq

    {

    flag=1;

    dq_len=c_max;

    for(i=dq,j=0;j

    a[j]=code;

    a[j]='\0';

    while(flag&&!error)//若无错误且flag为1则继续循环

    {

    for(i=0;i

    {

    if(strcmp(a,C.code)==0)

    {

    zw[k]=C.data;

    k++;

    flag=0;

    break;

    }

    }//若找到编码库里匹配的编码,则结束循环

    if(flag)

    {

    dq_len--;

    a[dq_len]='\0';

    }//未找到则将当前长度减一,继续寻找

    if(dq_len<1)

    error=1;//译码错误情况2

    }

    dq=dq+dq_len;//编码正文当前读取位置改变

    }

    zw[k]='\0';//在zw数组的最后一个位置添加字符串结束符

    if(error)

    {

    printf("\n译码错误,请重新检查!");

    return;

    }

    else

    {

    //打印编码正文以及译码正文

    printf("\n编码为:%s",code);

    printf("\n译码为:%s",zw);

    //打开文件textfile.dat,将译码正文即数组zw写入文件

    if((out=fopen("textfile.dat","w"))!=NULL)

    fprintf(out,"%s",zw);

    else

    {

    printf("\n打开文件错误!");

    return;

    }

    fclose(out);

    printf("\n译码成功!");

    }

    }

    文件五:Showcodefile.c(显示代码文件)

    #include

    "my.h"

    //显示编码文件内容函数

    void Showcodefile()

    {

    FILE *in;

    char code[MAXLEN_1];

    int i;

    code[0]='\0';

    //打开文件

    if((in=fopen("codefile.dat","r"))!=NULL)

    {

    fscanf(in,"%s",code);

    }

    else

    {

    printf("\n打开文件错误!");

    return;

    }

    fclose(in);

    //打印内容

    printf("\n代码文件内容为:");

    for(i=0;code!='\0';i++)

    {

    if(iP==0)

    printf("\n");

    printf("%c",code);

    }

    }

    文件六:Showhfmt.c(以凹入法显示哈夫曼树)

    #include

    "my.h"

    //求哈夫曼树深度函数

    int TreeDepth(HFMT T,int i)

    {

    int ldep,rdep;

    if(T.lchild==-1)

    return 1;

    else

    {

    ldep=TreeDepth(T,T.lchild);

    rdep=TreeDepth(T,T.rchild);

    if(ldep>rdep)

    return ldep+1;

    else

    return rdep+1;

    }

    }

    展开全文
  • 学生写的哈夫曼编码译码器,并附有实验报告
  • 用c语言实现的哈夫曼编码译码器,是数据结构中的经典案例。里面含有设计报告和源代码。把好的东西贡献出来,供大家参考一下。
  • 这是我自己写的哈夫曼编码译码器的代码和报告,有需要和兴趣的可以看看,属于初学数据结构的人的材料,资深写程序的可以忽略。
  • 完整的c语言哈夫曼编码译码器源代码 并且有完整的课程书记报告 欢迎广大学生朋友下载学习
  • 数据结构课程设计模——哈夫曼编码译码器.c语言程序
  • 哈夫曼编码译码器 a)需求分析 b)概要设计 c)详细设计 d)调试分析 e)心得体会 附程序
  • 哈夫曼编码译码器实验报告,内有源代码,vc++6.0写的
  • 数据结构课程设计模——哈夫曼编码译码器.doc
  • 中北大学软件学院数据结构课程设计哈夫曼编码译码器 中 北 大 学课程设计任务书学学 院院软件学院专专 业业软件工程学学 生生 姓姓 名名廉证皓学学 号号1021011535设设 计计 题题 目目哈夫曼编码/译码器起起 迄迄 日...

    中北大学软件学院数据结构课程设计哈夫曼编码译码器

    中 北 大 学课程设计任务书学学 院院软件学院专专 业业软件工程学学 生生 姓姓 名名廉证皓学学 号号1021011535设设 计计 题题 目目哈夫曼编码/译码器起起 迄迄 日日 期期2010 年 12 月 5 日 2011 年 12 月 20日设设 计计 地地 点点软件学院机房指指 导导 教教 师师何志英发任务书日期2010 年 12 月 5 日课课 程程 设设 计计 任任 务务 书书1设计目的数据结构课程主要介绍最常用的数据结构,阐明各种数据结构内在的逻辑关系,讨论其在计算机中的存储表示,以及在其上进行各种运算时的实现算法,并对算法的效率进行简单的分析和讨论。进行数据结构课程设计要达到以下目的了解并掌握数据结构与算法的设计方法,具备初步的独立分析和设计能力;初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能;提高综合运用所学的理论知识和方法独立分析和解决问题的能力;训练用系统的观点和软件开发一般规范进行软件开发,培养软件工作者所应具备的科学的工作方法和作风。2设计内容和要求设计内容设计一个利用哈夫曼算法的编码和译码系统,重复地显示并处理以下项目,直到选择退出为止。1 将权值数据存放在数据文件文件名为 data.txt,位于当前目录中;2 分别采用动态和静态存储结构; 初始化键盘输入字符集大小 n、n 个字符和 n 个权值,建立哈夫曼树;3 编码利用建好的哈夫曼树生成哈夫曼编码;输出编码;设计要求1 符合课题要求,实现相应功能;2 要求界面友好美观,操作方便易行;3 注意程序的实用性、安全性。3设计工作任务及工作量的要求包括课程设计说明书、程序等1 选择合适的数据结构,并定义数据结构的结构体;2 根据程序所要完成的基本要求和程序实现提示,设计出完整的算法;3 按格式要求写出课程设计说明书。课课 程程 设设 计计 任任 务务 书书4主要参考文献1 李云清,杨庆红.数据结构(C 语言版).北京人民邮电出版社,2004.2 严蔚敏,吴伟民.数据结构(C 语言版).北京清华大学出版.1997.3 苏光奎,李春葆.数据结构导学.北京清华大学出版.2002. 4 周海英,马巧梅,靳雁霞.数据结构与算法设计.北京国防工业出版社,2007.5 张海藩. 软件工程导论. 北京清华大学出版社.2003.5设计成果及要求应用软件课程设计说明书6工作计划及进度2011 年 12 月 5 日 2011 年 12 月 8 日 需求分析和概要设计;2011 年 12 月 9 日 2011 年 12 月 15 日 详细设计及编码;2011 年 12 月 16 日 2011 年 12 月 19 日 测试;撰写课程设计说明书;2011 年 12 月 20 日 验收、成绩考核。 学院审查意见签字 2011 年 12 月 20日

    展开全文
  • 这是一个小组做的关于哈夫曼编码译码器的课程设计,包括PPT,源代码,还有两个成员做的课程设计报告、任务书

空空如也

空空如也

1 2 3 4 5 ... 13
收藏数 251
精华内容 100
关键字:

哈夫曼编码译码器