中国石油大学数据结构上机实验7

  • 格式:docx
  • 大小:697.29 KB
  • 文档页数:10

下载文档原格式

  / 10
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

《数据结构》实验报告

学号2015011512 姓名胡明禹专业数学与应用数学时间2018.5.22

一、实验题目: 实验七图的遍历

二、实验目的

1. 掌握图的逻辑结构与基本存储方法;

2. 掌握有关图的操作算法并用高级语言实现;

3. 熟练掌握图的两种搜索路径遍历方法。

三、算法设计分析

实验由8个函数共同组成。其功能描述如下:

(1)主函数:统筹调用各个函数以实现相应功能

void main()

(2)返回顶点下标函数

int LocateVex(MGraph &G,VertexType ch)

{

//返回顶点在G中顶点向量中的下标值

int i;

for ( i = 0; G.vexnum; i++ )

if ( ch == G.vexs[i] )

return i;

return -1;

}

(3)返回第一个未被访问的相邻节点下标函数

int FirstAdjVex( MGraph &G,int v)

{

//得到第一个未被访问的相邻节点下标,若无,则返回-1

int i;

for ( i = 0; i < G.vexnum; i++ )

{

if ( !visited[i] && G.arcs[v][i].adj > 0 && G.arcs[v][i].adj

}

return -1;

}

(4)返回v的(相对于w)下一个邻接顶点函数

int NextAdjVex(MGraph &G,int v,int w)

{

//返回v的(相对于w)下一个邻接顶点,若w是v的最后一个邻接顶点,返回空

int i;

for (i=w; i

{

if (!visited[i] && G.arcs[v][i].adj>0 && G.arcs[v][i].adj < INFINITY) return i;

}

return -1;

}

(5)创建有向图的邻接矩阵函数

Status CreateDG(MGraph &G)

{

//创建有向图的邻接矩阵

int i,j,k,w;

char v1,v2;

printf("请输入顶点数和边数:");

scanf("%d%d",&G.vexnum,&G.arcnum);

visited = (int *)malloc(G.vexnum*sizeof(int));

for (i = 0; i < G.vexnum; i++ )

visited[i] = 0;

printf("\n请按次序输入%d个顶点字母标号(如ABCD等):",G.vexnum);

getchar(); //弹出缓冲区中上次最后出入的换行符,即最后按下的回车键

for (i=0;i

scanf("%c",&G.vexs[i]);

getchar(); //弹出缓冲区中上次最后出入的换行符,即最后按下的回车键

for (i=0;i

for (j=0;j

{

G.arcs[i][j].adj=INFINITY;

G.arcs[i][j].info=NULL;

}

printf("\n输入边的顶点和权值(如A B 1):\n"); //构造邻接矩阵

for (k=0;k

{

scanf("%c %c %d",&v1,&v2,&w); //输入一条有向边的起点终点和权值

i = LocateVex(G,v1); //确定顶点在G中的位置

j = LocateVex(G,v2);

G.arcs[i][j].adj = w;

getchar();//弹出缓冲区中上次最后出入的换行符,即最后按下的回车键

}

return OK;

}

(6)输出邻接矩阵函数

Status PrintArcs( MGraph &G)

{

//输出邻接矩阵

int i;

int j;

printf("邻接矩阵\n"); //按行序依次输出

for ( i = 0; i < G.vexnum; i++ )

{

for ( j = 0; j < G.vexnum; j++ )

{

if ( INFINITY == G.arcs[i][j].adj)

printf("%6s%","INF");

else

printf("%6d",G.arcs[i][j]);

}

printf("\n");

}

return OK;

}

(7)从某点开始进行深度优先遍历函数

Status DFS(MGraph &G,int v)

{

//从某点开始进行深度优先遍历

int w;

printf("\n");

visited[v] = TRUE; //访问第v个顶点

printf("%-4c",G.vexs[v]);

for ( w = FirstAdjVex(G,v); w>=0; w=NextAdjVex(G,v,w) ) if (!visited[w])

DFS(G,w); //对v尚未访问的邻接顶点w调用递归DFS return OK;

}

(8)菜单函数

void mainmenu() //输出菜单,供用户进行操作选择

{

printf("\n 菜单");

printf("\n ********************************************\n\n");

printf(" * 1.创建有向图邻接矩阵 *\n");

printf(" * 2.输出邻接矩阵 *\n");

printf(" * 3.从某点开始的深度优先遍历 *\n");

printf(" * 0.退出 *\n");

printf("\n ********************************************\n");