数据结构实验-图的储存与遍历

合集下载

数据结构实验五---图的遍历及其应用实现

数据结构实验五---图的遍历及其应用实现

数据结构实验五---图的遍历及其应用实现实验五图的遍历及其应用实现一、实验目的1.熟悉图常用的存储结构。

2.掌握在图的邻接矩阵和邻接表两种结构上实现图的两种遍历方法实现。

3.会用图的遍历解决简单的实际问题。

二、实验内容[题目] :从键盘上输入图的顶点和边的信息,建立图的邻接表存储结构,然后以深度优先搜索和广度优先搜索遍历该图,并输出起对应的遍历序列. 试设计程序实现上述图的类型定义和基本操作,完成上述功能。

该程序包括图类型以及每一种操作的具体的函数定义和主函数。

三、实验步骤(一)、数据结构与核心算法的设计描述:本实验主要在于图的基本操作,关键是图的两种遍历,仔细分析图的遍历的特点,不难发现,其符合递归的特点,因此可以采用递归的方法遍历。

本实验图的存储结构主要采用邻接表,总共分为四个模块:图的创建、位置的查找、深度优先遍历、广度优先遍历。

以下是头文件中数据结构的设计和相关函数的声明:#include#include#include#nclude#define OVERFLOW -2#define MAX_VERTEX_NUM 50 //最大顶点数#define MAXQSIZE 100# define OK 1typedef int VRType;typedef int InfoType;typedef int QElemType;typedef enum{DG,DN,UDG,UDN}GraphKind;typedef struct ArcNode // 弧结点{int adjvex; //邻接点域,存放与Vi邻接的点在表头数组中的位置struct ArcNode *nextarc; //链域指向vi的下一条边或弧的结点,InfoType *info; //定义与弧相关的权值,无权则为0 }ArcNode;typedef struct VNode //表头结点{char vexdata; //存放顶点信息struct ArcNode *firstarc; //指示第一个邻接点}VNode,AdjList[MAX_VERTEX_NUM];typedef struct{ //图的结构定义AdjList vertices; //顶点向量int vexnum, arcnum; //vexnum为顶点数arcnum为弧或边的个数GraphKind kind; // 图的种类标志}MGraph;typedef struct Queue //构建循环队列{QElemType *base;int front;int rear;}Queue;void CreateGraph(MGraph &G); //图的创建void DFSTraverse(MGraph &G) ; //深度优先遍历void BFSTraverse(MGraph &G); //广度优先遍历int LocateVex(MGraph &G, char &v);//查找顶点v的位置(二)、函数调用及主函数设计void main(){int x;MGraph G;CreateGraph(G);cout<<"创建图成功!"<<endl;< p="">cout<<"1 深度优先搜索"<<endl<<"2 p="" 广度优先搜索"<<endl;<="">cin>>x;if(x==1){DFSTraverse(G);cout<<"深度优先搜索结束!"<<endl;< p="">}else if(x==2){BFSTraverse(G);cout<<"广度优先搜索结束!"<<endl;< p="">}elsecout<<"输入有误!"<<endl<<"再见!"<<endl;< p="">}(三)、实验总结由于图的基本操作在图这一章节中起着很主要的作用,所以在实验前就对实验做了充分的准备,实验的成功核心在于两种遍历的实现,因此只有充分理解遍历算法的精髓,才能更好的做好实验。

数据结构实验报告图的遍历

数据结构实验报告图的遍历

数据结构实验报告图的遍历一、实验目的本实验旨在通过实践的方式学习图的遍历算法,掌握图的深度优先搜索(DFS)和广度优先搜索(BFS)的实现方法,加深对数据结构中图的理解。

二、实验步骤1. 创建图的数据结构首先,我们需要创建一个图的数据结构,以方便后续的操作。

图可以使用邻接矩阵或邻接表来表示,这里我们选择使用邻接矩阵。

