实验五 图to studentWord格式.docx

上传人:b****2 文档编号:13891048 上传时间:2022-10-14 格式:DOCX 页数:14 大小:19.91KB
下载 相关 举报
实验五 图to studentWord格式.docx_第1页
第1页 / 共14页
实验五 图to studentWord格式.docx_第2页
第2页 / 共14页
实验五 图to studentWord格式.docx_第3页
第3页 / 共14页
实验五 图to studentWord格式.docx_第4页
第4页 / 共14页
实验五 图to studentWord格式.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

实验五 图to studentWord格式.docx

《实验五 图to studentWord格式.docx》由会员分享,可在线阅读,更多相关《实验五 图to studentWord格式.docx(14页珍藏版)》请在冰豆网上搜索。

实验五 图to studentWord格式.docx

vtx;

edgenode 

*link;

}vexnode;

typedef 

vexnode 

Graph[n];

void 

Floyd(GraphG,floatA[n][n],intp[n][n])

{

i, 

j, 

k;

for 

(i=0;

i<

n;

i++)

for(j=0;

j<

j++)

{

A[i][j]=G[i][j];

P[i][j]=-1;

}

(k=0;

k<

k++)

for(i=0;

for(j=0;

j<

j++)

if(A[i][k]+A[k][j]<

A[i][j])

P[i][j]=k;

A[i][j]=A[i][k]+A[k][j];

}

五、思考与提高(直接将答案写在小题后面)

1.判断两点是否可达。

2.如何对程序进行修改,找一条人最少的公交线路?

3.练习图的拓扑排序

六、调试以下参考程序代码,并将运行效果截图

1.图的建立与遍历

#include<

conio.h>

stdio.h>

stdlib.h>

string.h>

#defineMAX_VERTEX_NUM20//图的最大顶点数

#defineMAXQSIZE30//队列的最大容量

enumBOOL{False,True};

typedefstructArcNode

{intadjvex;

//该弧所指向的顶点的位置

structArcNode*nextarc;

//指向下一条弧的指针

}ArcNode;

//弧结点

typedefstruct

{ArcNode*AdjList[MAX_VERTEX_NUM];

//指向第一条依附该顶点的弧的指针

intvexnum,arcnum;

//图的当前顶点和弧数

intGraphKind;

//图的种类,0---无向图,1---有向图

}Graph;

typedefstruct//队列结构

{intelem[MAXQSIZE];

//数据域

intfront;

//队头指针

intrear;

//队尾指针

}SqQueue;

BOOLvisited[MAX_VERTEX_NUM];

//全局变量——访问标志数组

voidCreateGraph(Graph&

);

//生成图的邻接表

voidDFSTraverse(Graph);

//深度优先搜索遍历图

voidDFS(Graph,int);

voidBFSTraverse(Graph);

//广度优先搜索遍历图

voidInitial(SqQueue&

//初始化一个队列

BOOLQueueEmpty(SqQueue);

//判断队列是否空

BOOLEnQueue(SqQueue&

int);

//将一个元素入队列

BOOLDeQueue(SqQueue&

int&

//将一个元素出队列

intFirstAdjVex(Graph,int);

//求图中某一顶点的第一个邻接顶点

intNextAdjVex(Graph,int,int);

//求某一顶点的下一个邻接顶点

voidmain()

{GraphG;

//采用邻接表结构的图

charj='

y'

;

printf("

本程序将演示生成一个图,并对它进行遍历.\n"

printf("

首先输入要生成的图的种类.\n"

0---无向图,1--有向图\n"

之后输入图的顶点数和弧数。

\n格式:

顶点数,弧数;

例如:

4,3\n"

接着输入各边(弧尾,弧头).\n例如:

\n1,2\n1,3\n2,4\n"

程序会生成一个图,并对它进行深度和广度遍历.\n"

深度遍历:

1->

2->

4->

3\n广度遍历:

3->

4\n"

while(j!

='

N'

&

j!

n'

{printf("

请输入要生成的图的种类(0/1):

"

scanf("

%d"

&

G.GraphKind);

//输入图的种类

请输入顶点数和弧数:

%d,%d"

G.vexnum,&

G.arcnum);

//输入图的顶点数和弧数

CreateGraph(G);

//生成邻接表结构的图

DFSTraverse(G);

BFSTraverse(G);

图遍历完毕,继续进行吗?

(Y/N)"

%c"

j);

}

G)

{//构造邻接表结构的图G

inti;

intstart,end;

ArcNode*s;

for(i=1;

i<

=G.vexnum;

i++)G.AdjList[i]=NULL;

//初始化指针数组

=G.arcnum;

i++)

{scanf("

start,&

end);

//输入弧的起点和终点

s=(ArcNode*)malloc(sizeof(ArcNode));

//生成一个弧结点

s->

nextarc=G.AdjList[start];

//插入到邻接表中

adjvex=end;

G.AdjList[start]=s;

if(G.GraphKind==0)//若是无向图,再插入到终点的弧链中

{s=(ArcNode*)malloc(sizeof(ArcNode));

nextarc=G.AdjList[end];

adjvex=start;

G.AdjList[end]=s;

voidDFSTraverse(GraphG)

{//深度优先遍历图G

DFSTraverse:

i++)visited[i]=False;

//访问标志数组初始化

if(!

visited[i])DFS(G,i);

//对尚未访问的顶点调用DFS

\b\b\n"

voidDFS(GraphG,inti)

{//从第i个顶点出发递归地深度遍历图G

intw;

visited[i]=True;

//访问第i个顶点

%d->

i);

for(w=FirstAdjVex(G,i);

w;

w=NextAdjVex(G,i,w))

visited[w])DFS(G,w);

//对尚未访问的邻接顶点w调用DFS

voidBFSTraverse(GraphG)

{//按广度优先非递归的遍历图G,使用辅助队列Q和访问标志数组visited

inti,u,w;

SqQueueQ;

BFSTreverse:

=G.vexnum;

Initial(Q);

//初始化队列

visited[i])

{visited[i]=True;

//访问顶点i

EnQueue(Q,i);

//将序号i入队列

while(!

QueueEmpty(Q))//若队列不空,继续

{DeQueue(Q,u);

//将队头元素出队列并置为u

for(w=FirstAdjVex(G,u);

w=NextAdjVex(G,u,w))

visited[w])//对u的尚未访问的邻接顶点w进行访问并入队列

{visited[w]=True;

w);

EnQueue(Q,w);

intFirstAdjVex(GraphG,intv)

{//在图G中寻找第v个顶点的第一个邻接顶点

G.AdjList[v])return0;

elsereturn(G.AdjList[v]->

adjvex);

intNextAdjVex(GraphG,intv,intu)

{//在图G中寻找第v个顶点的相对于u的下一个邻接顶点

ArcNode*p;

p=G.AdjList[v];

while(p->

adjvex!

=u)p=p->

nextarc;

//在顶点v的弧链中找到顶点u

if(p->

nextarc==NULL)return0;

//若已是最后一个顶点,返回0

elsereturn(p->

nextarc->

//返回下一个邻接顶点的序号

Q)

{//队列初始化

Q.front=Q.rear=0;

BOOLQueueEmpty(SqQueueQ)

{//判断队列是否已空,若空返回True,否则返回False

if(Q.front==Q.rear)returnTrue;

elsereturnFalse;

Q,intch)

{//入队列,成功返回True,失败返回False

if((Q.rear+1)%MAXQSIZE==Q.front)returnFalse;

Q.elem[Q.rear]=ch;

Q.rear=(Q.rear+1)%MAXQSIZE;

returnTrue;

Q,int&

ch)

{//出队列,成功返回True,并用ch返回该元素值,失败返回False

if(Q.front==Q.rear)returnFalse;

ch=Q.ele

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 教学研究 > 教学反思汇报

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1