资源简介
1、对输入的字符串统计出现频率,进行哈夫曼编码。。
2、生成的哈夫曼编码以及哈夫曼树可保存到本地文件。。
3、对接下来输入的01字符串,用先前的哈夫曼编码进行解码。。
4、全过程C语言实现。。
代码片段和文件信息
#include
#include
#include
#include
#define MAX_CHAR_KINDS 128//字符种类最大值。。
#define MAX_NUM 1000//字符串最大长度。。
FILE *in *ou;
typedef struct TreeNode
{
int weight;
int id;
short isLeaf;
char data;
char bin;//0或者1。。
struct TreeNode *parent;
struct TreeNode *lChild *rChild;
} TreeNode;
typedef struct
{
char data;
char code[MAX_CHAR_KINDS];
} Code;
//字符串倒置。。
void ReverseStr(char *str)
{
int i;
char c;
int length;
length = strlen(str);
for (i = 0; i < length / 2; i++)
{
c = str[length - 1 - i];
str[length - 1 - i] = str[i];
str[i] = c;
}
}
void PreOrderTraverse(TreeNode *t)
{
if ((t->rChild == NULL) && (t->lChild == NULL))
{
t->isLeaf = 1;
}
else
{
t->isLeaf = 0;
}
if (t->parent != NULL)
{
t->id = 2 * t->parent->id + (int)t->bin - 48;
}
else
{
t->id = 1;
t->bin = ‘ ‘;
}
if (t->isLeaf == 1)
{
fprintf(ou “%6d%5c%8d ‘%c‘\n“ t->id t->bin t->isLeaf t->data);
}
else
{
fprintf(ou “%6d%5c%8d\n“ t->id t->bin t->isLeaf);
}
if (t->lChild != NULL)
{
PreOrderTraverse(t->lChild);
}
if (t->rChild != NULL)
{
PreOrderTraverse(t->rChild);
}
}
int main()
{
char str[MAX_NUM];
char pwd[MAX_NUM];
TreeNode *HFTree;
int i j;
int length;//字符串长度。。
int count;//不同字符个数。。
TreeNode *tree[MAX_CHAR_KINDS];//初始的几个小树。。
TreeNode *eachChar[MAX_CHAR_KINDS];
TreeNode *temp *p;
Code *HFCode;
int codeBit;
short existed;
//输入,初始化。。
printf(“Input string to encode:\n“);
gets(str);
printf(“\n“);
length = strlen(str);
count = 0;
//开始统计字符串中各个字符出现的次数。。
for (i = 0; i < length; i++)
{
existed = 0;
for (j = 0; j < count; j++)
{
if (str[i] == tree[j]->data)
{
tree[j]->weight++;
existed = 1;
break;
}
}
//如果不是现有的字符,拿个新盒子装。。
if (existed == 0)
{
tree[count] = (TreeNode *)malloc(sizeof(TreeNode));
tree[count]->weight = 1;
tree[count]->data = str[i];
tree[count]->parent = NULL;
tree[count]->lChild = NULL;
tree[count]->rChild = NULL;
eachChar[count] = tree[count];//备份。。
count++;
}
}
//非法输入。。
if (count == 0)
{
printf(“No char!\n“);
getch();
return (0);
}
else if (count == 1)
{
printf(“At least 2 kinds of char!\n“);
getch();
return (0);
}
//冒泡,升序。。
for (i = 0; i < count - 1; i++)
{
for (j = 0; j < count - 1 - i; j++)
{
if (tree[j]->weight > tree[j+1]->weight)
{
temp = tree[j];
tree[j] = tree[j+1];
tree[j+1] = temp;
}
}
}
//生成Huffman树。。
for (i = 1; i < count; i++)
{
temp = (TreeNode *)malloc(sizeof(TreeNode));
temp->lChild = tree[i-1];
相关资源
- 整数小数四则运算计算器(C语言版用
- 51单片机c语言4x4矩阵键盘实验详细操
- 唯一可译码的辨别 C语言实现
- 模拟退火算法含有C语言源代码
- 五点三次平滑滤波C语言程序
- 使用c语言实现基于图的图像分割代码
- C语言套接字编程TCP连接
- C语言学生信息管理系统附代码73988
- ubuntu交叉编译mysql的C语言程序到ARM开
- 51单片机-舵机控制C语言程序
- C语言实现cordic sinx的算法
- 好玩的C语言代码
- 经典编程900题c语言
- C语言版课室管理系统
- 《新概念51单片机C语言教程--入门提高
- 矩阵求逆算法c语言编程
- 左手法则c语言程序
- BCH3121编码译码解码程序源代码——
- 宇视科技C语言面试题
- 三次样条插值算法c语言
- 模糊pid算法c语言
- 规定3个空瓶子换一瓶饮料,现在又
- 八数码宽度优先搜索加注释.txt
- 诗词大会登录、诗词查找、诗词填空
- C语言标准函数库详解.pdf
- 西南交大考研复试C语言上机真题.ra
- 通讯录管理系统 源代码.rar
- 课程设计——C语言编写图书管理系统
- c语言程序设计_第3版_何钦铭_课后答案
- 2019年全国计算机考试二级C语言——公
评论
共有 条评论