class Graph:def__init__(self, num_vertices):self.num_vertices = num_verticesself.adj_matrix = [[0] * num_vertices for _ in range(num_vertic es)]def add_edge(self, v1, v2):self.adj_matrix[v1][v2] =1self.adj_matrix[v2][v1] =1def get_adjacent_vertices(self, v):adjacent_vertices = []for i in range(self.num_vertices):if self.adj_matrix[v][i] ==1:adjacent_vertices.append(i)return adjacent_vertices2. 深度优先搜索(DFS)DFS是一种遍历图的算法,其基本思想是从图的某一顶点开始,沿着一条路径一直走到最后,然后返回尚未访问过的顶点继续遍历,直到所有顶点都被访问过为止。

def dfs(graph, start_vertex):visited = [False] * graph.num_verticesstack = [start_vertex]while stack:vertex = stack.pop()if not visited[vertex]:print(vertex)visited[vertex] =Truefor neighbor in graph.get_adjacent_vertices(vertex):if not visited[neighbor]:stack.append(neighbor)3. 广度优先搜索(BFS)BFS同样是一种遍历图的算法,其基本思想是从图的某一顶点开始,首先访问其所有邻接点,然后再依次访问邻接点的邻接点,直到所有顶点都被访问过为止。

【数据结构】图的存储和遍历实验报告

【数据结构】图的存储和遍历实验报告

(2) 经验和体会:
必须培养严谨的科学态度。自己在编程时经常因为一些类似于“少了 分号”的小错误而导致错误,不够认真细致,这给自己带来了许多麻 烦。编程是一件十分严谨的事情,容不得马虎。所以在今后自己一定 要培养严谨的科学态度。我想这不仅是对于程序设计,做任何事都应 如此。
4. 测试结果
采用测试数据,列出实际的输入、输出结果。
case 0:ch1='n';break; default:printf("\n\t\t输出错误!清重新输入!"); } } }
3. 调试分析
(1) 调试过程中主要遇到哪些问题?是如何解决 的?
由于实习之初对邻接表的存储结构了解不是很清楚,所以在运行出了 一个小错误,即在输出邻接表时,每个结点都少了一个邻接点。通过 仔细分析,发现是输出邻接表的语句不对,其中的for()循环语句 中的控制条件:p->next!=NULL出了问题。将其改成p!=NULL后,邻 接表便可顺利输出。下面就是经修改后以有向图G1和无向图G2为例业 级 01 __班 姓名学号2010年1 0月 9日
1.
上机题目: 图的存储和遍历
2. 详细设计
#include<stdio.h> #define GRAPHMAX 10 #define FALSE 0 #define TRUE 1 #define error printf #define QueueSize 30 typedef struct { char vexs[GRAPHMAX]; int edges[GRAPHMAX][GRAPHMAX]; int n,e; }MGraph; int visited[10]; typedef struct { int front,rear,count; int data[QueueSize]; }CirQueue;

数据结构课程设计图的存储与遍历报告

数据结构课程设计图的存储与遍历报告

数据结构课程设计图的存储与遍历报告《数据结构》课程设计题目图的存储与遍历学生姓名指导教师学院专业班级完成时间目录第一章课程设计目的 (2)第二章课程设计内容和要求 (2)第三章课程设计分析 (3)第四章算法描述 (4)第五章源代码 (8)第六章运行结果分析 (13)第七章结束语 (15)第八章参考文献 (15)第一章课程设计目的本学期我们对《数据结构》这门课程进行了学习。

这门课程是一门实践性非常强的课程,为了让大家更好地理解与运用所学知识,提高动手能力,我们进行了此次课程设计实习。

这次课程设计不但要求实习者掌握《数据结构》中的各方面知识,还要求实习者具备一定的C语言基础和编程能力。

具体说来,这次课程设计主要有两大方面目的。

一是让实习者通过实习掌握《数据结构》中的知识。

对于《图的存储与遍历》这一课题来说,所要求掌握的数据结构知识主要有:图的邻接表存贮结构、队列的基本运算实现、邻接表的算法实现、图的广度优先搜索周游算法实现、图的深度优先搜索周游算法实现。

