当前位置:首页 > 实验七
《数据结构》课程实验
赫夫曼编码解码系统 1. 初始化赫夫曼链表 2. 编码 3. 译码 4. 打印编码 5. 打印赫夫曼树 6. 打印译码 7. 退出 Initialization(); Encoding(); Decoding(); Code_printing(); Tree_printing(HT,2*n-1); Code_printing1(); 三、详细设计
1.抽象数据类型设计:详细描述抽象数据类型的存储结构和操作的算法
实现;
2.主程序算法设计:给出主程序各函数的算法实现。
void sethuftree(); //有关函数声明 void select0(int s); void sethufcode(); void setcode(); void printtree(); void printhufcode();
void sethuftree() //建立huffuman树
void select0(int s) //找权值最小的2个结点 void printtree() //输出huffman树 void sethufcode() //建立huffman编码 void printhufcode() //输出huffman编码,即空
格+26个大写字母
//--------------------slect函数---------------------- void select(HuffmanTree t,int i,int &s1,int &s2) // s1为最小的两个值中序号小的那个 int min(HuffmanTree t,int i) // 函数void select()调用
void HuffmanCoding(HuffmanTree &HT,HuffmanCode &HC,int *w,int
n)
5
《数据结构》课程实验
int InputCode()//获取报文并写入文件 void Initialization()//初始化赫夫曼链表 void Encoding()//编码函数 void Decoding()//译码函数
void Code_printing()//打印编码的函数 void Code_printing1()//打印译码函数
void coprint(HuffmanTree start,HuffmanTree HT) //打印赫夫曼树
的函数
void Tree_printing(HuffmanTree HT,int w)
四、C++语言程序实现:给出所有源程序清单,要求程序有充分的注释语句,至少要注释每个函数参数的含义和函数返回值的含义。 #include
#define N 27 //空格+26个大写字母 #define M 2*N-1 #define infinity 32767
struct node //huffman树的结点结构 {
int weight; //结点权值
int plink,llink,rlink; //双亲,左孩子,右孩子 };
struct codetype //huffman编码结构 {
int start; //起始位置
char bits[N+1]; //存放0,1的数组 };
struct element //字符及其编码的结构 {
char symbol; //字符
struct codetype code; //字符编码 };
6
《数据结构》课程实验
struct node tree[M+1]; //n个结点的huffman树
struct element table[N+1],t[100]; //n个结点的huffman编码表,报文编码
int x1,x2;
void sethuftree(); //有关函数声明 void select0(int s); void sethufcode(); void setcode(); void printtree(); void printhufcode();
void sethuftree() //建立huffuman树 {
int
i,treeweight[N]={186,64,13,22,32,103,21,15,47,57,1,5,32,20,57,63,15,1,48,51,80,23,8,18,1,16,1}; char tablesymbol[N]={' ','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'}; for(i=1;i<=M;i++) //初始双亲,左,右结点为:0 tree[i].plink=tree[i].llink=tree[i].rlink=0;
for(i=1;i<=N+1;i++) //初始化27个字符及其权值 { table[i].symbol=tablesymbol[i-1]; tree[i].weight=treeweight[i-1]; }
for(i=N+1;i<=M;i++) //找权值最小的2个结点,组成huffman树 { select0(i-1); //调用找权值最小的2个结点函数 tree[x1].plink=i; tree[x2].plink=i;
7
《数据结构》课程实验
tree[i].llink=x1; tree[i].rlink=x2; tree[i].weight=tree[x1].weight+tree[x2].weight; } }
void select0(int s) //找权值最小的2个结点 {
int i; int v1,v2;
v1=v2=infinity; x1=x2=0;
for(i=1;i<=s;i++) if(tree[i].plink==0) if(tree[i].weight void printtree() //输出huffman树 { int i; printf(\哈夫曼树为:\\n\\n\ printf(\结点值 权值(频度) 双亲 左孩子 右孩子\\n\ for(i=1;i<=N;i++) printf(\ %-8c%-11d%-8d%-8d%d\\n\tree[i].llink,tree[i].rlink); for(i=N+1;i<=M;i++) printf(\ %-11d%-8d%-8d%d\\n\ 8
共分享92篇相关文档