图的遍历操作技巧实验报告文档格式.docx
《图的遍历操作技巧实验报告文档格式.docx》由会员分享,可在线阅读,更多相关《图的遍历操作技巧实验报告文档格式.docx(18页珍藏版)》请在冰豆网上搜索。
typedefstruct{
charvexs[MaxVertexNum];
//顶点表
intedges[MaxVertexNum][MaxVertexNum];
//邻接矩阵,可看作边表
intn,e;
//图中的顶点数n和边数e
}MGraph;
//用邻接矩阵表示的图的类型
//=========建立邻接矩阵=======
voidCreatMGraph(MGraph*G)
{
inti,j,k;
chara;
printf("
InputVertexNum(n)andEdgesNum(e):
"
);
scanf("
%d,%d"
&
G->
n,&
e);
//输入顶点数和边数
%c"
a);
InputVertexstring:
"
for(i=0;
i<
n;
i++)
{
G->
vexs[i]=a;
//读入顶点信息,建立顶点表
}
i++)
for(j=0;
j<
j++)
G->
edges[i][j]=0;
//初始化邻接矩阵
Inputedges,CreatAdjacencyMatrix\n"
for(k=0;
k<
e;
k++){//读入e条边,建立邻接矩阵
%d%d"
i,&
j);
//输入边(Vi,Vj)的顶点序号
edges[i][j]=1;
edges[j][i]=1;
//若为无向图,矩阵为对称矩阵;
若建立有向图,去掉该条语句
}
//=========定义标志向量,为全局变量=======
typedefenum{FALSE,TRUE}Boolean;
Booleanvisited[MaxVertexNum];
//========DFS:
深度优先遍历的递归算法======
voidDFSM(MGraph*G,inti)
{//以Vi为出发点对邻接矩阵表示的图G进行DFS搜索,邻接矩阵是0,1矩阵
intj;
G->
vexs[i]);
//访问顶点Vi
visited[i]=TRUE;
//置已访问标志
for(j=0;
j++)//依次搜索Vi的邻接点
if(G->
edges[i][j]==1&
&
!
visited[j])
DFSM(G,j);
//(Vi,Vj)∈E,且Vj未访问过,故Vj为新出发点
voidDFS(MGraph*G)
{
inti;
visited[i]=FALSE;
//标志向量初始化
if(!
visited[i])//Vi未访问过
DFSM(G,i);
//以Vi为源点开始DFS搜索
//===========BFS:
广度优先遍历=======
voidBFS(MGraph*G,intk)
{//以Vk为源点对用邻接矩阵表示的图G进行广度优先搜索
inti,j,f=0,r=0;
intcq[MaxVertexNum];
//定义队列
cq[i]=-1;
//队列初始化
vexs[k]);
//访问源点Vk
visited[k]=TRUE;
cq[r]=k;
//Vk已访问,将其入队。
注意,实际上是将其序号入队
while(cq[f]!
=-1){//队非空则执行
i=cq[f];
f=f+1;
//Vf出队
j++)//依次Vi的邻接点Vj
visited[j]){//Vj未访问
printf("
vexs[j]);
//访问Vj
visited[j]=TRUE;
r=r+1;
cq[r]=j;
//访问过Vj入队
//==========main=====
voidmain()
MGraph*G;
G=(MGraph*)malloc(sizeof(MGraph));
//为图G申请内存空间
CreatMGraph(G);
//建立邻接矩阵
PrintGraphDFS:
DFS(G);
//深度优先遍历
\n"
PrintGraphBFS:
BFS(G,3);
//以序号为3的顶点开始广度优先遍历
执行顺序:
8,9
01234567
Inputedges,CreatAdjacencyMatrix
01
02
13
14
25
26
37
47
56
01374256
31704256
2.邻接链表作为存储结构程序示例
#defineMaxVertexNum50//定义最大顶点数
typedefstructnode{//边表结点
intadjvex;
//邻接点域
structnode*next;
//链域
}EdgeNode;
typedefstructvnode{//顶点表结点
charvertex;
//顶点域
EdgeNode*firstedge;
//边表头指针
}VertexNode;
typedefVertexNodeAdjList[MaxVertexNum];
//AdjList是邻接表类型
typedefstruct{
AdjListadjlist;
//邻接表
//图中当前顶点数和边数
}ALGraph;
//图类型
//=========建立图的邻接表=======
voidCreatALGraph(ALGraph*G)
EdgeNode*s;
//定义边表结点
//读入顶点数和边数
i++)//建立边表
adjlist[i].vertex=a;
//读入顶点信息
adjlist[i].firstedge=NULL;
//边表置为空表
Inputedges,CreatAdjacencyList\n"
k++){//建立边表
//读入边(Vi,Vj)的顶点对序号
s=(EdgeNode*)malloc(sizeof(EdgeNode));
//生成边表结点
s->
adjvex=j;
//邻接点序号为j
next=G->
adjlist[i].firstedge;
adjlist[i].firstedge=s;
//将新结点*S插入顶点Vi的边表头部
adjvex=i;
//邻接点序号为i
adjlist[j].firstedge;
adjlist[j].firstedge=s;
//将新结点*S插入顶点Vj的边表头部
voidDFSM(ALGraph*G,inti)
{//以Vi为出发点对邻接链表表示的图G进行DFS搜索
EdgeNode*p;
adjlist[i].vertex);
//标记Vi已访问
p=G->
//取Vi边表的头指针
while(p){//依次搜索Vi的邻接点Vj,这里j=p->
adjvex
visited[p->
adjvex])//若Vj尚未被访问
DFSM(G,p->
adjvex);
//则以Vj为出发点向纵深搜索
p=p->
next;
//找Vi的下一个邻接点
voidDFS(ALGraph*G)
visited[i])//Vi未访问过DFSM(G,i);
//以Vi为源点开始DFS搜索}//==========BFS:
广度优先遍历=========
voidBFS(ALGraph*G,intk){//以Vk为源点对用邻接链表表示的图G进行广度优先搜索
inti,f=0,r=0;
//定义FIFO队列for(i=0;
i