图的深度优先遍历算法课程设计报告
图的深度优先搜索遍历算法分析及其应用

图的深度优先搜索遍历算法分析及其应用重庆邮电大学数学大类专业2008级《数学建模与数学实验》课程设计设计题目:图的深度优先搜索遍历算法分析及其应用设计时间: 2010.9.7-----2010.9. 12设计成绩:姓名:班级:学号:指导教师:图的深度优先搜索遍历算法分析及其应用摘要:文章介绍了图论,图的基本概念及其图的表示方法。
详细的分析了图中以邻接表为存储结构进行的图的深度优先搜索遍历的算法,并且在VC++环境中实现其算法的过程,对运行记过做了一定量的分析,最后介绍了基于该算法的一些应用。
关键词:图;深度优先搜索;遍历;算法图论〔Graph Theory〕是数学的一个分支。
它以图为研究对象。
图论中的图是由若干给定的点及连接两点的线所构成的图形,这种图形通常用来描述某些事物之间的某种特定关系,用点代表事物,用连接两点的线表示相应两个事物间具有这种关系。
图(Graph)是一种较线性表和树更复杂的数据结构,图形结构中,结点之间的关系可以是任意的,图中任意两个数据元素之间都可能相关。
因此,在研究有关图的问题时,要考虑图中每个顶点的信息,访问图中的各个顶点,而访问图中各个顶点的操作过程即使图的遍历,图的遍历算法是求解图的连通性问题,拓扑排序和求关键路径等算法的基础。
1 图的三元组定义图G是一个三元组由集合V,E和关联函数组成,记为:G=(V,E,W(G))。
其中V是顶点的集合,表示V(G)={V1,V2,V3,……Vn},V(G)≠NULL。
E是V中的点偶对的有穷集,表示为E(G)={e1,e2,e3……em},其中ei为<V j,Vt>或{Vj,Vt},若ei为{Vj,Vt},称ei为以V j 和Vt为端点的无向边;若ei为<Vj,Vt>,称ei为以V j为起点,Vt为终点的有向边;W(G)称为E→VxV的关联函数。
2图的存储结构图的存储结构除了要存储图中各个顶点的本身的信息外,同时还要存储顶点与顶点之间的所有关系(边的信息),因此,图的结构比较复杂,很难以数据元素在存储区中的物理位置来表示元素之间的关系,但也正是由于其任意的特性,故物理表示方法很多。
图论深度优先搜索实验报告

深度优先遍历一、实验目的了解深度优先遍历的基本概念以及实现方式。
二、实验内容1、设计一个算法来对图的进行深度优先遍历;2、用C语言编程来实现此算法。
用下面的实例来调试程序:三、使用环境Xcode编译器四、编程思路深度优先遍历图的方法是,从邻接矩阵出发:访问顶点v;依次从v的未被访问的邻接点出发,对图进行深度优先遍历;直至图中和v有路径相通的顶点都被访问;构造一个遍历辅助矩阵visited[]进行比较若此时图中尚有顶点未被访问,则从一个未被访问的顶点出发,重新进行深度优先遍历,直到图中所有顶点均被访问过为止,并将顶点信息存储在数组Q[]里面。
反复搜索可以通过使用函数的嵌套来实现。
五、调试过程1.程序代码://为方便调试,程序清晰直观删除了邻接矩阵的构造函数,//并且修改了main()函数,只保留了DFS函数#include <stdio.h>#define N 4 //定义顶点数int a[N][N]={{0,1,1,1},{1,0,0,0},{1,0,0,1},{1,0,0,1}}; //邻接矩阵由之前程序函给出int visited[N]={0}; //遍历比较的辅助矩阵,初始化为0矩阵int Q[N]; //用来存储各个顶点的信息static int last=-1;void DFS(int G[][N], int s){visited[s] = 1;Q[++last]=s;for (int i=0;i<N;i++) //进行遍历{if (G[s][i]==1){if(visited[i] == 0)DFS(G,i); //函数嵌套,完成一次搜索,指向下一个顶点 }}}int main(){DFS(a,0);printf("深度优先搜索为\n");for (int i=0;i<N;i++) //打印遍历的结果printf("%d ",Q[i]+1);return 0;}2.运行窗口:输出结果为各顶点按深度优先遍历的排序。
图的遍历 实验报告

