- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章C语言实现哈夫曼编码由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
本文实例为大家分享了C语言实现哈夫曼编码的具体代码,供大家参考,具体内容如下 。
代码来自于《小甲鱼C++快速入门》 。
主程序main.cpp 。
1
2
3
4
5
6
7
8
9
10
11
12
|
#include "stdafx.h"
#include <stdlib.h>
#include "huffman.h"
int
main()
{
htTree *codeTree = buildTree(
"I love wwwwwwwwwFishC.com!"
);
//建立哈夫曼树
hlTable *codeTable = buildTable(codeTree);
//建立编码表
encode(codeTable,
"I love FishC.com!"
);
//对输入的字符串进行编码
decode(codeTree,
"0011111000111"
);
//解码
system
(
"pause"
);
return
0;
}
|
两个头文件: huffman.h:定义了哈夫曼树和编码表的结构 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
#pragma once
#ifndef _HUFFMAN_H
#define _HUFFMAN_H
typedef
struct
_htNode{
char
symbol;
struct
_htNode *left,*right;
}htNode;
typedef
struct
_htTree{
htNode *root;
}htTree;
typedef
struct
_hlNode{
char
symbol;
char
*code;
struct
_hlNode *next;
}hlNode;
typedef
struct
_hlTable{
hlNode *first;
hlNode *last;
}hlTable;
htTree *buildTree(
char
*str);
hlTable *buildTable(htTree *huffmanTree);
void
encode(hlTable *table,
char
*stringToEncode);
void
decode(htTree *tree,
char
*stringToDecode);
#endif
|
queue.h:定义了有序队列的结构,将字符按优先级排列,即频率从小到大排列,val是树节点,直接由队列建立起哈夫曼树 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
#pragma once
#ifndef _PQUEUE_H
#define _PQUEUE_H
#include "huffman.h"
#define MAX_SZ 256
#define TYPE htNode *
typedef
struct
_pQueueNode{
TYPE val;
unsigned
int
priority;
struct
_pQueueNode *next;
}pQueueNode;
typedef
struct
_pQueue{
unsigned
int
size;
pQueueNode *first;
}pQueue;
void
initPQueue(pQueue **queue);
void
addPQueue(pQueue **queue, TYPE val, unsigned
int
priority);
TYPE getQueue(pQueue **queue);
#endif
|
两个cpp文件实现两个头文件声明的函数: huffman.cpp 。
。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
|
#include "stdafx.h"
#include "queue.h"
#include "huffman.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
htTree *buildTree(
char
*str)
{
int
*probability = (
int
*)
malloc
(
sizeof
(
int
) * 256);
//初始化
for
(
int
i = 0; i < 256; i++)
{
probability[i] = 0;
}
//统计待编码的字符串各个字符出现的次数
for
(
int
j = 0; str[j] !=
'\0'
; j++)
{
probability[str[j]]++;
}
//定义队列的头指针
pQueue *huffmanQueue;
initPQueue(&huffmanQueue);
//填充队列
for
(
int
k = 0; k < 256; k++)
{
if
(probability[k] != 0)
{
htNode *aux = (htNode *)
malloc
(
sizeof
(htNode));
aux->left = NULL;
aux->right = NULL;
aux->symbol = (
char
)k;
addPQueue(&huffmanQueue, aux, probability[k]);
}
}
free
(probability);
//生成哈夫曼树
while
(huffmanQueue->size != 1)
{
unsigned
int
newPriority = huffmanQueue->first->priority + huffmanQueue->first->next->priority;
htNode *aux = (htNode *)
malloc
(
sizeof
(htNode));
aux->left = getQueue(&huffmanQueue);
aux->right = getQueue(&huffmanQueue);
addPQueue(&huffmanQueue, aux, newPriority);
}
htTree *tree = (htTree *)
malloc
(
sizeof
(htTree));
tree->root = getQueue(&huffmanQueue);
return
tree;
}
void
traverseTree(htNode *treeNode,hlTable **table,
int
k,
char
code[256])
{
if
(treeNode->left == NULL&&treeNode->right == NULL)
{
code[k] =
'\0'
;
hlNode *aux = (hlNode *)
malloc
(
sizeof
(hlNode));
aux->code = (
char
*)
malloc
(
sizeof
(
char
)*(
strlen
(code) + 1));
strcpy
(aux->code,code);
aux->symbol = treeNode->symbol;
aux->next = NULL;
if
((*table)->first == NULL)
{
(*table)->first = aux;
(*table)->last = aux;
}
else
{
(*table)->last->next = aux;
(*table)->last = aux;
}
}
if
(treeNode->left != NULL)
{
code[k] =
'0'
;
traverseTree(treeNode->left,table,k+1,code);
}
if
(treeNode->right != NULL)
{
code[k] =
'1'
;
traverseTree(treeNode->right, table, k + 1, code);
}
}
hlTable *buildTable(htTree *huffmanTree)
{
hlTable *table = (hlTable *)
malloc
(
sizeof
(hlTable));
table->first = NULL;
table->last = NULL;
char
code[256];
int
k = 0;
traverseTree(huffmanTree->root,&table,k,code);
return
table;
}
void
encode(hlTable *table,
char
*stringToEncode)
{
hlNode *traversal;
printf
(
"Encoding......\n\nInput string:\n%s\n\nEncoded string :\n"
,stringToEncode);
for
(
int
i = 0; stringToEncode[i] !=
'\0'
; i++)
{
traversal = table->first;
while
(traversal->symbol != stringToEncode[i])
traversal = traversal->next;
printf
(
"%s"
, traversal->code);
}
printf
(
"\n"
);
}
void
decode(htTree *tree,
char
*stringToDecode)
{
htNode *traversal = tree->root;
printf
(
"\n\nDecoding......\n\nInput string: \n%s\n\nDecoded string: \n"
,stringToDecode);
for
(
int
i = 0; stringToDecode[i] !=
'\0'
; i++)
{
if
(traversal->left == NULL&&traversal->right == NULL)
{
printf
(
"%c"
, traversal->symbol);
traversal = tree->root;
}
if
(stringToDecode[i] ==
'0'
)
traversal = traversal->left;
else
if
(stringToDecode[i] ==
'1'
)
traversal = traversal->right;
else
{
printf
(
"The input string is not coded correctly!\n"
);
return
;
}
}
printf
(
"\n\n"
);
return
;
}
|
queue.cpp:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
|
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include "queue.h"
void
initPQueue(pQueue **queue)
{
*queue = (pQueue *)
malloc
(
sizeof
(pQueue));
(*queue)->first = NULL;
(*queue)->size = 0;
return
;
}
void
addPQueue(pQueue **queue, TYPE val, unsigned
int
priority)
{
if
((*queue)->size == MAX_SZ)
{
printf
(
"\n Queue is full. \n"
);
return
;
}
pQueueNode *aux = (pQueueNode *)
malloc
(
sizeof
(pQueueNode));
aux->priority = priority;
aux->val = val;
if
((*queue)->size == 0||(*queue)->first==NULL)
{
aux->next = NULL;
(*queue)->first = aux;
(*queue)->size = 1;
return
;
}
else
{
if
(priority <= (*queue)->first->priority)
{
aux->next = (*queue)->first;
(*queue)->first = aux;
(*queue)->size++;
return
;
}
else
{
pQueueNode *iterator = (*queue)->first;
while
(iterator->next!=NULL)
{
if
(priority <= iterator->next->priority)
{
aux->next = iterator->next;
iterator->next = aux;
(*queue)->size++;
return
;
}
iterator = iterator->next;
}
if
(iterator->next == NULL)
{
aux->next = NULL;
iterator->next = aux;
(*queue)->size++;
return
;
}
}
}
}
TYPE getQueue(pQueue **queue)
{
TYPE returnValue;
if
((*queue)->size > 0)
{
returnValue = (*queue)->first->val;
(*queue)->first = (*queue)->first->next;
(*queue)->size--;
}
else
{
returnValue = NULL;
printf
(
"\n Queue is empty \n"
);
}
return
returnValue;
}
|
运行结果:
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我.
原文链接:https://blog.csdn.net/u011643312/article/details/53983278 。
最后此篇关于C语言实现哈夫曼编码的文章就讲到这里了,如果你想了解更多关于C语言实现哈夫曼编码的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我对自定义 CSS 或在将图像作为 Logo 上传到页面时使用编码 block 有疑问。我正在为我的网站使用 squarespace,我需要帮助编码我的 Logo 以使其适合每个页面。一个选项是使用自
如 encoding/json 包文档中所述, Marshal traverses the value v recursively. If an encountered value implement
我必须做一些相当于Java中的iconv -f utf8 -t sjisMS $INPUT_FILE的事情。该命令在 Unix 中 我在java中没有找到任何带有sjisMS的编码。 Java中有Sh
从 PHP 5.3 迁移到 PHP 5.6 后,我遇到了编码问题。我的 MySQL 数据库是 latin1,我的 PHP 文件是 windows-1251。现在一切都显示为“ñëåäíèòå àäðå
我有一个 RScript文件(我们称之为 main.r ),它引用了另一个文件,使用以下代码: source("functions.R") 但是,当我运行 RScript 文件时,它提示以下错误:
我无法设法从 WSDL 创建 RPC/编码风格的代码 - 有谁知道哪个框架可以做到这一点? 带有 adb 和 xmlbeans 映射的 Axis2 无法正常工作(无法处理响应中的肥皂编码)直接使用 X
安装了最新版本的Node.Js()和npm包**(1.2.10)**当我运行 Express 命令来生成项目时,它向我抛出以下错误 buffer.js:240 switch (encoding &
JavaScript中有JSON编码/解码base64编码/解码函数吗? 最佳答案 是的,btoa() 和 atob() 在某些浏览器中可以工作: var enc = btoa("this is so
>>> unicode('восстановление информации', 'utf-16') Traceback (most recent call last): File "", line
我当然熟悉 java.net.URLEncoder 和 java.net.URLDecoder 类。但是,我只需要 HTML 样式的编码。 (我不想将 ' ' 替换为 '+' 等)。我不知道任何只做
有一个非常简单的 SSIS 包: OLE DB Source 通过 View 获取数据(数据库表 nvarchar 或 nchar 中的所有字符串列)。 派生列,用于格式化现有日期并将其添加到数据集(
我正在使用一个在 Node 中进行base64编码的软件,如下所示: const enc = new Buffer('test', 'base64') console.log(enc) 显示: 我正
我试图将带有日语字符的数据插入到 oracle 数据库中。事情是保存在数据库中的是一堆倒置的问号。我该如何解决这个问题 最佳答案 见 http://www.errcode.net/blogs/?p=6
当我在 java 中解压 zip 文件时,我发现文件名中出现了带有重音字符的奇怪行为。 西索: Add File user : L'equipe Technique -- Folder : spec
在网上冲浪我找到了 ExtJS 的 Ext.Gantt 插件,该扩展有一个特殊的编码。任何人都知道如何编码那样或其他复杂的形式。 Encoded Gantt Chart 最佳答案 它似乎被 Dean
我正在用C语言做一个编码任务,我进展顺利,直到读取符号并根据表格分配相应的代码的部分。我必须连接几个代码,直到它们的长度达到 32 位,为此我必须将它们写入一个文件中。这种写入文件的方法给我带来了很多
我有一个外部链接的 javascript 文件。在那个 javascript 里面,我有这个功能: function getMonthNumber(monthName){ monthName = mo
使用mechanize,我检索到一个网页的源页面,其中包含一些非ASCII字符,比如汉字。 代码如下: #using python2.6 from mechanize import Browser b
我有一个包含字母 ø 的文件。当我用这段代码 File.ReadLines(filePath) 读取它时,我得到了一个问号而不是它。 当我像这样添加编码时 File.ReadLines(filePat
如何翻译下面的字符串 H.P. Dembinski, B. K\'{e}gl, I.C. Mari\c{s}, M. Roth, D. Veberi\v{c} 进入 H. P. Dembinski,
我是一名优秀的程序员,十分优秀!