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,并以超链接形式标明文章原始出处,否则将 ...
随机推荐
- Realm_King 之 .NET 打包详细教程(B)
上篇(Realm_King 之 .NET 打包详细教程(A))给大家讲述了打包基本的操作,接下来帮助大家如何覆盖安装,希望大家仔细阅读... (一)看到你的解决方案,选中你的安装程序,点击F4会弹出改 ...
- 初次比较正式的IT职场面试后几点对自己web开发的思考
昨天晚上参加一个web开发面试,对于还没有真正毕业的自己来说,web开发的面试不是第一次,暑假就面试几家公司,前几次的面试并没有发现自己对自己学习的专业知识有什么学习态度的问题,因为前几次的面试官都是 ...
- sed命令和find命令的结合的使用
linux中查找当前目录及其子目录下的所有test.txt文件,并将文件中的oldboy替换成oldgirl 首先查找出当前目录及其子目录下的所有的test.txt文件 [root@zxl zxl]# ...
- java线程的简单实用
1.start(): 先来看看Java API中对于该方法的介绍: 使该线程开始执行:Java 虚拟机调用该线程的 run 方法. 结果是两个线程并发地运行:当前线程(从调用返回给 start 方法) ...
- Mysql常用的查询语句,记录一下,好东西大家共享
一查询数值型数据: SELECT * FROM tb_name WHERE sum > 100; 查询谓词:>,=,<,<>,!=,!>,!<,=>,= ...
- php对象在内存中创建于释放
<?php /** * 1.对象的创建占用内存, * 对象内存释放,析构方法就是在对象释放前运行最后的一步.可以自动释放和手动释放 * 手动释放:通过unset($p);来释放对象,在这个时候会 ...
- php+mysql新无线级分类
create table cat( id int unsigned not null primary key auto_increment, pid , path ) not null default ...
- 如何正确选择挑选适合的VPS服务器
就来讲讲,如何挑选适合你的VPS.基本过程就是:1.你使用VPS的用途:2.你需要的线路:3.你要选择的操作系统:4.你购买VPS的大概预算是多少. 一.用途方法,其实买VPS就是:建站.VPN使用. ...
- chmod命令用法详解-chmod修改目录权限
chmod用法: 用来修改某个目录或文件的访问权限. 语法: chmod [-cfvR] [--help] [--version] [who] [+ | - | =] [mode] 文件名 例子: ...
- ASP.Net Core2.1 秒杀项目一步一步实现CI/CD系列一
前言:有一段时间没写博客了,那是因为博主菜,需要学习和准备,这不带来了本系列的文章.在这里我把学习的心得分享出来,有些点理解的也不是太到位,希望大佬们能多多给点建议和指导.下半年就把这个系列的文章写完 ...