图的遍历实验报告一、引言图是一种非线性的数据结构,由一组节点(顶点)和节点之间的连线(边)组成。
图的遍历是指按照某种规则依次访问图中的每个节点,以便获取或处理节点中的信息。
图的遍历在计算机科学领域中有着广泛的应用,例如在社交网络中寻找关系紧密的人员,或者在地图中搜索最短路径等。
本实验旨在通过实际操作,掌握图的遍历算法。
在本实验中,我们将实现两种常见的图的遍历算法:深度优先搜索(DFS)和广度优先搜索(BFS),并比较它们的差异和适用场景。
二、实验目的1. 理解和掌握图的遍历算法的原理与实现;2. 比较深度优先搜索和广度优先搜索的差异;3. 掌握图的遍历算法在实际问题中的应用。
三、实验步骤实验材料1. 计算机;2. 编程环境(例如Python、Java等);3. 支持图操作的相关库(如NetworkX)。
实验流程1. 初始化图数据结构,创建节点和边;2. 实现深度优先搜索算法;3. 实现广度优先搜索算法;4. 比较两种算法的时间复杂度和空间复杂度;5. 比较两种算法的遍历顺序和适用场景;6. 在一个具体问题中应用图的遍历算法。
四、实验结果1. 深度优先搜索(DFS)深度优先搜索是一种通过探索图的深度来遍历节点的算法。
具体实现时,我们可以使用递归或栈来实现深度优先搜索。
算法的基本思想是从起始节点开始,选择一个相邻节点进行探索,直到达到最深的节点为止,然后返回上一个节点,再继续探索其他未被访问的节点。
2. 广度优先搜索(BFS)广度优先搜索是一种逐层遍历节点的算法。
具体实现时,我们可以使用队列来实现广度优先搜索。
算法的基本思想是从起始节点开始,依次遍历当前节点的所有相邻节点,并将这些相邻节点加入队列中,然后再依次遍历队列中的节点,直到队列为空。
3. 时间复杂度和空间复杂度深度优先搜索和广度优先搜索的时间复杂度和空间复杂度如下表所示:算法时间复杂度空间复杂度深度优先搜索O(V+E) O(V)广度优先搜索O(V+E) O(V)其中,V表示节点的数量,E表示边的数量。
图的深度优先遍历和广度优先遍历