二是通过实习巩固并提高实习者的C语言知识,并初步了解Visual C++的知识,提高其编程能力与专业水平。

第二章课程设计内容和要求2.1课程设计内容该课题要求以邻接表的方式存储图,输出邻接表,并要求实现图的深度、广度两种遍历。

2.1.1图的邻接表的建立与输出对任意给定的图(顶点数和边数自定),并且对有向图与无向图都应进行讨论,根据邻接表的存储结构建立图的邻接表并输出之。

尽量用图形化的方式输出邻接表。

2.1.2 图的遍历的实现图的遍历包括图的广度优先遍历与深度优先遍历。

对于广度优先遍历应利用队列的五种基本运算(置空队列、进队、出队、取队头元素、判队空)来实现。

首先建立一空队列,从初始点出发进行访问,当被访问时入队,访问完出队。

并以队列是否为空作为循环控制条件。

对于深度优先遍历则采用递归或非递归算法来实现。

2.2 运行环境该程序的运行环境为Windows xp系统,Microsoft Visual C++6.0版本。

数据结构实验---图的储存与遍历

数据结构实验---图的储存与遍历

数据结构课程实验报告一、实验目的掌握图这种复杂的非线性结构的邻接矩阵和邻接表的存储表示, 以及在此两种常用存储方式下深度优先遍历(DFS)和广度优先遍历(BFS)操作的实现。

二、实验内容与实验步骤题目1: 对以邻接矩阵为存储结构的图进行DFS和BFS遍历问题描述: 以邻接矩阵为图的存储结构, 实现图的DFS和BFS遍历。

基本要求:建立一个图的邻接矩阵表示, 输出顶点的一种DFS和BFS序列。

测试数据: 如图所示题目2: 对以邻接表为存储结构的图进行DFS和BFS遍历问题描述: 以邻接表为图的存储结构, 实现图的DFS和BFS遍历。

基本要求:建立一个图的邻接表存贮, 输出顶点的一种DFS和BFS序列。

测试数据: 如图所示三、附录:在此贴上调试好的程序。

