数据结构哈弗曼.docx
- 文档编号:3150972
- 上传时间:2022-11-18
- 格式:DOCX
- 页数:18
- 大小:96.92KB
数据结构哈弗曼.docx
《数据结构哈弗曼.docx》由会员分享,可在线阅读,更多相关《数据结构哈弗曼.docx(18页珍藏版)》请在冰豆网上搜索。
数据结构哈弗曼
江南大学物联网工程学院上机报告
课程名称数据结构上机名称实验3上机日期2013-1-31
班级计科1203姓名汪俊学号1030412314
上机报告要求1.上机名称2.上机要求3.上机环境4.程序清单(写明运行结果)5.上机体会
1.上机名称
实验内容一、二
2.上机要求
一、1.二叉树的存储与遍历
二、3.哈弗曼编码
3.上机环境
VisualC++6.0
4.程序清单(写明运行结果)
一、1.
#include
#include
#defineMaxSize100
typedefintElemType;
typedefstructnode
{
ElemTypedata;
structnode*lchild;
structnode*rchild;
}BiTNode,*BiTree;
voidCreateBinTree(BiTree&T)
{
inti;
scanf("%d",&i);
if(i==0)
T=NULL;
else
{
T=(BiTree)malloc(sizeof(BiTNode));
T->data=i;
CreateBinTree(T->lchild);
CreateBinTree(T->rchild);
}
}
voidInorder(BiTreeT)
{
if(T)
{
Inorder(T->lchild);
printf("%3d",T->data);
Inorder(T->rchild);
}
}
voidPreorder(BiTreeT)
{
if(T)
{
printf("%3d",T->data);
Preorder(T->lchild);
Preorder(T->rchild);
}
}
voidPostorder(BiTreeT)
{
if(T)
{
Postorder(T->lchild);
Postorder(T->rchild);
printf("%3d",T->data);
}
}
voidmain()
{
BiTreeT;
charch1,ch2;
printf("\n欢迎进入二叉树基本操作测试程序,请选择:
\n");
ch1='y';
while(ch1=='y'||ch1=='Y')
{
printf("\nA-------------------------二叉树的建立");
printf("\nB-------------------------先序遍历");
printf("\nC-------------------------中序遍历");
printf("\nD-------------------------后序遍历");
printf("\nE-------------------------退出\n");
scanf("\n%c",&ch2);
switch(ch2)
{
case'a':
case'A':
printf("请输入按先序建立二叉树的节点序列:
\n");
CreateBinTree(T);
break;
case'b':
case'B':
printf("该二叉树的先序遍历序列为:
\n");
Preorder(T);
break;
case'c':
case'C':
printf("该二叉树的中序遍历序列为:
\n");
Inorder(T);
break;
case'd':
case'D':
printf("该二叉树的后序遍历序列为:
\n");
Postorder(T);
break;
case'e':
case'E':
ch1='n';
break;
default:
printf("输入无效,请重新选择需要的操作:
\n");
break;
}
}
}
运行结果
2.
#include
#include
#defineMAXSIZE100
typedefstructnode
{
intdata;
structnode*lchild;
structnode*rchild;
}BiTNode,*BiTree;
typedefstruct
{
BiTreedata[MAXSIZE];
inttop;
}SeqStack;
//初始化顺序栈
voidInitStack(SeqStack&s)
{
s.top=0;
}
//判断栈是否为空
intStackEmpty(SeqStacks)
{
if(s.top==0)
return1;
else
return0;
}
//判断栈是否满
intStackFull(SeqStacks)
{
if(s.top==MAXSIZE-1)
return1;
else
return0;
}
//入栈
voidPush(SeqStack&s,BiTreex)
{
if(StackFull(s))
{
printf("栈满!
\n");
return;
}
else
{
s.data[s.top]=x;
s.top++;
}
}
//出栈
BiTreePop(SeqStack&s)
{
BiTreey;
if(StackEmpty(s))
{
printf("栈空!
\n");
return0;
}
else
{
s.top=s.top-1;
y=s.data[s.top];
returny;
}
}
//取回栈顶元素
BiTreeStackTop(SeqStacks)
{
if(StackEmpty(s))
return0;
else
returns.data[s.top-1];
}
//创建二叉树
voidCreateBinTree(BiTree&T)
{
inti;
scanf("%d",&i);
if(i==0)
T=NULL;
else
{
T=(BiTree)malloc(sizeof(BiTNode));
T->data=i;
CreateBinTree(T->lchild);
CreateBinTree(T->rchild);
}
}
//
voidPreorderN(BiTreeT)
{
SeqStackS;
BiTreep;
InitStack(S);
Push(S,T);
while(!
StackEmpty(S))
{
while(p=StackTop(S))
{
printf("%3d",p->data);
Push(S,p->lchild);
}
p=Pop(S);
if(!
StackEmpty(S))
{
p=Pop(S);
Push(S,p->rchild);
}
}
}
voidmain()
{
BiTreeT;
printf("请输入按先序建立二叉树的节点序列:
\n");
printf("每输完一个数都要敲回车!
\n");
CreateBinTree(T);
printf("输出序列为:
");
PreorderN(T);
printf("\n");
}
运行结果:
3哈弗曼编码
#include
#include
#include
#definemax1024
typedefstruct
{
chardata;
unsignedintweight;//权值
unsignedintparent,lchild,rchild;//父节点、左孩子、右孩子的位置
}HTNode,*HuffmanTree;
typedefchar**HuffmanCode;//指针的指针,用于动态申请数组,存放编好的编码
voidHuffmanCoding(HuffmanTree&HT,HuffmanCode&HC,int*w,intn,char*z)
{
//w存放n个字符的权值(均>0),构造哈夫曼树HT,
//并求出n个字符的哈夫曼编码HC
inti,j,m,s1,s2,start;//i、j、m为临时变量,s1、s2存放权值最小的权值在数组中的位置
intsun1,sun2;//sun1、sun2存放最小的两个权值
char*cd;//用于动态申请数组,存放编好的一条编码
unsignedintc,f;//c为临时变量,f存放父节点的位置
if(n<=1)return;
m=2*n-1;//m的大小是所有结点的数量
HT=(HuffmanTree)malloc((m+1)*sizeof(HTNode));//0号单元未用
for(i=1;i<=n;i++){//对数组进行初始化
HT[i].weight=w[i-1];
HT[i].data=z[i-1];
HT[i].parent=0;
HT[i].lchild=0;
HT[i].rchild=0;
}
for(i=n+1;i<=m;i++){//对剩余数组进行初始化
HT[i].data='\0';
HT[i].weight=0;
HT[i].parent=0;
HT[i].lchild=0;
HT[i].rchild=0;
}
/*printf("\n哈夫曼树的构造过程如下所示:
\n");
printf("\n**************************************\n");
printf("HT初态:
\n结点weightparentlchildrchild");//输出数组的初始状态
for(i=1;i<=m;i++)
printf("\n%4d%8d%8d%8d%8d",i,HT[i].weight,
HT[i].parent,HT[i].lchild,HT[i].rchild);
printf("按任意键,继续...");
printf("\n**************************************\n");
getchar();//获得的是回车符,所以要有两个getchar,或者用清除缓存区语句
getchar();*/
for(i=n+1;i<=m;i++)
{//建哈夫曼树
//在HT[1..i-1]中选择parent为0且weight最小的两个结点,
//
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 哈弗曼