华北水利水电学院数据结构实验报告20 10 ~20 11 学年第一学期2008级计算机专业班级:107学号:200810702姓名:王文波实验四图的应用一、实验目的:1.掌握图的存储结构及其构造方法2.掌握图的两种遍历算法及其执行过程二、实验内容:以邻接矩阵或邻接表为存储结构,以用户指定的顶点为起始点,实现无向连通图的深度优先及广度优先搜索遍历,并输出遍历的结点序列。
提示:首先,根据用户输入的顶点总数和边数,构造无向图,然后以用户输入的顶点为起始点,进行深度优先和广度优先遍历,并输出遍历的结果。
三、实验要求:1.各班学号为单号的同学采用邻接矩阵实现,学号为双号的同学采用邻接表实现。
2.C/ C++完成算法设计和程序设计并上机调试通过。
3.撰写实验报告,提供实验结果和数据。
4.写出算法设计小结和心得。
四、程序源代码:#include<iostream.h>#define MaxVerNum 50struct edgenode{int endver;int inform;edgenode* edgenext;};struct vexnode{char vertex;edgenode* edgelink;};struct Graph{vexnode adjlists[MaxVerNum];int vexnum;int arcnum;};//队列的定义及相关函数的实现struct QueueNode{int nData;QueueNode* next;};struct QueueList{QueueNode* front;QueueNode* rear;};void EnQueue(QueueList* Q,int e) {QueueNode *q=new QueueNode;q->nData=e;q->next=NULL;if(Q==NULL)return;if(Q->rear==NULL)Q->front=Q->rear=q;else{Q->rear->next=q;Q->rear=Q->rear->next;}}void DeQueue(QueueList* Q,int* e) {if (Q==NULL)return;if (Q->front==Q->rear){*e=Q->front->nData;Q->front=Q->rear=NULL;}else{*e=Q->front->nData;Q->front=Q->front->next;}}//创建图void CreatAdjList(Graph* G){int i,j,k;edgenode* p1;edgenode* p2;cout<<"请输入顶点数和边数:"<<endl;cin>>G->vexnum>>G->arcnum;cout<<"开始输入顶点表:"<<endl;for (i=0;i<G->vexnum;i++){cin>>G->adjlists[i].vertex;G->adjlists[i].edgelink=NULL;}cout<<"开始输入边表信息:"<<endl;for (k=0;k<G->arcnum;k++){cout<<"请输入边<Vi,Vj>对应的顶点:";cin>>i>>j;p1=new edgenode;p1->endver=j;p1->edgenext=G->adjlists[i].edgelink;G->adjlists[i].edgelink=p1;p2=new edgenode;p2->endver=i;p2->edgenext=G->adjlists[j].edgelink;G->adjlists[j].edgelink=p2;//因为是无向图,所以有两次建立边表的过程}}//-------------------------------------------------------------深度优先遍历void DFS(Graph *G,int i,int visit[]){cout<<G->adjlists[i].vertex<<" ";visit[i]=1;edgenode *p=new edgenode;p=G->adjlists[i].edgelink;if(G->adjlists[i].edgelink&&!visit[p->endver]){DFS(G,p->endver,visit);}}void DFStraversal(Graph *G,char c)//深度优先遍历{cout<<"该图的深度优先遍历结果为:"<<endl;int visit[MaxVerNum];for(int i=0;i<G->vexnum;i++){visit[i]=0;//全部初始化为0,即未访问状态}int m;for (i=0;i<G->vexnum;i++){if (G->adjlists[i].vertex==c)//根据字符查找序号{m=i;DFS(G,i,visit);break;}}//继续访问未被访问的结点for(i=0;i<G->vexnum;i++){if(visit[i]==0)DFS(G,i,visit);}cout<<endl;}//-------------------------------------------------------------广度优先遍历void BFS(Graph* G,int v,int visit[]){QueueList *Q=new QueueList;Q->front=Q->rear=NULL;EnQueue(Q,v);while(Q->rear!=NULL){int e=0;DeQueue(Q,&e);cout<<G->adjlists[e].vertex<<" ";visit[e]=1;edgenode* p=new edgenode;p=G->adjlists[e].edgelink;if(p){int m=p->endver;if(m==0){EnQueue(Q,m);while(visit[m]==0){p=p->edgenext;if(p==NULL)break;m=p->endver;EnQueue(Q,m);}}}}}void BFStraversal(Graph *G,char c){cout<<"该图的广度优先遍历结果为:"<<endl;int visited[MaxVerNum];for (int i=0;i<G->vexnum;i++){visited[i]=0;}int m;for (i=0;i<G->vexnum;i++){if (G->adjlists[i].vertex==c){m=i;BFS(G,i,visited);break;}}//继续访问未被访问的结点for(i=0;i<G->vexnum;i++){if(visited[i]==0)BFS(G,i,visited);}cout<<endl;}void main(){Graph * G=new Graph;CreatAdjList(G);char ch;cout<<"请输入开始遍历的顶点:";cin>>ch;DFStraversal(G,ch);BFStraversal(G,ch);}五、程序运行情况(写出输入数据及运行结果)六、小结(包括收获、心得体会、存在的问题及解决问题的方法、建议等)注:内容一律使用宋体五号字,单倍行间距本次试验采用的是邻接表的方式实现图的深度优先遍历和广度优先遍历。
深度优先搜索实验报告