#include<stdio.h>#include<malloc.h>#include<string.h>#define M 100typedef struct node{char vex[M][2];int edge[M ][ M ];int n,e;}Graph;int visited[M];Graph *Create_Graph(){ Graph *GA;int i,j,k,w;GA=(Graph*)malloc(sizeof(Graph));printf ("请输入矩阵的顶点数和边数(用逗号隔开): \n");scanf("%d,%d",&GA->n,&GA->e);printf ("请输入矩阵顶点信息: \n");for(i = 0;i<GA->n;i++)scanf("%s",&(GA->vex[i][0]),&(GA->vex[i][1]));for (i = 0;i<GA->n;i++)for (j = 0;j<GA->n;j++)GA->edge[i][j] = 0;for (k = 0;k<GA->e;k++){ printf ("请输入第%d条边的顶点位置(i,j)和权值(用逗号隔开): ",k+1);scanf ("%d,%d,%d",&i,&j,&w);GA->edge[i][j] = w;}return(GA);}void dfs(Graph *GA, int v){ int i;printf("%c%c\n",GA->vex[v][0],GA->vex[v][1]);visited[v]=1;for(i=0; i<GA->n; i++)if (GA->edge[v][i]==1 && visited[i]==0) dfs(GA, i);}void traver(Graph *GA){ int i;for(i=0; i<GA->n; i++)visited[i]=0;for(i=0; i<GA->n;i++)if(visited[i]==0)dfs(GA, i);}void bfs( Graph *GA, int v){ int j,k,front=-1,rear=-1;int Q[M];printf("%c%c\n",GA->vex[v][0],GA->vex[v][1]); visited[v]=1;rear=rear+1;Q[rear]=v;while (front!=rear){ front=front+1;k=Q[front];for (j=0; j<GA->n; j++)if (GA->edge[k][j]==1 && visited[j]==0){ printf("%c%c\n",GA->vex[j][0],GA->vex[j][1]);visited[j]=1;rear=rear+1;Q[rear]=j;}}}void traver1(Graph *GA){ int i;for (i=0; i<GA->n;i++)visited[i]=0;for (i=0; i<GA->n; i++)if (visited[i]==0)bfs(GA, i);}typedef struct NODE{ int adjvex;struct NODE *next;}ENode;typedef struct NODE1{ char vex[2];ENode *first;} VexNode;typedef struct FS1{VexNode GL[M];int bian,top;}FS;FS *CreateGL( ){ FS *kk=(FS *)malloc(sizeof(FS));int i,j,k;ENode *s;printf("请输入顶点数和边数(用逗号隔开): \n");scanf("%d,%d",&kk->top, &kk->bian);printf("请输入顶点信息: \n");for (i=0; i<kk->top; i++){ scanf("%s",kk->GL[i].vex);kk->GL[i].first=NULL; }printf("请输入边的信息(i,j): \n");for (k=0;k<kk->bian;k++){ scanf("\n%d,%d",&i,&j);s =(ENode*)malloc(sizeof(ENode));s->adjvex=j;s->next=kk->GL[i].first;kk->GL[i].first =s;}return kk;}void DFS(FS *kk, int v){ ENode *w; int i;printf("%s\n",kk->GL[v].vex); visited[v]=1;w=kk->GL[v].first ;while (w!=NULL){ i=w->adjvex;if (visited[i]==0)DFS(kk,i);w=w->next;}}void TRAVER(FS *kk){ int i;for(i=0; i<kk->top;i++)visited[i]=0;for(i=0; i<kk->top; i++)if(visited[i]==0)DFS(kk, i);}void BFS(FS *kk, int v){ int Q[M], front=-1,rear=-1;ENode *w;int i, k;printf("%s\n",kk->GL[v].vex);visited[v]=1;rear=rear+1; Q[rear]=v;while (front!=rear){ front=front+1;k=Q[front];w=kk->GL[k].first;while(w!=NULL){ i=w->adjvex;if( visited[i]==0){ visited[i]=1; printf("%s",kk->GL[i].vex);rear=rear+1; Q[rear]=i;}w=w->next;}}}void TRAVER1(FS *kk){ int i;for(i=0; i<kk->top;i++) visited[i]=0;for(i=0; i <kk->top;i++)if(visited[i]==0)BFS(kk,i);}int main(){int i=0;Graph *p;FS *q;while(i=1){/*建立菜单*/char jz[30]={"1.创建邻接矩阵"};char jd[30]={"2.邻接矩阵DFS遍历"};char jb[30]={"3.邻接矩阵BFS遍历"};char bg[30]={"4.创建邻接表"};char bd[30]={"5.邻接表DFS遍历"};char bb[30]={"6.邻接表BFS遍历"};char tc[30]={"7.退出"};char mn[30]={"菜单"};int l=strlen(jd);int o=strlen(mn);int m,n;printf("\n");for(m=0;m<=(2*l-o)/2;m++)printf(" ");printf("%s",mn);for(m=0;m<=(2*l-o)/2;m++)printf(" ");printf("\n");for(m=0;m<=2*l;m++)printf("*");printf("\n");printf("* %s *\n* %s*\n* %s *\n* %s *\n* %s *\n* %s *\n* %s*\n",jz,jd,jb,bg,bd,bb,tc);for(m=0;m<=2*l;m++)printf("*");printf("\n");/*选择功能*/printf("请输入所需功能序号: ");scanf("%d",&n);switch(n){case 1: p=Create_Graph();break;case 2: traver(p);break;case 3: traver1(p);break;case 4: q=CreateGL();break;case 5: TRAVER(q);break;case 6: TRAVER1(q);break;case 7: return 0;default:printf("输入功能序号有误!\n");}}return 0;}四、运行结果:在此把运行结果从屏幕上拷下来贴在此五、心得体会:测试数据要注意现实中矩阵是从1开始, 而数组里是从0开始。

