数据结构研究论文

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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){

相关文档
最新文档