数据结构研究论文
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
计算机数据结构研究论文
题目:
院系:计算机科学与信息工程系
专业:网络工程
班级:(1)班
姓名:侯三杰
学号:
日期:
Huffman编码器与Joseph约瑟夫环
<一>.Huffman编码器
1.问题描述:
给出一个霍夫曼树的节点,和每个节点的权值,设计一个算法,可以通过算法将每个节点译为不同的码字.
2.需求分析
(1) 输入的形式和输入值的范围;
输入的值是通过用户界面提示,输入名节点数和权值,但是要求均是正整数.
(2) 输出的形式:以表的形式输出,左边为要译的权值,右边为要译的码字,且是二进制码,
(3) 程序所能达到的功能;将已知有权值的数译成二进制编码,且码不重复,无前缀码。
(4) 测试数据: number:6,weight:2 2 3 4 5 6
输出:1-000 2-001 3-110 4-111 5-01 6-10
3.概要设计
1. 抽象数据类型的定义为:
void CreateHuffmanTree(HuffmanTree *HT, unsigned int *w , int n)
输出结果:w存放n个字符的权值(均>0),构造Huffman树HT.
void Select(HuffmanTree HT, int t, int *s1, int *s2)
输出结果:在Huffman树HT中找出权值最小的两个节点,序号分别为s1和s2
void HuffmanCoding(HuffmanTree HT, HuffmanCode *HC, int n)
输出结果:赫夫曼编码,放入HC中
void PrintHuffmanCode(HuffmanCode HC, unsigned int *w, int n)
输出结果: w存放n个字符的权值(均>0),输出Huffman编码
2.本程序包含以下模块:
(1)主程序模块:
main(void)
{
输入数据;
执行功能;
显示结果;
}
(2)各功能模块——实现Huffman编码的各项功能。
各模块的调用关系:
4.详细设计:
/*编辑器devcpp*/
#include
#include
#include
typedef struct
{
unsigned int weight;/*放权值*/
unsigned int parent;/*父亲结点*/
unsigned int lchild;/*左孩子*/
unsigned int rchild;/*右孩子*/
}HTNode, *HuffmanTree; /*动态申请赫夫曼树*/
typedef char **HuffmanCode;/*动态分配赫夫曼表*/
void CreateHuffmanTree(HuffmanTree *HT, unsigned int *w , int n); void Select(HuffmanTree HT, int t, int *s1, int *s2);
void HuffmanCoding(HuffmanTree HT, HuffmanCode *HC, int n);
void PrintHuffmanCode(HuffmanCode HC, unsigned int *w, int n); main(void)
{
HuffmanTree HT;
HuffmanCode HC;
int i, n;
unsigned int *w;
printf("*********Huffman********\n\n") ;
printf("input number of Huffman:\n");
scanf("%d", &n);
if(n<=1) return 0;
w = (unsigned int *)malloc(n * sizeof(unsigned int));
printf("input weight:\n");/*输入每个叶子节点的权值*/
for(i = 0; i < n; i++)
{
scanf("%d", &w[i]);
}
CreateHuffmanTree(&HT, w, n);
HuffmanCoding(HT, &HC, n);
PrintHuffmanCode(HC, w, n);
getch();
}
/*****************************
建立赫夫曼树,w存放权值,在每次把两个小的权值相加后,在每次select中都能包括进去新的结点每次父亲结点被重新赋值,不为0在每次select中除去
*****************************/
void CreateHuffmanTree(HuffmanTree *HT, unsigned int *w , int n)
{
int i, m;
int s1, s2;
char *cd;
m = 2 * n - 1; /*总结点数*
*HT = (HuffmanTree)malloc((m + 1) * sizeof(HTNode));
for(i = 1; i <= n; ++i, ++w) /*叶子结点初试化*/
{
(*HT)[i].weight = *w;
(*HT)[i].parent = 0;
(*HT)[i].lchild = 0;
(*HT)[i].rchild = 0;
}
for(; i <= m; ++i)
{
(*HT)[i].weight = 0;
(*HT)[i].parent = 0;
(*HT)[i].lchild = 0;
(*HT)[i].rchild = 0;
}
for(i = n + 1; i <= m; ++i)
{
Select(*HT, i - 1, &s1, &s2);/*从权值中选两个最小的*/
(*HT)[s1].parent = i; /*父亲结点都被赋值,在select循环中可以除去*/ (*HT)[s2].parent = i;
(*HT)[i].lchild = s1; /*孩子结点被赋值*/
(*HT)[i].rchild = s2;
(*HT)[i].weight = (*HT)[s1].weight + (*HT)[s2].weight;/*加后成新结点*/ }
}
/*寻找两个最小的结点s1, s2*/
void Select(HuffmanTree HT,int t,int *m1,int *m2)
{ int i,max;
int s1,s2;
for(i=1;i<=t;i++)
if(HT[i].parent==0){