数据结构与算法实验报告图Word格式文档下载.docx
《数据结构与算法实验报告图Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《数据结构与算法实验报告图Word格式文档下载.docx(9页珍藏版)》请在冰豆网上搜索。
//须将队列定义中DataType改为int
EdgeNode*p;
InitQueue(&
Q);
//队列初始化
//访问源点vk
printf("
visitvertex:
%e"
,G->
adjlist[k].vertex);
visited[k]=TRUE;
EnQueue(&
Q,k);
//vk已访问,将其人队。
(实际上是将其序号人队)
while(!
QueueEmpty(&
Q)){//队非空则执行
i=DeQueue(&
//相当于vi出队
p=G->
adjlist[i].firstedge;
//取vi的边表头指针
while(p){//依次搜索vi的邻接点vj(令p->
adjvex=j)
if(!
visited[p->
adivex]){//若vj未访问过
visitvertex:
%c"
,C->
adjlistlp->
adjvex].vertex);
//访问vj
visited[p->
adjvex]=TRUE;
Q,p->
adjvex);
//访问过的vj人队
}//endif
p=p->
next;
//找vi的下一邻接点
}//endwhile
}//endofBFS
(2)邻接矩阵表示的图的广度优先搜索算法
voidBFSM(MGraph*G,intk)
{以vk为源点对用邻接矩阵表示的图G进行广度优先搜索
inti,j;
InitQueue(&
vexs[k]);
Q)){
//vi出队
for(j=0;
j<
G->
n;
j++)//依次搜索vi的邻接点vj
if(G->
edges[i][j]==1&
&
!
visited[j]){//vi未访问
vexs[j]);
//访问vi
visited[j]=TRUE;
Q,j);
//访问过的vi人队
}
}//BFSM
2.邻接表
#include<
stdio.h>
malloc.h>
#defineMAX_NUM20
#defineOK1
#defineERROR-1
typedefintElemType;
typedefcharVertexType;
typedefstructArcNode
{//定义弧结点
ElemTypedata;
ArcNode*nextarc;
}ArcNode,*ArcLink;
typedefstructVNode
{//定义顶点结点
VertexTypedata;
ArcLinkfirstarc;
}VNode,AdjList[MAX_NUM];
typedefstruct
{
AdjListvdata;
intvexnum,arcnum;
}ALGraph;
//构建图的邻接表
intCreategraph(ALGraph&
G,intn){
ArcLinkp;
inte,i;
charv,w;
for(i=0;
i<
i++){
G.vdata[i].data='
A'
+i;
G.vdata[i].firstarc=NULL;
}
printf("
输入边的个数:
\n"
);
scanf("
%d"
&
e);
e;
i++)
getchar();
//接收scanf的回车符
请输入某边所依附的两个顶点用A--%C表示\n"
'
+n-1);
%c%c"
v,&
w);
//fflush(stdin);
V=%c,W=%c,I=%d\n"
v,w,i);
p=(ArcLink)malloc(sizeof(ArcNode));
p->
data=(int)(w-'
+1);
%d\n"
p->
data);
nextarc=G.vdata[(int)(v-'
)].firstarc;
G.vdata[(int)(v-'
)].firstarc=p;
p=(ArcLink)malloc(sizeof(ArcNode));
data=(int)(v-'
nextarc=G.vdata[(int)(w-'
G.vdata[(int)(w-'
G.vexnum=n;
G.arcnum=e;
returnOK;
//输出邻接表
intprintGraph(ALGraphG){
inti;
G.vexnum;
%2d%c"
i,G.vdata[i]);
for(p=G.vdata[i].firstarc;
p!
=NULL;
p=p->
nextarc){
-->
"
intmain()
ALGraphG;
intn;
请输入你要构建的无向图的顶点个数:
n);
Creategraph(G,n);
你所构建的无向图的邻接表如下所示:
printGraph(G);
#defineMaxVertexNum20//最大顶点数,应由用户定义
//顶点类型应由用户定义
typedefintEdgeType;
//边上的权值类型应由用户定义
//定义图的种类类型,yxt有向图,yxw有向网,wxt无向图,wxw无向网
typedefenum{yxt,yxw,wxt,wxw}GraphKind;
typedefstruct
VertexTypevexs[MaxVertexNum];
//顶点表
//邻接矩阵,可看作边表,如果是无权图,1:
相邻,0:
不相邻
EdgeTypeedges[MaxVertexNum][MaxVertexNum];
intn;
inte;
//图中当前的顶点数和边数
GraphKindgkind;
//图的种类标示
}MGraph;
//函数声明
intcreatWxw(MGraph*G);
intcreatYxt(MGraph*G);
intcreatYxw(MGraph*G);
intcreatWxt(MGraph*G);
voidprintGraph(MGraph*G)
inti,j;
for(i=0;
{
for(j=0;
j++)
%d"
G->
edges[i][j]);
//根据不同的种类构建不同的图
intcreatGraph(MGraph*G)
输入图的种类,0:
有向图,1:
有向网,2:
无向图,3:
无向网:
scanf("
(G->
gkind));
switch(G->
gkind)
{
case0:
returncreatYxt(G);
break;
case1:
returncreatYxw(G);
case2:
returncreatWxt(G);
case3:
returncreatWxw(G);
default:
returnERROR;
}
//创建无向网,网指的是具有权值的图
intcreatWxw(MGraph*G)
inti=0,j=0,k=0;
charv1,v2;
//弧的两个结点
intw;
//权值
输入图的结点数:
输入图的边数:
getchar();
//输入结点
输入结点,用大写字母标示(要求第一个顶点是A),如:
A:
%c"
vexs[i]);
//初始化邻接矩阵
G->
edges[i][j]=-1;
//输入边连接的两个结点
for(k=0;
k<
k++)
//i,j作为矩阵的行和列
输入弧和权值:
%c%c%d"
v1,&
v2,&
i=v1-'
;
j=v2-'
edges[i][j]=w;
edges[j][i]=w;
returnOK;
MGraphG;
creatGraph(&
G);
printGraph(&
return0;
五、成绩评定
优
良
中
及格
不及格
出勤
内容
格式
创新
效果
总评
指导教师:
年月日