图的两种存储和遍历.doc

图的两种存储和遍历.doc

图的两种存储和遍历实验7图的两种存储和遍历一、实验内容:(1)键盘输入数据,分别建立有向图和无向图邻接表。

(2)输出邻接表。

(3)基于有向图的邻接表计算每个顶点的度,并输出。

(4)利用邻接表存储实现无向图的深度优先遍历。

(5)利用邻接表存储实现无向图的广度优先遍历。

(6)在主功能中设计一个简单的菜单,分别调试上述算法。

第二,源代码:#包含#包含#定义最大顶点数20 #定义确定1 #定义错误0 #定义溢出0 int访问[最大顶点数];//表节点typedef结构ArcNode { int adjvex构造ArcNode * nextarcchar * info} ArcNode//头节点typedef结构VNode {char数据;弧节点*首弧;}虚拟节点,列出[最大顶点数];//图结构typedef结构{AdjList顶点;int vexnum,arcnum} ALGraph//用于BFS遍历的附加链队列节点结构typedefstructqcode {intdata};结构QNode *下一步;}QNode,* QueuePtr//链队列typedef结构{QueuePtr前端;队列后部;}链接队列;//初始化链组intinitqueue(link queue q){ q . front=q . reason=(queue ptr)malloc(sizeof(qcode));如果(!Q.front)出口(OVERFLOW);问:前线-一、实验内容:(1)键盘输入数据,分别建立有向图和无向图邻接表。

(2)输出邻接表。

(3)基于有向图的邻接表计算每个顶点的度,并输出。

(4)利用邻接表存储实现无向图的深度优先遍历。

(5)利用邻接表存储实现无向图的广度优先遍历。

(6)在主功能中设计一个简单的菜单,分别调试上述算法。

第二,源代码:#包含#包含#定义最大顶点数20 #定义确定1 #定义错误0 #定义溢出0 int访问[最大顶点数];//表节点typedef结构ArcNode { int adjvex构造ArcNode * nextarcchar * info} ArcNode//头节点typedef结构VNode {char数据;弧节点*首弧;}虚拟节点,列出[最大顶点数];//图结构typedef结构{AdjList顶点;int vexnum,arcnum} ALGraph//用于BFS遍历的附加链队列节点结构typedefstructqcode {intdata};结构QNode *下一步;}QNode,* QueuePtr//链队列typedef结构{QueuePtr前端;队列后部;}链接队列;//初始化链组intinitqueue(link queue q){ q . front=q . reason=(queue ptr)malloc(sizeof(qcode));如果(!Q.front)出口(OVERFLOW);q . front:wordfan div;I)。

数据结构实验报告九—图的遍历

数据结构实验报告九—图的遍历

问题描述:若用有向网表示网页的链接网络,其中顶点表示某个网页,有向弧表示网页之间的链接关系。

试设计一个网络蜘蛛系统,分别以广度优先和深度优先的策略抓取网页。

一、需求分析:1.本程序要求采用利用图实现广度优先搜索。

2.首先输入顶点的数量,然后是各顶点对应的字母,再输入各条弧(权值都置为1)。

3.在Dos界面输出从首个顶点开始的广度优先遍历序列。