深度优先搜索实验报告引言深度优先搜索(Depth First Search,DFS)是图论中的一种重要算法,主要用于遍历和搜索图的节点。
在实际应用中,DFS被广泛用于解决迷宫问题、图的连通性问题等,具有较高的实用性和性能。
本实验旨在通过实际编程实现深度优先搜索算法,并通过实际案例验证其正确性和效率。
实验中我们将以迷宫问题为例,使用深度优先搜索算法寻找从入口到出口的路径。
实验过程实验准备在开始实验之前,我们需要准备一些必要的工具和数据。
1. 编程环境:我们选择使用Python语言进行编程实验,因其语法简洁而强大的数据处理能力。
2. 迷宫地图:我们需要设计一个迷宫地图,包含迷宫的入口和出口,以及迷宫的各个路径和墙壁。
实验步骤1. 首先,我们需要将迷宫地图转化为计算机可处理的数据结构。
我们选择使用二维数组表示迷宫地图,其中0表示墙壁,1表示路径。
2. 接着,我们将编写深度优先搜索算法的实现。
在DFS函数中,我们将使用递归的方式遍历迷宫地图的所有路径,直到找到出口或者遇到墙壁。
3. 在每次遍历时,我们将记录已经访问过的路径,以防止重复访问。
4. 当找到出口时,我们将输出找到的路径,并计算路径的长度。
实验结果经过实验,我们成功地实现了深度优先搜索算法,并在迷宫地图上进行了测试。
以下是我们的实验结果:迷宫地图:1 1 1 1 11 0 0 0 11 1 1 0 11 0 0 0 11 1 1 1 1最短路径及长度:(1, 1) -> (1, 2) -> (1, 3) -> (1, 4) -> (2, 4) -> (3, 4) -> (4, 4) -> (5, 4)路径长度:7从实验结果可以看出,深度优先搜索算法能够准确地找到从入口到出口的最短路径,并输出了路径的长度。
实验分析我们通过本实验验证了深度优先搜索算法的正确性和有效性。
然而,深度优先搜索算法也存在一些缺点:1. 只能找到路径的一种解,不能确定是否为最优解。
数据结构与算法实验报告图的深度优先与广度优先遍历

