第五次大数据结构上机实验报告材料Word格式文档下载.docx
- 文档编号:19583178
- 上传时间:2023-01-08
- 格式:DOCX
- 页数:11
- 大小:40.12KB
第五次大数据结构上机实验报告材料Word格式文档下载.docx
《第五次大数据结构上机实验报告材料Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《第五次大数据结构上机实验报告材料Word格式文档下载.docx(11页珍藏版)》请在冰豆网上搜索。
typedefstruct{
VertexTypevexs;
//顶点向量
AdjMatrixarcs;
//邻接矩阵
intvexnum;
//图的当前顶点数
intarcnum;
//图的当前弧数
GraphKindkind;
//图的种类标志
}MGraph;
//***********************以下操作默认是无向网,即Kind=AG**************************
//***********************顶点是名称字母。
书上的是数字,例如v************************
StatusLocateVex(MGraphG,charu){
if(G.vexnum==0)return-1;
//图不存在
inti;
for(i=0;
i<
G.vexnum;
i++)
if(G.vexs[i].name==u)
returni;
return-2;
//图中不存在与u相等的点
}
StatusCreateGraph(MGraph&
G){
inti,j,k;
VRTypew;
charv1,v2;
chardata[50];
cout<
<
"
你想要创建几个顶点?
<
endl;
cin>
>
你想要创建几条弧?
G.arcnum;
依次输入顶点名称:
"
cin>
G.vexs[i].name;
//构造顶点向量
for(j=0;
j<
j++){
G.arcs[i][j].adj=INFINITY;
//初始化邻接矩阵
G.arcs[i][j].info=NULL;
}
for(k=0;
k<
k++){//构造邻接矩阵
cout<
输入一条边依附的两个顶点:
;
v1>
v2;
输入这条边的权值:
w;
输入这条边的信息:
data;
i=LocateVex(G,v1);
j=LocateVex(G,v2);
G.arcs[i][j].adj=w;
G.arcs[i][j].info=data;
G.arcs[j][i]=G.arcs[i][j];
}
return1;
StatusDestroyGraph(MGraph&
G.vexnum=NULL;
G.arcnum=NULL;
char*GetVex(MGraphG,charv){
if(G.vexnum==0)returnNULL;
i=LocateVex(G,v);
if(i>
=0)//判断是否是图上的顶点,后面的函数省略了这一步
returnG.vexs[i].data;
else
returnNULL;
StatusPutVex(MGraph&
G,charv,char*value){
if(G.vexnum==0)return0;
G.vexs[i].data=value;
//VertexTypeFirstAdjVex(MGraphG,charv){}//返回第一个邻接顶点,邻接表操作
//VertexTypeNextAdjVex(MGraphG,charv,charw){}//邻接表操作
StatusInsertVex(MGraph&
G,charv){
G.vexs[G.vexnum].name=v;
G.vexnum++;
i++){
G.arcs[i][G.vexnum-1].adj=INFINITY;
G.arcs[G.vexnum-1][i].adj=INFINITY;
StatusDeleteVex(MGraph&
k=LocateVex(G,v);
for(i=0,j=0;
if(G.arcs[i][k].adj!
=INFINITY)
j++;
for(i=k;
G.vexnum-1;
G.vexs[i]=G.vexs[i+1];
G.vexs[i].name=NULL;
G.vexs->
data=NULL;
G.vexnum--;
G.arcnum=G.arcnum-j;
StatusInsertArc(MGraph&
G,charv,charw){
inti,j;
VRTypeq;
j=LocateVex(G,w);
q;
G.arcs[i][j].adj=q;
G.arcs[i][j].info=data;
G.arcs[j][i]=G.arcs[i][j];
G.arcnum=G.arcnum+2;
StatusDeleteArc(MGraph&
G.arcs[i][j].adj=INFINITY;
G.arcs[i][j].info=NULL;
G.arcnum=G.arcnum-2;
StatusPrint(MGraphG){
G.vexnum;
j++)
cout<
G.arcs[i][j].adj<
intmain()
{
intj;
chari,c,d;
MGraphG;
CreateGraph(G);
此时矩阵为:
Print(G);
输入i:
:
i;
j=LocateVex(G,i);
i为第"
j+1<
个顶点"
为两个点添加边,输入添加边的两个顶点:
c>
d;
InsertArc(G,c,d);
DeleteArc(G,c,d);
添加顶点V;
c='
V'
InsertVex(G,c);
删除顶点B;
d='
B'
DeleteVex(G,d);
DestroyGraph(G);
return0;
运行结果:
2、
2.哈夫曼树的建立。
(1)将w1、w2、…,wn看成是有n棵树的森林(每棵树仅有一个结点);
(2)在森林中选出两个根结点的权值最小的树合并,作为一棵新树的左、右子树,且新树的根结点权值为其左、右子树根结点权值之和;
(3)从森林中删除选取的两棵树,并将新树加入森林;
(4)重复
(2)、(3)步,直到森林中只剩一棵树为止,该树即为所求得的哈夫曼树。
#defineMAXVALUE100000
constintn=4;
//叶子节点个数
//构造哈夫曼树结点
intweight;
//权值
intparent;
//父节点
intlchild;
//左子树
intrchild;
//右子树
}HNodeType;
HNodeTypeHFMTree[2*n-1];
//结点数
//构造哈夫曼编码数组
intbit[n];
intstart;
}HCodeType;
HCodeTypeHFMCode[n];
//创建哈夫曼树
voidcreateHFMTree(HNodeTypeHFMTree[],intn){
intm1,x1,m2,x2;
inti,j;
//初始化
for(i=0;
i<
2*n-1;
HFMTree[i].weight=0;
HFMTree[i].parent=-1;
HFMTree[i].lchild=-1;
HFMTree[i].rchild=-1;
cout<
请输入结点权值:
endl;
n;
i++){
cin>
HFMTree[i].weight;
n-1;
x1=x2=MAXVALUE;
m1=m2=0;
for(j=0;
j<
n+i;
if(HFMTree[j].parent==-1&
&
HFMTree[j].weight<
x1){
x2=x1;
m2=m1;
x1=HFMTree[j].weight;
m1=j;
elseif(HFMTree[j].parent==-1&
x2){
x2=HFMTree[j].weight;
m2=j;
HFMTree[m1].parent=n+i;
HFMTree[m2].parent=n+i;
HFMTree[n+i].weight=HFMTree[m1].weight+HFMTree[m2].weight;
HFMTree[n+i].lchild=m1;
HFMTree[n+i].rchild=m2;
//转化编码
voidcreateHFMCode(HNodeTypeHFMTree[],HCodeTypeHFMCode[]){
HCodeTypecd;
inti,j,c,p;
cd.start=n-1;
c=i;
p=HFMTree[c].parent;
while(p!
=-1)
{
if(HFMTree[p].lchild==c)cd.bit[cd.start]=0;
elsecd.bit[cd.start]=1;
cd.start--;
c=p;
for(j=cd.start+1;
HFMCode[i].bit[j]=cd.bit[j];
HFMCode[i].start=cd.start+1;
//主函数
//创建树
createHFMTree(HFMTree,n);
//转码
createHFMCode(HFMTree,HFMCode);
for(j=HFMCode[i].start;
=n-1;
cout<
HFMCode[i].bit[j];
return0;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第五 数据结构 上机 实验 报告 材料