4.测试数据输入输入顶点数和弧数:8 9输入8个顶点.输入顶点0:a输入顶点1:b输入顶点2:c输入顶点3:d输入顶点4:e输入顶点5:f输入顶点6:g输入顶点7:h输入9条弧.输入弧0:a b 1输入弧1:b d 1输入弧2:b e 1输入弧3:d h 1输入弧4:e h 1输入弧5:a c 1输入弧6:c f 1输入弧7:c g 1输入弧8:f g 1输出广度优先遍历: a b d h e c f g深度优先遍历: a b c d e f g h二、概要设计:抽象数据类型:图的定义:ADT Graph {数据对象V:V是具有相同特性的数据元素的集合,称为顶点集。

数据关系R:R={VR}VR={<v,w>|v,w∈v且P(v,w),<v,w>表示从v到w的弧,谓词P(v,w)定义了弧<v,w>的意义或信息}基本操作P:CreateGraph(&G,V,VR)初始条件:V是图的顶点集,VR是图中弧的集合操作结果:按V和VR的定义构造图GFirstAdjV ex(G,v)初始条件:图G存在,v是G中某个顶点操作结果:返回v的第一个邻接顶点,若顶点在G中没有邻接顶点,则返回“空”Next AdjV ex(G,v,w)初始条件:图G存在,v是G中某个顶点,w是v的邻接顶点操作结果:返回v的(相对于w的)下一个邻接顶点,若w是v的最后一个邻接点,则返回“空”visit(G, k)初始条件:图G存在操作结果:访问图G中的第K个节点Locate(G, c)初始条件:图G存在操作结果:访问图G中的c顶点DFS(G, v)初始条件:图G存在操作结果:以图G中的第v个节点为起点深度优先访问图GBFS(G)初始条件:图G存在操作结果:广度优先访问图G} ADT Graph算法的基本思想:(1)图的特点是没有首尾之分,所以算法的参数要指定访问的第一个顶点。

数据结构课程实验(图的存储与遍历)

数据结构课程实验(图的存储与遍历)

实验五图的存储与遍历1、实验目的掌握图这种复杂的非线性结构的邻接矩阵和邻接表的存储表示,以及在此两种常用存储方式下深度优先遍历(dfs)和广度优先遍历(BFS)操作的实现。

2、实验预备知识(1)图的存储结构:邻接矩阵表示法和邻接表表示法。

邻接矩阵表示法除了要用一个二维数组存储用于表示顶点间相邻关系的邻接矩阵外,还需用一个一维数组来存储顶点信息,另外还有图的顶点数和边数。

邻接表表示法类似于树的孩子链表表示法。

(2)图的遍历方法有深度优先遍历(Depth-First Traersal)和广度优先遍历(Breadth-First Traversal),简称 DFS和BFS。

DFS对图遍历时尽可能先对纵深方向进行搜索;BFS是类似于树的按层次遍历。

3、实验内容题目1对以邻接矩阵为存储结构的图进行 DFS和 BFS遍历(1) 问题描述:以邻接矩阵为图的存储结构,实现图的DFS和BFS遍历。

(2) 基本要求:建立一个图的邻接矩阵表示,输出顶点的一种DFS和BFS序列。

(3) 测试数据:如图4.18所示。

(4) 实现提示:图的DFS遍历可通过递归调用或用栈来实现。

其思想是:只要当前结点未访问过,就访问该结点,沿着其一条分支深入下去,每深入一个未访问过的结点,就访问这个结点,然后从这个结点继续进行DFS遍历。

在这一过程中,若深入时遇到一个已访问过的结点,则查找是否有与这个结点相邻的下一个未访问过的结点。

若有则继续深人,否则将退回到这个结点的前一个结点,再找下一个相邻的本访问过的结点,……如此进行下去,直到所有的结点都被访问过。

BFS遍历可利用队列来帮助实现,也可以用栈。

实现方法与二叉树的层次遍历类似。

题目2对以邻接表为存储结构的图进行DFS和BFS遍历(1) 问题描述:以邻接表为存储结构,实现图的DFS和BFS遍历。

(2) 基本要求:建立一个图的邻接表存储,输出顶点的一种DFS和BFS序列。

(3) 测试数据:如图4.19所示:(4) 实现提示:以邻接表为存储结构的图的DFS和BFS算法的实现思想与以邻接矩阵为存储结构的实现是一样的。

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