w=NextAdj(g,v);
}
}
}
void Travel_BFS(源自Node g[],int visited[],int n){
int i;
for(i=0;i<n;i++){
visited[i]=0;
}
for(i=0;i<n;i++){
if(visited[i]==0)
BFS(g,i,visited);
vertexType data;
Arcnode *firstarc;
}VNode;
irstarc=NULL;
}
for(i=0;i<n;i++){
printf("create the edges for the %dth vertex\n",i);
scanf("%d",&e);
while(e!=-1){
二、实验题目与要求
图的遍历
利用邻接矩阵或邻接表作为存储结构建立一个无向图,每个顶点中存放一种水果名(例如apple、orange、banana等,并要求从键盘输入),顶点数不少于5个。要求分别以深度优先搜索(DFS)和广度优先搜索(BFS)进行遍历,输出遍历结果。
3、源代码清单
=#include<>
p=(Arcnode *)malloc(sizeof(Arcnode));
p->next=NULL;
p->adjvex=e;
if(G[i].firstarc==NULL){
G[i].firstarc=p;
}else{
q->next=p;
}
q=p;
图的广度深度优先遍历课程设计

图的广度深度优先遍历摘要我们希望从图中某一顶点出发访遍图中其余各顶点,且使每一顶点仅被访问一次,这个过程就叫图的遍历。
而图的深度优先遍历类似与树的先根遍历,是树的先根遍历的推广,图的广度优先遍历是类似于树的按层次遍历的过程。
图的遍历过程实质上就是通过边或者弧找邻接点的过程。
在这,我们主要就是介绍遍历图的两种基本方法:深度优先搜索和广度优先搜索。
这两种方法无论是有向图还是有向图都适用。
广度优先搜索遍历图和深度优先搜索遍历图的时间复杂度相同,两者不同之处仅仅在于对顶点访问的顺序不同。
关键词图的遍历;广度优先遍历;深度优先遍历;目录1 引言 (1)2设计思路与方案 (2)2.1设计思路 (2)2.2设计方案 (2)3 详细实现 (4)3.1队列的定义及相关操作 (4)3.2图的邻接表存储结构的定义及无向图的建立 (5)3.3图的深度优先遍历算法 (6)3.4图的广度优先遍历非递归算法 (7)4 运行环境与结果 (8)4.1运行环境 (8)4.2 运行结果 (9)5结束语 (12)参考文献 (13)附录 (14)1 引言图的遍历算法是求解图的连通性问题,拓扑排序和求关键路径等算法的基础。
然而,图的遍历要比树的遍历复杂的多。
因为图的任何一顶点都有可能和其余的顶点相邻接。
所以在访问了某个顶点之后,可能沿着某条路径搜索之后,又回到该点是行。
为了避免同一顶点被访问多次,在图的遍历过程中,必须先记下每个已访问的顶点。
在次介绍两种对有向图和无向图都适用的遍历图的路径:深度优先搜索和广度优先搜索。
在此次设计中,用到的最多的队列,图的深度优先遍历类似于树的前序遍历。
采用的遍历方法的特点是尽可能先对纵深方向进行搜索。
广度优先遍历类似于树的按层次遍历。
采用的搜索方法的特点是尽可能先对横向进行搜索,鼓称其为广度优先搜索,相应的遍历称为广度优先遍历。
通过课程设计,我们会认识自身存在的很多问题,也有利于提高我们的动手能力,也把我们所学的东西和实践很好的结合起来,在这次设计中,再次体会了队列,深度优先搜索,广度优先搜索,等数据结构中的基本算法及其原理。
图的深度和广度优先遍历

数据结构课程实验报告课程名称数据结构班级计算123 实验日期2014年6月1日--3日姓名学号实验成绩实验名称实验四图的深度和广度优先遍历实验目的及要求【实验目的】熟练掌握图的邻接表存储结构及其图的建立方法和深度和广度优先遍历的方法。
【实验要求】1.图的存储可采用邻接矩阵或邻接表2.GraphCreate(): 按从键盘的数据建立图3.GraphDFS():深度优先遍历图4.GraphBFS():广度优先遍历图5.编写完整程序完成下面的实验内容并上机运行6.整理并上交实验报告实验环境硬件平台:普通的PC机软件平台:Windows 7 操作系统编程环境:VisualC++ 6.0实验内容1.以邻接矩阵或邻接表为存储结构,以用户指定的顶点为起始点,实现图的深度优先及广度优先搜索遍历,并输出遍历的结点序列。
算法描述及实验步骤算法:1)定义图的邻接表存储结构2)实现图的邻接表存储,即建立图的存储结构3)实现图的深度优先遍历4)定义队列的顺序存储结构,并实现队列的基本操作如初始化队列、入队、出对、判断队列是否为空等。
利用队列实现图的广度优先遍历。
伪代码:1)定义邻接矩阵和队列的存取结构;2)创建图L:1.置空图L->num=0;2.输入顶点数目num;3.i++,输入结点L->vexs[i]直到L->num;3)输出图L的各顶点;4)深度优先遍历图g中能访问的各个顶点1.输入起点的下标qidian;2.标志数组初始化mark[v]=0;3.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.输出广度优先遍历序列流程图:开始访问V 0,置标志求V 0邻接点有邻接点w求下一邻接点w V 0W 访问过结束NYN YDFS开始标志数组初始化V i =1Vi 访问过DFSV i =V i +1V i ==Vexnums结束NNYY调试过程及实验结果总结本次试验采用的是邻接表的方式实现图的深度优先遍历和广度优先遍历。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
合肥学院计算机科学与技术系课程设计报告2013~2014学年第二学期课程数据结构与算法课程设计名称图的深度优先遍历算法的实现学生姓名陈琳学号1204091022专业班级软件工程指导教师何立新2014 年9 月一:问题分析和任务定义涉及到数据结构遍会涉及到对应存储方法的遍历问题。
本次程序采用邻接表的存储方法,并且以深度优先实现遍历的过程得到其遍历序列。
深度优先遍历图的方法是,从图中某顶点v 出发: (1)访问顶点v ;(2)依次从v 的未被访问的邻接点出发,对图进行深度优先遍历;直至图中和v 有路径相通的顶点都被访问;(3)若此时图中尚有顶点未被访问,则从一个未被访问的顶点出发,重新进行深度优先遍历,直到图中所有顶点均被访问过为止。
二:数据结构的选择和概要设计 设计流程如图:图1 设计流程利用一维数组创建邻接表,同时还需要一个一维数组来存储顶点信息。
之后利用创建的邻接表来创建图,最后用深度优先的方法来实现遍历。
图 2 原始图 1.从0开始,首先找到0的关联顶点32.由3出发,找到1;由1出发,没有关联的顶点。
3.回到3,从3出发,找到2;由2出发,没有关联的顶点。
4.回到4,出4出发,找到1,因为1已经被访问过了,所以不访问。
所以最后顺序是0,3,1,2,4三:详细设计和编码1.创建邻接表和图void CreateALGraph (ALGraph* G) //建立邻接表函数.{int i,j,k,s;char y;EdgeNode* p; //工作指针.printf("请输入图的顶点数n与边数e(以逗号做分隔符):\n");scanf("%d,%d",&(G->n),&(G->e));scanf("%c",&y); //用y来接收回车符.for(s=0;s<G->n;s++){printf("请输入下标为%d的顶点的元素:\n",s);scanf("%c",&(G->adjlist[s].vertex));scanf("%c",&y); //用y来接收回车符.当后面要输入的是和单个字符有关的数据时候要存贮回车符,以免回车符被误接收。
G->adjlist[s].firstedge=NULL;}printf("请分别输入该图的%d条弧\n",G->e);for(k=0;k<G->e;k++){printf("请输入第%d条弧的起点和终点(起点下标,终点下标):\n",(k+1));scanf("%d,%d",&i,&j);p=(EdgeNode*)malloc(sizeof(EdgeNode));p->adjvex=j;p->next=G->adjlist[i].firstedge;G->adjlist[i].firstedge=p;}}2.深度优先遍历void DFS(ALGraph* G,int v) //深度优先遍历{EdgeNode* p;int w;printf("%c ",G->adjlist[v].vertex);visited[v]=True;for(p=G->adjlist[v].firstedge;p;p=p->next){w=p->adjvex;if(!visited[w])DFS(G,w); //对于没有访问过的顶点,调用深度优先搜索函数 }}void DFStraverse(ALGraph* G){int v;for(v=0;v<G->n;v++){visited[v]=False;}for(v=0;v<G->n;v++) //对v尚未访问到的邻接点w进行一个递归遍历.{if(!visited[v])DFS(G,v);}}四:上机调试过程在创建图时,输入程序printf("第%d条弧的起点和终点(格式为"起点下标,终点下标"):\n",(k+1));运行发现有十六个错误,错误截图为:图3 调试错误图经调试,将该段程序修改为:printf("请输入第%d 条弧的起点和终点(起点下标,终点下标):\n",(k+1));即可成功。
五:测试结果及其分析 1.测试结果:图4 测试结果图 2.分析此程序的图如下:图5 原始图遍历从0开始,第一步到3 0 3 241图6 第一次遍历与3相连的有1和2,在此先遍历1图7 第二次遍历而与1相关的没有,则返回到3,与3相连的有1和2,1遍历过,所以遍历2图8 第三次遍历2没有与之相关的顶点返回3,3的所有相关都遍历过,返回0,只剩下4图9 第四次遍历与4相关的1已遍历过,返回0,0的所有相关都已遍历,则深度优先遍历结束。
遍历顺序:0 3 1 2 4六:用户使用说明1.根据屏幕提示输入图的顶点数n与边数e(以逗号做分隔符);2.依次输入下标为0,1,2……(n-1)的顶点的元素;3.依次输入第1,2……e条弧的起点和终点,格式为:起点下标,终点下标;4.即可得出所输入图的深度优先遍历序列;七:参考文献1.王昆仑、李红.《数据结构与算法(第二版)》.北京:中国铁道出版社,20122.程杰.《大话数据结构[M]》.北京:清华大学出版社,20113.韩利凯、李军.《数据结构[M]》.浙江:浙江大学出版社,20134.谢若阳.《数据结构[M].北京》:清华大学出版社,20105.黄国瑜、叶乃菁.《数据结构[M]》.北京:清华大学出版社,2009八:附录//以邻接表为存储结构的深度优先搜索算法#include "stdio.h"#include "malloc.h"#define MaxVerNum 8#define MAXSIZE 100 //顶点最大个数#define False 0#define True 1int visited[MaxVerNum];//全局变量,0表示未被访问过,1表示已被访问过typedef char VertexType;typedef struct node //邻接表节点.{int adjvex; //邻接点的位置struct node* next; //指向下一个节点}EdgeNode; //邻接表中的节点类型typedef struct vnode //顶点节点.{VertexType vertex; //顶点信息EdgeNode* firstedge; //指向第一个邻接表节点}VertexNode; //表头节点类型typedef struct{VertexNode adjlist[MaxVerNum];//存储邻接表节点的一维数组int n,e; //定义顶点数n和边数e}ALGraph; //邻接表类型void CreateALGraph (ALGraph* G) //建立邻接表函数.{int i,j,k,s;char y;EdgeNode* p; //工作指针.printf("请输入图的顶点数n与边数e(以逗号做分隔符):\n");scanf("%d,%d",&(G->n),&(G->e));scanf("%c",&y); //用y来接收回车符.for(s=0;s<G->n;s++){printf(“请输入下标为%d的顶点的元素:\n",s);scanf("%c",&(G->adjlist[s].vertex));scanf("%c",&y);//用y来接收回车符.当后面要输入的是和单个字符有关的数据时候要存贮回车符,以免回车符被误接收。
G->adjlist[s].firstedge=NULL;}printf("请分别输入该图的%d条弧\n",G->e);for(k=0;k<G->e;k++){printf("请输入第%d条弧的起点和终点(起点下标,终点下标):\n",(k+1));scanf("%d,%d",&i,&j);p=(EdgeNode*)malloc(sizeof(EdgeNode))p->adjvex=j;p->next=G->adjlist[i].firstedge;G->adjlist[i].firstedge=p;}}void DFS(ALGraph* G,int v) //深度优先遍历{EdgeNode* p;int w;printf("%c ",G->adjlist[v].vertex);visited[v]=True;for(p=G->adjlist[v].firstedge;p;p=p->next)w=p->adjvex;if(!visited[w])DFS(G,w); //对于没有访问过的顶点,调用深度优先搜索函数}}void DFStraverse(ALGraph* G){int v;for(v=0;v<G->n;v++){visited[v]=False;}for(v=0;v<G->n;v++) //对v尚未访问到的邻接点w进行一个递归遍历{if(!visited[v])DFS(G,,v)}}int main(){ALGraph net; //定义一个有向图CreateALGraph(&net); //创建一个给定的有向图printf("图的深度优先遍历为:\n");DFStraverse(&net); //进行该有向图的深度优先遍历,并打印结果printf("\n");return 0;}。