图实验报告.docx
- 文档编号:26453960
- 上传时间:2023-06-19
- 格式:DOCX
- 页数:12
- 大小:25.99KB
图实验报告.docx
《图实验报告.docx》由会员分享,可在线阅读,更多相关《图实验报告.docx(12页珍藏版)》请在冰豆网上搜索。
图实验报告
实验7二叉树
学生姓名:
蒋瑶瑶
实验日期:
2011-12-13
实验任务:
(1)对图进行深度优先遍历或广度优先遍历;
(2)采用prime算法或Kruscal算法求解最小生成树.
实验源程序:
(1)对图进行深度优先遍历或广度优先遍历;
#defineMAXV10000
#defineMAX_VERTEX_NUM40
#defineMAX40
#include
#include
#include
//图的邻接表存储
typedefstructArCell
{
intadj;
}ArCell,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
typedefstruct
{
charname[20];
}infotype;
typedefstruct
{
infotypevexs[MAX_VERTEX_NUM];
AdjMatrixarcs;
intvexnum,arcnum;
}MGraph;
intLocateVex(MGraph*G,char*v)
{intc=-1,i;
for(i=0;i
if(strcmp(v,G->vexs[i].name)==0)
{c=i;break;}
returnc;
}
//初始化图,接受用户输入
MGraph*CreatUDN(MGraph*G)
{
inti,j,k,w;
charv1[20],v2[20];
printf("请输入图的顶点数和弧数:
");
scanf("%d,%d",&G->vexnum,&G->arcnum);
printf("请依次输入图的顶点\n");
for(i=0;i
printf("G.vexs[%d]:
",i);
scanf("%s",G->vexs[i].name);
getchar();
}
for(i=0;i
for(j=0;j
G->arcs[i][j].adj=MAXV;
for(k=0;k
{
printf("第%d条边:
\n",k+1);
printf("起始结点:
");
scanf("%s",v1);
printf("结束结点:
");
scanf("%s",v2);
printf("边的权值:
");
scanf("%d",&w);
i=LocateVex(G,v1);
j=LocateVex(G,v2);//确定v1和v2在G中位置
if(i>=0&&j>=0){
G->arcs[i][j].adj=w;
G->arcs[j][i]=G->arcs[i][j];//置
}
}
returnG;
}
intFirstAdjVex(MGraph*G,intv)
{
inti;
if(v>=0&&v
{
for(i=0;i
if(G->arcs[v][i].adj!
=MAXV)
{returni;break;}
}
return-1;
}
voidVisitFunc(MGraph*G,intv)
{
printf("%s",G->vexs[v].name);
}
intNextAdjVex(MGraph*G,intv,intw)
{
intk;
if(v>=0&&v
{
for(k=w+1;k
if(G->arcs[v][k].adj!
=MAXV)
{returnk;break;}
}
return-1;
}
intvisited[MAX];
voidDFS(MGraph*G,intv)//从第v个顶点出发递归地深度优先遍历图G
{
intw;
visited[v]=1;
VisitFunc(G,v);
for(w=FirstAdjVex(G,v);w>=0;w=NextAdjVex(G,v,w))
if(!
visited[w]){
DFS(G,w);
}
}
//深度优先遍历
voidDFSTraverse(MGraph*G,char*s)
{intv,k;
for(v=0;v
visited[v]=0;
k=LocateVex(G,s);
if(k>=0&&k
for(v=k;v>=0;v--){
if(!
visited[v])
DFS(G,v);}
for(v=k+1;v
if(!
visited[v])
DFS(G,v);
}
}
typedefstructQNode{
intdata;
structQNode*next;
}QNode,*Queueptr;
typedefstruct{
Queueptrfront;
Queueptrrear;
}LinkQueue;
intInitQueue(LinkQueue&Q){
Q.front=Q.rear=(Queueptr)malloc(sizeof(QNode));
if(!
Q.front)exit(-1);
Q.front->next=NULL;
return1;
}
intEnQueue(LinkQueue&Q,inte){
Queueptrp;
p=(Queueptr)malloc(sizeof(QNode));
if(!
p)exit(-1);
p->data=e;p->next=NULL;
Q.rear->next=p;
Q.rear=p;
return1;
}
intDeQueue(LinkQueue&Q,int&e){
Queueptrp;
if(Q.front==Q.rear)return(-1);
p=Q.front->next;
e=p->data;
Q.front->next=p->next;
if(Q.rear==p)Q.rear=Q.front;
free(p);
return1;
}
intQueueEmpty(LinkQueueQ)
{
if(Q.rear==Q.front)
return1;
return0;
}
intVisited[MAX];
voidmain()
{
MGraph*G,b;
charv[10];
G=CreatUDN(&b);
printf("请输入开始遍历的起始结点名称:
");
scanf("%s",v);
printf("\n深度优先遍历(输出结点序列):
\n");
DFSTraverse(G,v);
printf("\n");
}
(2)采用prime算法或Kruscal算法求解最小生成树.
#defineINFINITY65535
typedefintstatus;
#include
#include
#include
#include"string.h"
#definemaxlen10
typedefstruct
{
charvexs[maxlen][maxlen];/*顶点信息集合,我们用它来存入顶点名字*/
intvexnum,arcnum;/*顶点数和边数*/
intarcs[maxlen][maxlen];/*邻接矩阵*/
}graph;
//定位输入节点的名称
intLocateVex(graphG,charu[maxlen])
{
inti;
for(i=0;i if(strcmp(u,G.vexs[i])==0) returni; return-1; } voidprim(graph&g)/*最小生成树*/ { inti,j,k,min,w,flag; intlowcost[maxlen];/*权值*/ intcloset[maxlen];/*最小生成树结点*/ charva[maxlen],vb[maxlen]; g.vexnum=6; g.arcnum=10; printf("请输入顶点名称: \n"); for(j=0;j scanf("%s",g.vexs[j]); for(i=0;i for(j=0;j { g.arcs[i][j]=INFINITY;//任意两个顶点间距离为无穷大。 } g.arcs[0][1]=6; g.arcs[1][0]=6; g.arcs[0][2]=1; g.arcs[2][0]=1; g.arcs[0][3]=5; g.arcs[3][0]=5; g.arcs[1][2]=5; g.arcs[2][1]=5; g.arcs[1][4]=3; g.arcs[4][1]=3; g.arcs[2][3]=5; g.arcs[3][2]=5; g.arcs[2][4]=6; g.arcs[4][2]=6; g.arcs[2][5]=4; g.arcs[5][2]=4; g.arcs[3][5]=2; g.arcs[5][3]=2; g.arcs[4][5]=6; g.arcs[5][4]=6; printf("最小生成树的边为: \n"); for(i=1;i { lowcost[i]=g.arcs[0][i]; closet[i]=1; } closet[0]=0;//初始v1是属于集合U的,即设它是最小生成树中节点的一员 j=1;//V是顶点集合 for(i=1;i { min=lowcost[j]; k=i; for(j=1;j if(lowcost[j] =0) { min=lowcost[j]; k=j; } if(i==1)flag=0; elseflag=closet[k]; closet[k]=0; printf("(%s,%s),",g.vexs[k],g.vexs[flag]); for(j=1;j if(g.arcs[k][j] =0) { lowcost[j]=g.arcs[k][j]; closet[j]=k; } } } voidmain() { graphg; prim(g); printf("\n"); } 实验结果截图: (1)对图进行深度优先遍历或广度优先遍历; (2)采用prime算法或Kruscal算法求解最小生成树.
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验 报告