c语言静态三叉链表构造一棵Huffman树并求其编码

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
{
return leafNum;
}
ReadFile.h
#include<iostream.h>
#include<stdio.h>
#include<string.h>
void readFile(char *str1,char **hufcodes,int leafNum)//带入参数哈弗曼节点字符串哈弗曼编码字符串数组,哈弗曼节点数
{
if(u!=-1)//判断是否有孩子
{
for(int e=1;e<getheight(u);e++)//循环小于高度,目的是为了确定该节点前有多少个空格
{
if(e==getheight(u)-1)//在循环的最后一位输出下面字符
cout<<"|_____";
else cout<<" ";//循环输出空格
weight[i]=0;
for(i=0;i<strlen(str);i++)//从第一个开始扫描str让str的每一个字符和str1比较在str1中相等的地方让weight的值++
for(j=0;j<count;j++)
{
if(str[i]==str1[j])
{
weight[j]++;//weight中的每一位对应着str1中的每一位
#include"HuffmanTree.h"
int main()
{
char str[1000];
cin>>str;
HuffmanTree htree(str);
htree.print();
htree.writetoFile();
readFile(htree.getstr1(),htree.gethufcodes(),htree.getleafNum());
{
char *code=new char[n];
code[n-1]='\0';
int start=n-1;
int child=i;
int parent=huftree[child].parent;
while(parent!=-1)
{
start--;
if(huftree[parent].left==child)
break;
}
}
for(i=0;i<count;i++)
{
cout<<str1[i]<<" ";
}
cout<<endl;
for(i=0;i<count;i++)
{
cout<<weight[i]<<" ";
}
cout<<endl;
/********************************************************************/
int HuffmanTree::getheight(int r)
{
int t=0;
while(r!=-1)
{
r=huftree[r].parent;
t++;
}
return t;
}
/********************************************************************/
HuffmanTree::~HuffmanTree()
{
delete[] huftree;
delete[] hufcodes;
}
/********************************************************************/
void HuffmanTree::writetoFile()
采用静态三叉链表构造一棵Huffman树并求其编码
增加了权值的计算和Huffman树的输出并写入code文件
三主函数及分析Hale Waihona Puke Baidu
it学习网收集http://www.itstudy8.net
主程序代码
Main.cpp
#include<iostream.h>
#include<string.h>
#include"readFile.h"
{
FILE *fp;
int i,j;
fp=fopen("code.txt","w");//以读的方式创建文件
for(i=0;i<strlen(str);i++)//扫描字符串str每一位与str1中的每一为比较若相等写入该位置的哈弗曼的编码
for(j=0;j<leafNum;j++)
{
if(str[i]==str1[j]) //主要目的是得出j值str1和weight和hafcodes的每一位都一一对应
createHuffmanTree(weight,count);
getHuffmanCode();
}
/********************************************************************/
void HuffmanTree::createHuffmanTree(int weight[],int n) //创建指定权值集合的哈弗曼树
k=0;
}
str1[count]='\0';//将哈弗曼叶子字符数组最后一位置字符串结束符
/********************************************************************/
int weight[100];
for(i=0;i<count;i++)//初始化权值为0
{
int min1,min2,x1,x2;
min1=min2=Max_Weight;
x1=x2=-1;
for(int j=0;j<n+i;j++)
{
if(huftree[j].data<min1&&huftree[j].parent==-1)
{
min2=min1;
x2=x1;
min1=huftree[j].data;
void print();
void print(int u);
int getheight(int r);//得出r节点的深度
};
const Max_Weight=9999; //默认最大权值
/*******************************************************************/
huftree[n+i].parent=-1;
huftree[n+i].left=x1;
huftree[n+i].right=x2;
}
}
void HuffmanTree::getHuffmanCode()
{
int n=leafNum;
hufcodes=new char*[n];
for(int i=0;i<n;i++)
return 0;
}
HuffmanTree.h
#include<iostream.h>
#include<stdio.h>
#include<string.h>
template<class T>
struct TriNode
{
T data;
int parent,left,right;
};
class HuffmanTree
code[start]='0';
else
code[start]='1';
child=parent;
parent=huftree[child].parent;
}
hufcodes[i]=code+start;
}
}
/********************************************************************/
{
fputs(hufcodes[j],fp);//写入文件
cout<<hufcodes[j];//输出到屏幕
}
}
cout<<endl;
fclose(fp);
cout<<"写入成功"<<endl;
}
/********************************************************************/
char* HuffmanTree::getstr1()//str1访问器
{
return str1;
}
char** HuffmanTree::gethufcodes()//hufcodes访问器
{
return hufcodes;
}
int HuffmanTree::getleafNum()//leafNum访问器
HuffmanTree::HuffmanTree(char str5[])
{
strcpy(str,str5);
int count=0,i,j,k=0;
for(i=0;i<strlen(str);i++)//循环做出str1,将每个str里面的字符在str1里面扫描一遍,str中在str1没出现的字符放到str1中
课程设计是教学中很重要的一项实践环节,它可以帮助学生充分理解课堂教学中的内容,对提高学生的实践认识和实际动手能力都有很重要的实际意义。学生应在规定的时间内,按照课程设计的要求,结合所学的理论知识,查找相关资料,完成好本次课程设计,提高程序编写的能力,为将来的实际工作取得一定的经验。
二 课程设计题目及要求
x1=j;
}
else if(huftree[j].data<min2&&huftree[j].parent==-1)
{
min2=huftree[j].data;
x2=j;
}
}
huftree[x1].parent=n+i;
huftree[x2].parent=n+i;
huftree[n+i].data=huftree[x1].data+huftree[x2].data;
{
leafNum=n;
huftree=new TriNode<int>[2*n-1];
int i;
for(i=0;i<n;i++)
{
huftree[i].data=weight[i];
huftree[i].parent=huftree[i].left=huftree[i].right=-1;
}
for(i=0;i<n-1;i++)
void getHuffmanCode(); //获得哈弗曼编码
public:
HuffmanTree(char str5[]);
~HuffmanTree();
void writetoFile(); //写入文件
char** gethufcodes();
char* getstr1();
int getleafNum();
void HuffmanTree::print()
{
cout<<"哈夫曼树节点数组: \n";
print(2*leafNum-2);
}
/*******HuffmanTree*************************************************************/
void HuffmanTree::print(int u)//递归打印哈弗曼tree,采用先序遍历
{
private:
char str[1000]; //输入的字符串
char str1[1000]; //哈弗曼叶子值
int leafNum; //子叶结点个数
TriNode<int> *huftree; //哈弗曼的结点数组
char **hufcodes; //哈弗曼编码数组
void createHuffmanTree(int weight[],int n); //创建指定权值集合的哈弗曼树
}
cout<<huftree[u].data;//输出节点权值
cout<<endl;
print(huftree[u].left);//找它左子
print(huftree[u].right);//找他右孩子
}
}
/********************************************************************/
课程设计题目:
采用静态三叉链表构造一棵Huffman树并求其编码
一 课程设计应达到的目的:
数据结构课程设计的目的是,为了让学生在学习 《数据结构》 课程的基础上深入理解数据结构的基本理论,掌握对数据结构的各种操作的算法设计方法,增强对基础知识和基本方法的综合运用能力,增强对算法的理解能力,提高软件设计能力,在实践中培养独立分析问题和解决问题的作风和能力,进一步深入巩固所学理论知识、使理论与实际相结合的重要实践环节。本课程设计通过完成一些具有一定难度的程序的编写、调试、运行工作,掌握面向过程程序设计的基本方法,从而提高学生分析问题解决问题的能力。
{
for(j=0;j<count+1;j++)
if(str[i]!=str1[j]) k++;//如果str中的字符在str1中扫描不等k++,k初值为0
if(k==count+1)//如果k等于字符串str1的长度的话说明str[i]在str1中没出现,加到str1中
str1[count++]=str[i];
相关文档
最新文档