第十、十一周数据结构代码

// Haffman.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <stdio.h>
#include <string.h>
typedef char DataType;

struct element //结点定义
{
DataType data;
float weight;//此字符的权值
int parent,lchild, rchild;//父结点,左孩子,右孩子存放位置
};
#define MAXLEAF 8 //最大叶子结点数目,待编码的字符数
#define MAXNODE MAXLEAF*2-1 //最大结点数
struct Huffmancode{
DataType ch;//存放字符
char bits[MAXLEAF];//存放字符的哈夫曼编码
};
Huffmancode hcode[MAXLEAF];
//element ht[ MAXNODE];

//此函数为选取两个最小的权值结点的位置 分别分别存放在pn[0],pn[1]
void Select (element *pt,int n, int *pn){
int i,iposi=0;
float tmp;
for(i=0;i<n;i++){
if(pt[i].parent==-1)
{
tmp=pt[i].weight;pn[0]=i;
iposi=i;
break;
}
}
for(i=iposi;i<n;i++){
if(tmp>pt[i].weight && pt[i].parent==-1){
pn[0]=i; tmp=pt[i].weight;
}
}

for(i=0;i<n;i++){
if(pt[i].parent==-1 && i!=pn[0])
{
tmp=pt[i].weight;pn[1]=i;
iposi=i;
break;
}
}
for(i=iposi;i<n;i++){
if(tmp>pt[i].weight && pt[i].parent==-1 && i!=pn[0]){
pn[1]=i; tmp=pt[i].weight;
}
}
return;
}

//此函数功能为创建哈夫曼树
void CreateHuffmanTree(element *pt){
int i,k=0;
int pn[2];
for(i=MAXLEAF ;i<MAXNODE;i++){
//选取两个最小的权值结点的位置 分别分别存放在pn[0],pn[1]
Select(pt,MAXLEAF+k,pn);
k++;
pt[pn[0]].parent=pt[pn[1]].parent=i;
pt[i].lchild=pn[0]; pt[i].rchild=pn[1];
pt[i].weight=pt[pn[0]].weight+pt[pn[1]].weight;
}
}

//此函数功能为生成哈夫曼编码
void CreateHuffmanCode(element *pt,int n){
int i,p,j,start;
char cd[MAXNODE];
for(i=0;i<n;i++){
start=n-1;
cd[start]=0;
p=pt[i].parent;
j=i;

//从叶子结点出发,逐层遍历到根结点,逆序求出每个结点的哈夫曼编码
while(p!=-1){//当p为 -1时,表示遍历到根结点
if(pt[p].lchild==j)
cd[--start]=‘0‘;//左孩子编码为0
else
cd[--start]=‘1‘; //右孩子编码为1
j=p;
p=pt[p].parent;
}
strcpy(hcode[i].bits,&cd[start]);
}
}

int main(int argc, char* argv[])
{

element ht[MAXNODE];
int i;
for(i=0;i<MAXNODE;i++) {
ht[i].parent=-1;
ht[i].lchild=-1;
ht[i].rchild=-1;
ht[i].data=‘ ‘;
ht[i].weight=0;
}
//ht[0].data=‘A‘ ;ht[0].weight=2; hcode[0].ch=ht[0].data;
//ht[1].data=‘B‘ ;ht[1].weight=4; hcode[1].ch=ht[1].data;
//ht[2].data=‘C‘ ;ht[2].weight=5; hcode[2].ch=ht[2].data;
//ht[3].data=‘D‘ ;ht[3].weight=3; hcode[3].ch=ht[3].data;

h[0].data=‘A‘ ;ht[0].weight=28; hcode[0].ch=ht[0].data;
ht[1].data=‘B‘ ;ht[1].weight=13; hcode[1].ch=ht[1].data;
ht[2].data=‘C‘ ;ht[2].weight=30; hcode[2].ch=ht[2].data;
ht[3].data=‘D‘ ;ht[3].weight=10; hcode[3].ch=ht[3].data;
ht[4].data=‘E‘ ;ht[4].weight=12; hcode[4].ch=ht[4].data;
ht[5].data=‘F‘ ;ht[5].weight=7; hcode[5].ch=ht[5].data;

CreateHuffmanTree(ht);//生成哈夫曼树
CreateHuffmanCode(ht,MAXLEAF);//生成哈夫曼编码

//输出每个字符的编码
float weight=0;
for(i=0;i<MAXLEAF;i++){
weight +=ht[i].weight*strlen(hcode[i].bits);
printf("字符=%c 权值=%f 编码=%s\n",hcode[i].ch, ht[i].weight,hcode[i].bits);
}
printf("weight=%f\n",weight);
return 0;
}

时间: 2024-10-24 10:18:00

第十、十一周数据结构代码的相关文章

算法导论笔记——第十~十一章 数据结构(一) 散列

