必威体育Betway必威体育官网
当前位置:首页 > IT技术

c语言实现霍夫曼树

时间:2019-11-02 13:45:34来源:IT技术作者:seo实验室小编阅读:58次「手机版」
 

霍夫曼树

c语言实现霍夫曼树


#include<stdio.h>
#include<string.h>
#include<stdlib.h>

 
typedef struct {
	char value;
	int weight;
	int parent,lchild,rchild;	
	char cd[20];
}HTNode;
 
HTNode SSS[26];
int sum=0;

void HTcd(char str[]){
 	int m;
	char tempcd[20];
	char voidone[20]="";
	int t;
 	int sub;
 	int weights[26];
	char values[26];
 	int i,j;
 	int flag=0;
 	int min1s1,min2s2;
 	int counter;
 	HTNode min1,min2;
 	
 	
	for (i=0;str[i]!='\0';i++){
		flag=0;
  		for (j=0;j<=i;j++){
   			if (str[i]==values[j]){
    			weights[j]++;
    			flag=1;
   			}
  		}
  		if (flag==0){
    		weights[sum]=1;
    		values[sum]=str[i];
     		sum++;
  		}	
 	}
 	for(i=0;i<sum;i++){
 		printf("%c的权为%d\n",values[i],weights[i]);
	}
	m=(2*sum)-1;
 	for(i=0;i<sum;i++){
	 	SSS[i].value=values[i];
	 	SSS[i].weight=weights[i];
	 	SSS[i].parent=0;
	 	SSS[i].lchild=0;
	 	SSS[i].rchild=0;
	}
	for(;i<=m;i++){
	 	SSS[i].value=0;
	 	SSS[i].weight=0;
	 	SSS[i].parent=0;
	 	SSS[i].lchild=0;
	 	SSS[i].rchild=0;
	}
	for(i=0;i<m;i++){
		sub+=SSS[i].weight;
	}
	counter=sum;
	for(i=sum;i<m;i++){
		min1s1=i-1;
		min2s2=i-1;
		min1.weight=sub+1;
		min2.weight=sub+1;
		for(j=0;j<counter;j++){
			if(SSS[j].parent!=0) continue;
			else if(min1.weight>=SSS[j].weight){
			min1.weight=SSS[j].weight;
			min1.value=SSS[j].value;
			min1s1=j;
			} 
		}
		for(j=0;j<counter;j++){
			if(SSS[j].parent!=0) continue;
			else if (min2.weight>=SSS[j].weight&&SSS[j].value!=min1.value){
				min2.weight=SSS[j].weight;
				min2.value=SSS[j].value;
				min2s2=j;
			}	
		}	
		counter++;
		SSS[min1s1].parent=i;
		SSS[min2s2].parent=i;
		SSS[i].lchild=min1s1;
		SSS[i].rchild=min2s2;
		SSS[i].weight=SSS[min1s1].weight+SSS[min2s2].weight;
	}


	printf("建好后的树为:\n");
	for(j=0;j<sum;j++){
		i=j;
		t=0;
		for(;SSS[i].parent!=0;) {
			if(SSS[(SSS[i].parent)].lchild==i)  tempcd[t]='0';
			else if(SSS[(SSS[i].parent)].rchild==i) tempcd[t]='1'; 
			i=SSS[i].parent;
			t++;
		}
		strrev(tempcd);
		strcpy(SSS[j].cd,tempcd);
		strcpy(tempcd,voidone);
	}
	for(j=0;j<m;j++){
		printf("第%d个字符%c的权为%d,父为%d,左子为%d,右子为%d,霍夫曼码为%s\n",j,SSS[j].value,SSS[j].weight,SSS[j].parent,SSS[j].lchild,SSS[j].rchild,SSS[j].cd);
	}
	printf("源码编码后为:");
	for(i=0;str[i]!='\0';i++){
		for(j=0;j<sum;j++){
			if(SSS[j].value==str[i]) printf("%s ",SSS[j].cd);
		}
	}
	printf("\n");
}

void HTtra(char str[]){
	printf("密码翻译后为:");
 	int i,j=0;
	i=(2*sum)-2;
 	while (str[j]!='2'){
 		if(str[j]=='0') i=SSS[i].lchild;
 		else if(str[j]=='1') i=SSS[i].rchild;	
 		if(SSS[i].lchild==0&&SSS[i].rchild==0) {
			printf("%c",SSS[i].value);i=(2*sum)-2;
		}
 		j++;
	 }	 
}
 
int main(){
 	int process=0;
 	char str[200];
 	char decode[200];
	FILE *fp;  
	int i,j;
	char acc[20];
	
	if((fp=fopen("D:\\SourceFile.txt","r"))==NULL) printf("打开文件失败,不能读取源码\n");
	else{
		fscanf(fp,"%s",&str);
		rewind(fp);
		fclose(fp);
		HTcd(str);
		process=1;
	}

	if((fp=fopen("D:\\Code.txt","w"))==NULL) printf("打开文件失败,不能输出编码字典\n");
	else if(process==1){
		printf("打开文件成功\n");
		for(i=0;i<sum;i++) {
		fprintf(fp,"%c的编码为",SSS[i].value);
			fprintf(fp,"%s\n",SSS[i].cd);
		}
		rewind(fp);
		fclose(fp);
	}
			
	if((fp=fopen("D:\\ResultFile.txt","w"))==NULL) printf("打开文件失败,不能输出编码\n");
	else if(process==1){
		fprintf(fp,"源字符串的编码为");
		for(i=0;str[i]!='\0';i++){
			for(j=0;j<sum;j++){
				if(SSS[j].value==str[i])
					fprintf(fp,"%s",SSS[j].cd);
			}
		}
		fprintf(fp,"2");
		rewind(fp);
		fclose(fp);
		printf("编码已写好\n");
	}			
			
	printf("请输入要进行译码的文件的路径\n");
	scanf("%s",&acc);				
	if((fp=fopen(acc,"r"))==NULL) printf("打开文件失败,不能读取译码");
	else if(process==1){
		fscanf(fp,"%s",&decode);
		rewind(fp);
		fclose(fp);
		HTtra(decode);
	}		
}

文章最后发布于: 2018-11-20 20:15:23

相关阅读

Redis如何实现消息队列

消息队列的实现方式有很多种,比如有专业的rabbitmq,rocketmq,kafka等,这些mq提供了非常专业的功能实现异步发送,而且这些接入又比较

拆解企业建站选择疑问,实现网站价值最大化

越来越多的企业注重自身的品牌形象,在实体店形象升级改造的同时,企业也不会放过网络这一块大蛋糕。那么,做网站便是企业的需求了。但

C语言之父Dennis Ritchie博士逝世

2011年10月17日从新浪微博上看到14日的一条微博:美国计算机科学家、C语言和Unix共同作者、图灵奖得主丹尼斯·里奇去世,享年70岁。

企业绩效考核系统,让企业实现管理价值

绩效管理是现代人力资源管理的重要组成部分,而绩效考核又是绩效管理中的重要一环。但目前,不少企业对于绩效管理的认知依旧存在偏差

使用padding-bottom和margin-bottom实现两栏等高布局

声明:以下均为个人见解,若有错误请指出。效果预览:<!DOCTYPE html> <html> <head> <title>demo</title> <style type="tex

分享到:

栏目导航

推荐阅读

热门阅读