图的深度和广度优先遍历

时间:2025-05-01

C语言

数据结构实验报告

题目:图的深度和广度优先遍历

班级: 计算084班 姓名:

段新强

学号:指导教师: 完成日期: 2010 年 5月 26日

C语言

青 岛 理 工 大 学

课程实验报告

C语言

2. 3.

输入顶点数目 num; i++,输入结点 L->vexs[i]直到 L->num;

3) 输出图 L 的各顶点; 4) 深度优先遍历图 g 中能访问的各个顶点 1. 2. 3.

输入起点的下标 qidian; 标志数组初始化 mark[v]=0; for(v=qidian;v<g.num+qidian;v++) //

{ v1=v%g.num; if(mark[v1]==0) DFS(g,v1,mark); //从第 v1 个点出发深度优先遍历图 g 中能访问 的各个顶点(算法描述里的流程图很详细) } 5) 广度优先周游图 g 中能访问的各个顶点。 1. 构造空队列; 2. 入队 a[0]; 3. a[0]出队,a[0]的邻接点入队,遍历 a[0]; 4. 队首出队,重复 3 直到队列为空; 5. 判断是否全遍历完了; 6. 输出广度优先遍历序列。

C语言

算 法 描 述 及 实 验 步 骤

开始

访问V0,置标志

求V0邻接点 点

N 有邻接点w

Y

结束

Y W访问过

N 求下一邻接点

w V0

DFS

C语言

开始

标志数组初始化

Vi=1

Vi访问过

N

DFS Y

Vi=Vi+1

Vi==Vexnums N Y 结束

调 试 过 程 及 实 验 结 果

总 这次实验完成得很快。不是因为程序比较简单,而是课件上有大部分的程 结 序,再到网上淘一份模板,凑凑就出来了。5

C语言

#include <stdio.h> 附 typedef int datatype; 录 #define maxsize 1024 # define n 100 typedef char VEXTYPE; typedef float ADJTYPE; typedef struct { VEXTYPE vexs[n]; ADJTYPE arcs[n][n]; int num ; }GRAPH;//邻接矩阵数据类型 typedef int DATATYPE; typedef struct { DATATYPE data[maxsize]; int front,rear; }SEQQUEUE;//队列数据类型 void GraphInit(GRAPH *L)//置空图 { L->num=0; } int GraphVexs(GRAPH *L)/

/求结点数 { return(L->num); } void GraphCreate(GRAPH *L)//创建图 { int i; GraphInit(L); printf("请输入顶点数目:"); scanf("%d",&L->num); printf("请输入各顶点的信息(单个符号) :\n"); for(i=0;i<L->num;i++) { fflush(stdin); scanf("%c",&L->vexs[i]); } printf("图已经创建完毕!"); } void GraphOut(GRAPH { L)//图的输出

C语言

int i; printf("\n 图的顶点数目为:%d",L.num); printf("\n 图的各顶点的信息为:\n"); for(i=0;i<L.num;i++) printf("%c ",L.vexs[i]); } void DFS(GRAPH g,int qidian,int mark[])//从第 qidian 个点出发深度优先遍 历图 g 中能访问的各个顶点 { int v1; mark[qidian]=1; printf("%c ",g.vexs[qidian]); for(v1=0;v1<g.num;v1++) { if(g.arcs[qidian][v1]!=0&&mark[v1]==0) DFS(g,v1,mark); } } void GraphDFS(GRAPH g)//深度优先遍历图 g 中能访问的各个顶点 { int qidian,v,v1,mark[maxsize]; printf("\n 深度周游:"); printf("\n 请输入起点的下标:"); scanf("%d",&qidian); for(v=0;v<g.num;v++) { mark[v]=0; } for(v=qidian;v<g.num+qidian;v++) { v1=v%g.num; if(mark[v1]==0) DFS(g,v1,mark); } } void QueueInit(SEQQUEUE *sq)//建立空队列 { sq->front=0; sq->rear=0; } int QueueIsEmpty(SEQQUEUE sq)//判断队列是否为空 { if (sq.rear==sq.front) return(1);7

C语言

else

return(0);

} int QueueFront(SEQQUEUE sq,DATATYPE *e)//保存队头元素 { if (QueueIsEmpty(sq)) { printf("queue is empty!\n");return 0;} else { *e=sq.data[(sq.front)]; return 1;} } int QueueIn (SEQQUEUE *sq,DATATYPE x)//把元素 x 入队尾 { if(sq->front==(sq->rear+1)%maxsize) { printf("queue is full!\n"); return 0; } else { sq->data[sq->rear]=x; sq->rear=(sq->rear+1)%maxsize; return(1); } } int QueueOut(SEQQUEUE *sq)//删除队首元素 { if(QueueIsEmpty(*sq)) { printf("queue is empty!\n"); return 0; } else { sq->front=(sq->front+1)%maxsize; return 1; } } void BFS(GRAPH g,int v,int mark[])//从 v 出发广度优先周游图 g 中能访问的 各个顶点 { int v1,v2; SEQQUEUE q; QueueInit(&q); QueueIn(&q,v); mark[v]=1;8

C语言

printf("%c ",g.vexs[v]); while(QueueIsEmpty(q)==0) { QueueFront(q,&v1); QueueOut(&q); for(v2=0;v2<g.num;v2++) { if(g.arcs[v1][v2]!=0&&mark[v2]==0) { QueueIn(&q,v2); mark[v2]=1; printf("%c ",g.vexs[v2]); } } } } void GraphBFS(GRAPH g)//深度优先周游图 g 中能访问的各个顶点 { int qidian,v,v1,mark[maxsize]; printf("\n 广度周游:"); printf("\n 请输入起点的下标:"); scanf("%d",&qidian); for(v=0;v<g.num;v++) { mark[v]=0; } for(v=qidian;v<g.num+qidian;v++) { v1=v%g.num; if(mark[v1]==0) BFS(g,v1,mark); } } void main()//主函数 { GRAPH tu; GraphCreate(&tu); GraphOut(tu); GraphDFS(tu); GraphBFS(tu); printf("\n"); }

…… 此处隐藏:1263字,全部文档内容请下载后查看。喜欢就下载吧 ……
图的深度和广度优先遍历.doc 将本文的Word文档下载到电脑

    精彩图片

    热门精选

    大家正在看

    × 游客快捷下载通道(下载后可以自由复制和排版)

    限时特价:7 元/份 原价:20元

    支付方式:

    开通VIP包月会员 特价:29元/月

    注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
    微信:fanwen365 QQ:370150219