第十章 基本数据结构 栈:可由数组表示 队列:可由数组表示 指针和对象:可由多数组表示.可用栈表示free list 有根数: 二叉树:左右孩子 分支无限制:左孩子右兄弟表示法 第十一章 散列表 数组:为每个元素保留一个位置 散列表:用于实际存储关键字比全部可能关键字少很多时,比如字典操作 解决散列冲突:链接法,开放寻址法 11.2 散列表 用链表法,在简单均匀散列的假设下,一次成功或不成功的查找所需要的平均时间为Θ(1+α),α为load factor. 11.3 散列函数 好的散列函数应(近

第十五周周总结

周数 专业学习目标 专业学习时间 新增代码量 人文方面的学习 知识技能总结 第 十 五 周 数据结构:学习与排序有关的知识 4h 300左右 练习与排序有关的习题 计算机网络:继续练习网络服务器的搭建 3h 300左右 继续练习网络服务器的搭建 WEB:继续学习个人主页相关知识点 3h 300左右 练习个人主页相关知识点

第十五周 周记

周数 专业学习目标 专业学习时间 新增代码量 博客发表量(总计) 人文方面的学习/知识技能 第十六周 数据结构与算法:了解排序,学会使用插入排序.冒泡排序等几种简单的排序: Web技术基础:解决制作个人主页遇到的问题: 计算机网络基础:个人知识复习. 8h 300左右 17 看ps自学视频,制作个人主页

第十二周周总结

周数 专业学习目标 专业学习时间 新增代码量 人文方面的学习 知识技能总结 第 十 二 周 数据结构:了解图的基本定义以及一些专有术语所指内容 3 250左右 <最后的文化贵族><少有人走的路 3> 掌握图的基本定义以及一些专有术语所指内容 计算机网络:动态分配路由 3h 200左右 完成相应实验报告:应尽量脱离课本所给出的实验例句,独立完成 WEB:学习背景图片的有关设置 3h 200左右 掌握背景图片的有关设置

第十一周周总结

周数 专业学习目标 专业学习时间 新增代码量 人文方面的学习 知识技能总结 第 十 一 周 数据结构: 树.森林.二叉树的关系:认识哈夫曼树 4h 300左右 <少有人走的路2> <蔡康永的说话之道> 能够将树转换成二叉树:掌握哈夫曼树的知识要点 计算机网络:静态分配路由 3h 200左右 完成相应实验报告,英语水平需提高 (--||) WEB:认识构造函数与函数直接量.认识typeof以及countdown等知识点 3h 200左右 完成上机课任务,理论课所讲知识点仍需巩固 好文

第十四周周总结

周数 专业学习目标 专业学习时间 新增代码量 人文方面的学习 知识技能总结 第 十 四 周 数据结构:练习图的有关习题 4h 400左右 练习图的有关习题 计算机网络:学习网络服务器的搭建 3h 200左右 巩固课上所学知识点, WEB:学习个人主页相关知识点 3h 300左右 完成上机课任务,理论课所讲知识点仍需巩固

第十周、第十一周学习总结

第十周.第十一周学习总结 ——王林 学科 WEB 数据结构 计算机网络基础 进度 第15章的后半部分.第十六章 第六章后半部分 项目5 主要内容 第十周首先主要学习了JavaScript的内置对象.其次第十一周为详细学习JS的字符串对象.数值处理对象.数组对象等,JS的综合运用实例以及JS对象编程与事件处理. 两周内,进行了对钱一周树的学习——树的定义.基本术语.树的双亲.孩子.兄弟表示法及实现.二叉树等. 两周内,计算机网络基础主要学习了路由器的相关概述,包括了解路由协议到配置路由器的动手实践

20162304 2017-2018-1 《程序设计与数据结构》第十一周学习总结

20162304 2017-2018-1 <程序设计与数据结构>第十一周学习总结 教材学习内容总结 定义哈希方法: 哈希函数的学习: 哈希表中的冲突问题: Java Collections API 实现: 教材学习中的问题和解决过程 问题1:哈希表中的冲突如何解决? 冲突问题:冲突问题是多个元素或关键字映射到表中的同一个位置. 链式方法,将哈希表看成是集合的表而不是各独立单位的表.所以每个单元中保存一个指针,指向与表中该位置相关的元素的集合. 优点: 开放地址方法:(1)线性探测法:Threa

学号20172328《程序设计与数据结构》第十一周学习总结

学号20172328<程序设计与数据结构>第十一周学习总结 教材学习内容总结 (Java和Anroid开发学习指导) 1.初识Anroid studio中的应用程序结构:Project窗口中有两个主要的节点,app和Gradle Scripts. app :包含应用程序中所有的组件,有三个节点 manifests.java.res. manifests:包含了一个AndroidManifests.xml文件,它描述了应用程序. java:包含了所有的Java应用程序和测试类. res:包含了资