数据结构课程实验报告学号:: 实验日期:2016.1.7 实验名称: 图的存贮与遍历一、实验目的掌握图这种复杂的非线性结构的邻接矩阵和邻接表的存储表示, 以及在此两 种常用存储方式下深度优先遍历(DFS 和广度优先遍历(BFS 操作的实现。

、实验内容与实验步骤 题目1:对以邻接矩阵为存储结构的图进行 DFS 和BFS 遍历问题描述:以邻接矩阵为图的存储结构,实现图的 DFS 和BFS 遍历。

基本要求:建立一个图的邻接矩阵表示,输出顶点的一种DFS 和BFS 序列测试数据:如图所示0 10 0 01 0 0 0 1A 0 10 101 0 0 0 00 0 0 1 0题目2:对以邻接表为存储结构的图进行 DFS 和BFS 遍历问题描述:以邻接表为图的存储结构,实现图的 DFS 和BFS 遍历。

基本要求:建立一个图的邻接表存贮,输出顶点的一种 DFS 和BFS 序列 测试数据:如图所示在此贴上调试好的程序#i nclude<stdio.h>#i nclude<malloc.h>#i ncludevstri ng.h>V0 V1V2 V3 V41 A 0 14A3 A 0 A3A#define M 100typedef struct node{char vex[M][2];int edge[M ][ M ];int n ,e;}Graph;in t visited[M];Graph *Create_Graph(){ Graph *GA;int i,j,k,w;GA=(Graph*)malloc(sizeof(Graph));printf ("请输入矩阵的顶点数和边数(用逗号隔开):\n");sca nf("%d,%d", &GA-> n,&GA->e);printf ("请输入矩阵顶点信息:\n");for(i = 0;i<GA-> n;i++)scan f("%s",&(GA->vex[i][0]),&(GA->vex[i][1]));for (i = 0;i<GA-> n;i++)for (j = 0;j<GA-> n;j++) GA->edge[i][j] = 0;for (k = 0;k<GA->e;k++){ printf ("请输入第%4条边的顶点位置(i,j)和权值(用逗号隔开): ",k+1);sca nf ("%d,%d,%d",&i,&j, &w);GA->edge[i][j] = w;}return(GA);}void dfs(Graph *GA, i nt v){ int i;prin tf("%c%c\n",GA->vex[v][0],GA->vex[v][1]);visited[v]=1;for(i=0; i<GA->n; i++)if (GA->edge[v][i]==1 && visited[i]==0) dfs(GA, i);}void traver(Graph *GA){ int i;for(i=0; i<GA->n; i++)visited[i]=0;for(i=0; i<GA-> n;i++)if(visited[i]==0) dfs(GA, i);}void bfs( Graph *GA, i nt v){ int j,k,fro nt=-1,rear=-1;int Q[M];prin tf("%c%c\n",GA->vex[v][0],GA->vex[v][1]); visited[v]=1;rear=rear+1;Q[rear]=v;while (fron t!=rear){ fron t=fro nt+1;k=Q[fro nt];for (j=0; j<GA- >n; j++)if (GA->edge[k][j]==1 && visited[j]==0){ prin tf("%c%c\n",GA->vex[j][0],GA->vex[j][1]); visited[j]=1;rear=rear+1;Q[rear]=j;}}}void traver1(Graph *GA){ int i;for (i=0; i<GA-> n;i++)visited[i]=0;for (i=0; i<GA->n; i++)if (visited[i]==0)bfs(GA, i);typedef struct NODE{ int adjvex;struct NODE *n ext;}ENode;typedef struct NODE1{ char vex[2];ENode *first;} VexNode;typedef struct FS1{VexNode GL[M];int bia n,top;}FS;FS *CreateGL(){ FS *kk=(FS *)malloc(sizeof(FS));int i,j,k;ENode *s;printf("请输入顶点数和边数(用逗号隔开):\n");sca nf("%d,%d",&kk->top, & kk->bia n);printf("请输入顶点信息:\n");for (i=0; i<kk->top; i++){ sca nf("%s",kk->GL[i].vex);kk->GL[i].first=NULL; }printf("请输入边的信息(i,j): \n");for (k=0;k<kk->bia n;k++){ sca nf("\n%d,%d",&i,&j);s =(ENode*)malloc(sizeof(ENode)); s->adjvex=j;s-> next=kk->GL[i].first;kk->GL[i].first =s;}return kk;void DFS(FS *kk, i nt v){ ENode *w; int i;prin tf("%s\n",kk->GL[v].vex); visited[v]=1;w=kk->GL[v].first ;while (w!=NULL){ i=w->adjvex;if (visited[i]==0)DFS(kk,i);w=w- >n ext;}}void TRAVER(FS *kk){ int i;for(i=0; i<kk->top;i++) visited[i]=0;for(i=0; i<kk->top; i++)if(visited[i]==0)DFS(kk, i);}void BFS(FS *kk, i nt v){ int Q[M], front=-1,rear=-1;ENode *w;int i, k;prin tf("%s\n",kk->GL[v].vex); visited[v]=1;rear=rear+1; Q[rear]=v; while (fron t!=rear){ fron t=fro nt+1; k=Q[fro nt]; w=kk->GL[k].first; while(w!=NULL) { i=w->adjvex;if( visited[i]==0){ visited[i]=1; printf("%s",kk->GL[i].vex); rear=rear+1;Q[rear]=i;}w=w- >n ext;}}}void TRAVER1(FS *kk){ int i;for(i=0; i<kk->top;i++) visited[i]=0;for(i=0; i <kk->top;i++)if(visited[i]==0)BFS(kk,i);}int mai n(){int i=0;Graph *p;FS *q;while(i=1){/*建立菜单*/char jz[30]={"1.创建邻接矩阵"};char jd[30]={"2.邻接矩阵DFS 遍历"};char jb[30]={"3.邻接矩阵BFS遍历"};char bg[30]={"4.创建邻接表"};char bd[30]={"5.邻接表DFS 遍历"};char bb[30]={"6.邻接表BFS遍历"};char tc[30]={"7.退出"};char mn[30]={"菜单"};int l=strle n(jd);int o=strle n(mn);int m,n;prin tf("\n");for(m=0;m<=(2*l-o)/2;m++)printf("");prin tf("%s",m n);for(m=0;m<=(2*l-o)/2;m++) printf("");prin tf("\n");for(m=0;m<=2*l;m++)*\n",jz,jd,jb,bg,bd,bb,tc); for(m=0;m<=2*l;m++)prin tf("*");prin tf("\n");/*选择功能*/printf("请输入所需功能序号:");sca nf("%d",&n); switch( n){case 1: p=Create_Graph();break;case 2: traver(p);break;case 3: traver1(p);break;case 4: q=CreateGL();break;case 5: TRAVER(q);break;case 6: TRAVER1(q);break;case 7: retur n 0; default:pri ntf("输入功能序号有误! \n");}}return 0; prin tf("*"); *\n* %sprin tf("\n");prin tf("* %s *\n* %s *\n* %s *\n* *\n* %s *\n* %s%s90iTJK四、运行结果:在此把运行结果从屏幕上拷下来贴在此L.甸建邻按矩阵2.邻捞矩阵UF 克直厉 空却長拒陋氏遍历 匸D.建邹接夫 匚卸接衷茁2遍历□ XO E :\Cer necrrDXiIrtua ISyEtem\5 …esE V7 琴单V乗单 戌■:口:壮:(£* X K 相fc 宜 宅 gc X 童扫4c 址** # * We* 3C : |C 电斗 >二輩 请输入所需功能序号,EVI莖单T •退岀淸输入肝需功盘序号;e 乩卸接夬ME 盘圧匚劭轄耒丽2凰⑷ +-4=4=水V1V4VJ VIV4 请输入边旳低唱(ij j' iki L r 01.42r 12r 3k ”i 3=*=+■++4= #+#4=^ 芈****4=*云■芈*+乂卅斗:芈世+立卡卄北* 育输入所需功耕号;4 请输入顶做和边數:用逗号隔开h5 7 淸输入顶点信旦,了•退出测试数据要注意现实中矩阵是从1开始,而数组里是从0开始。

相关文档
最新文档