C-哈夫曼编码
/*author:windy_2*/
/*修正版*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct slink
{
char data;
int wp;
int bm;
int mark;
struct slink *left;
struct slink *right;
}*link;
struct hfm
{
char data;
int wp;
};
struct T
{
int data;
struct T *next;
};
struct te
{
int data;
struct te *next;
};
struct slink* create_tree(struct hfm arr[],int len);
void print(struct slink *root);
int pop();
void push(int k);
struct T *T;
struct te *te;
int pop_s(struct T *strack);
void push_t(int k);
int pop_t();
int main()
{
struct slink *root;
int i,k=;
char str[];
char a[];
int b[];
int count,j;
struct hfm *arr;
T = (struct T*)malloc(sizeof(struct T));
T->data = ;
T->next = NULL;
te = (struct te*)malloc(sizeof(struct te));
te->data = ;
te->next = NULL;
printf("请输入你要进行编码的字符串: \n");
scanf("%s",str);
if(str[strlen(str)] == '\0')
{
str[strlen(str)]=NULL;
}
for(i = ;i < strlen(str);i++)
{
if(str[i]!='#')
{
a[k] = str[i];
b[k] = ;
for(j = ;j<strlen(str);j++)
{
if(str[j] == str[i])
{
b[k]++;
}
}
for(j = ;j<strlen(str);j++)
{
if(str[j] == a[k])
{
str[j] = '#';
}
}
k++;
}
count = k;
}
arr = (struct hfm*)malloc(sizeof(struct hfm)*count);
for(i = ;i < count;i++)
{
arr[i].data = a[i];
arr[i].wp = b[i];
}
root = (struct slink*)malloc(sizeof(struct slink));
root = create_tree(arr,count);
print(root);
}
struct slink* create_tree(struct hfm arr[],int len)
{
link ptrarr[];
link ptr,root = NULL;
int i,k1 = -,k2,j;
for(i = ;i < len;i++)
{
ptr = (link)malloc(sizeof(struct slink));
ptr->data = arr[i].data;
ptr->wp = arr[i].wp;
ptr->mark = ;
ptr->left = NULL;
ptr->right = NULL;
ptrarr[i] = ptr;
}
for(i = ;i < len;i++)
{
for(j = ;j < len;j++)
{
if(ptrarr[j]!=NULL&&k1==-)
{
k1 = j;
continue;
}
if(ptrarr[j]!=NULL)
{
k2 = j;
break;
}
}
for(j = k2;j < len;j++)
{
if(ptrarr[j] != NULL)
{
if(ptrarr[j]->wp > ptrarr[k1]->wp)
{
k2 = k1;
k1 = j;
}
else if(ptrarr[j]->wp < ptrarr[k2]->wp)
{
k2 = j;
}
}
}
root = (link)malloc(sizeof(struct slink));
ptrarr[k1]->bm = ;
ptrarr[k2]->bm = ;
root->wp = ptrarr[k1]->wp + ptrarr[k2]->wp;
root->data = '!';
root->mark = ;
root->left = ptrarr[k1];
root->right = ptrarr[k2];
ptrarr[k1] = root;
ptrarr[k2] = NULL;
}
return root;
}
void print(struct slink *root)
{
int temp;
struct T *p;
if(root == NULL)
{
return;
}
else
{
if(root->bm == ||root->bm == )
{
push(root->bm);
}
if(root->data != '!')
{
printf("%c的哈夫曼编码为: ",root->data);
root->mark = ;
temp = pop();
push_t(temp);
p = T->next;
while(p!=NULL)
{
temp = pop_s(p);
push_t(temp);
p = p->next;
}
while(te->next!=NULL)
{
temp = pop_t();
printf("%d",temp);
}
printf("\n");
if(root->bm == )
{
temp = pop();
}
}
print(root->left);
print(root->right);
}
}
int pop()
{
struct T *p;
int n;
if(T->next == NULL)
{
return ;
}
else
{
p = T->next;
n = p->data;
T->next = p->next;
free(p);
return n;
}
}
void push(int k)
{
struct T *strack;
strack = (struct T*)malloc(sizeof(struct T));
strack->data = k;
strack->next = T->next;
T->next = strack;
}
int pop_s(struct T *strack)
{
struct T *p;
int n;
if(T->next == NULL)
{
return ;
}
else
{
p = strack;
n = p->data;
return n;
}
}
void push_t(int k)
{
struct te *strack;
strack = (struct te*)malloc(sizeof(struct te));
strack->data = k;
strack->next = te->next;
te->next = strack;
}
int pop_t()
{
struct te *p;
int n;
if(te->next == NULL)
{
return -;
}
else
{
p = te->next;
n = p->data;
te->next = p->next;
free(p);
return n;
}
}
C-哈夫曼编码的更多相关文章
- 哈夫曼(huffman)树和哈夫曼编码
哈夫曼树 哈夫曼树也叫最优二叉树(哈夫曼树) 问题:什么是哈夫曼树? 例:将学生的百分制成绩转换为五分制成绩:≥90 分: A,80-89分: B,70-79分: C,60-69分: D,<60 ...
- (转载)哈夫曼编码(Huffman)
转载自:click here 1.哈夫曼编码的起源: 哈夫曼编码是 1952 年由 David A. Huffman 提出的一种无损数据压缩的编码算法.哈夫曼编码先统计出每种字母在字符串里出现的频率, ...
- 数据结构图文解析之:哈夫曼树与哈夫曼编码详解及C++模板实现
0. 数据结构图文解析系列 数据结构系列文章 数据结构图文解析之:数组.单链表.双链表介绍及C++模板实现 数据结构图文解析之:栈的简介及C++模板实现 数据结构图文解析之:队列详解与C++模板实现 ...
- HDU2527 哈夫曼编码
Safe Or Unsafe Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)To ...
- *HDU1053 哈夫曼编码
Entropy Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Sub ...
- YTU 3027: 哈夫曼编码
原文链接:https://www.dreamwings.cn/ytu3027/2899.html 3027: 哈夫曼编码 时间限制: 1 Sec 内存限制: 128 MB 提交: 2 解决: 2 ...
- 使用F#来实现哈夫曼编码吧
最近算法课要求实现哈夫曼编码,由于前面的问题都是使用了F#来解决,偶然换成C#也十分古怪,报告也不好看,风格差太多.一开始是打算把C#版本的哈夫曼编码换用F#来写,结果写到一半就觉得日了狗了...毕竟 ...
- 赫夫曼\哈夫曼\霍夫曼编码 (Huffman Tree)
哈夫曼树 给定n个权值作为n的叶子结点,构造一棵二叉树,若带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree).哈夫曼树是带权路径长度最短的树,权值较大的结点离 ...
- hdu2527哈夫曼编码
/* Safe Or Unsafe Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) T ...
- [数据结构与算法]哈夫曼(Huffman)树与哈夫曼编码
声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...
随机推荐
- PHP开发框架 Laravel
Laravel 是一套简洁.优雅的PHP Web开发框架(PHP Web Framework).它可以让你从面条一样杂乱的代码中解脱出来:它可以帮你构建一个完美的网络APP,而且每行代码都可以简洁.富 ...
- Windows窗体原理及控件WM_DRAWITEM和子类化重绘演示文件
http://download.csdn.net/detail/wenzhou1219/6783959
- Linux编辑器Vim和Emacs入门
sudo 命令 debian系统没有自带,需要安装: apt-get install sudo 安装位置为 /usr/bin/sudo,对应配置文件为 /etc/sudoers sudoers授权格式 ...
- Spring单例模式多线程安全问题-有状态的Bean
Spring单例与线程安全小结 一.Spring单例模式与线程安全 Spring框架里的bean,或者说组件,获取实例的时候都是默认的单例模式,这是在多线程开发的时候要尤其注意的地方. 单例模式的意思 ...
- python中的内置函数(bytearray)
返回一个新的字节数组.bytearray类是range 0 < = x < 256的一个可变序列.它有大多数可变序列的常用方法,在可变序列类型中描述,以及大多数字节类型的方法,参见字节和B ...
- ORACLE(emp)表习题与答案
因为答案都是小编自己写的,解法可能有多种,如果您觉得我的解法有误,希望您有时间给我留言. 一.习题 (1) 查询20部门的所有员工信息. SELECT * FROM emp where deptno ...
- Redis相关面试题
Reids:单线程+io多路复用机制 Redis与Memcached的区别: 一.memcached值是简单字符串,redis支持hash.set.list等复杂数据类型 二.redis可持久化数据, ...
- Python自学day-2
一.模块 模块分两种:标准库和第三方库,标准库是不需要安装就可以使用的库. import [模块名]:导入一个库,优先是在项目路径中寻找.自定义模块名不要和标准库模块名相同. sy ...
- 《JavaScript 高级程序设计》读书笔记
文章目录 第三章 基本语法 第四章 变量.作用域和内存问题 第五章 应用类型 1. Array 类型 2. RegExp 类型 3. Function 类型 4. String 类型 第六章 面向对象 ...
- php对象在内存中创建于释放
<?php /** * 1.对象的创建占用内存, * 对象内存释放,析构方法就是在对象释放前运行最后的一步.可以自动释放和手动释放 * 手动释放:通过unset($p);来释放对象,在这个时候会 ...