数据结构——图的基本操作
图的基本操作 实验报告

图的基本操作实验报告图的基本操作实验报告引言:图是一种常见的数据结构,广泛应用于计算机科学和其他领域。
本实验报告旨在介绍图的基本操作,包括创建图、添加节点和边、遍历图等,并通过实验验证这些操作的正确性和效率。
实验目的:1. 了解图的基本概念和术语;2. 掌握图的创建和修改操作;3. 熟悉图的遍历算法;4. 分析图的操作的时间复杂度。
实验过程:1. 创建图首先,我们需要创建一个图对象。
图可以用邻接矩阵或邻接表来表示。
在本实验中,我们选择使用邻接表来表示图。
通过遍历输入的节点和边信息,我们可以创建一个包含所有节点和边的图。
2. 添加节点和边在创建图对象后,我们可以通过添加节点和边来构建图的结构。
通过输入节点的标识符和边的起始和结束节点,我们可以在图中添加新的节点和边。
添加节点和边的操作可以通过修改邻接表来实现,将节点和边的信息存储在对应的链表中。
3. 遍历图遍历图是图操作中常用的操作之一。
通过遍历图,我们可以访问图中的所有节点和边。
在本实验中,我们选择使用深度优先搜索(DFS)算法来遍历图。
DFS算法通过递归的方式遍历图中的节点,先访问当前节点,然后再递归地访问与当前节点相邻的节点。
4. 分析时间复杂度在实验过程中,我们记录了图的操作所花费的时间,并分析了它们的时间复杂度。
通过对比不同规模的图的操作时间,我们可以评估图操作的效率和可扩展性。
实验结果:通过实验,我们成功创建了一个图对象,并添加了多个节点和边。
我们还通过DFS算法遍历了图,并记录了遍历的顺序。
实验结果表明,我们的图操作实现正确,并且在不同规模的图上都能够高效地工作。
讨论与结论:本实验报告介绍了图的基本操作,并通过实验验证了这些操作的正确性和效率。
通过实验,我们了解到图是一种重要的数据结构,可以用于解决许多实际问题。
同时,我们还深入分析了图操作的时间复杂度,为后续的图算法设计和优化提供了参考。
总结:通过本次实验,我们对图的基本操作有了更深入的了解。
数据结构学习内容

数据结构学习内容
《数据结构》主要学习线性表、栈的队列和数组、树与二叉树、图。
详细内容如下:
1、线性表:线性表的定义和基本操作、线性表的实现、顺序存储结构;
2、栈的队列和数组:栈和队列的基本概念、栈和队列的顺序存储结构、栈和队列的链式存储结构、栈和队列的应用、特殊矩阵的压缩存储;
3、树与二叉树:树的概念、二叉树的定义及其主要特征、二叉树的顺序存储结构和链式存储结构、线索二叉树的基本概念和构造;
4、图:图的概念、图的存储及基本操作、图的基本应用及其复杂度分析。
数据结构——图思维导图-高清简单脑图模板-知犀思维导图

数据结构——图图的定义和基本术语
定义是由一个顶点集V和一个顶点间的关系集合组成的数据结构
分类
有向图
无向图
基本术语
有(无)向网弧或边带权的图
子图
完全图含有e=n(n-1)/2条边的无向图
有向完全图含有e=n(n-1)条弧的有向图
稀疏图边或弧的个数<nlogn
稠密图边或弧的个数>=nlogn
度(入度+出度)
入度以顶点v为弧尾的弧的数目
出度以顶点v为弧头的弧的数目
路径长度路径上边的数目
连通图图中任意两个顶点之间都有路径相通
图的遍历
深度优先搜索DPS
类似于先序遍历
实质对每个顶点查找其邻接点的过程
广度优先搜索BFS实质通过边或弧找邻接点的过程
图的存储结构
邻接矩阵
有向图:对称统计第i行1的个数可得顶点i的出度
无向图:不对称统计第j列1的个数可得顶点j的入度
邻接表只存储图中已有的弧或边的信息
有向图的十字链表将有向图的邻接表和逆邻接表结合起来的一种链
图的应用
最小生成树
普里姆(Prim)算法
贪心算法
最短路径
Dijkstra算法
Floyd算法
拓扑排序
关键路径。
数据结构试验报告-图的基本操作

中原工学院《数据结构》实验报告学院:计算机学院专业:计算机科学与技术班级:计科112姓名:康岩岩学号:201100814220 指导老师:高艳霞2012-11-22实验五图的基本操作一、实验目的1、使学生可以巩固所学的有关图的基本知识。
2、熟练掌握图的存储结构。
3、熟练掌握图的两种遍历算法。
二、实验内容[问题描述]对给定图,实现图的深度优先遍历和广度优先遍历。
[基本要求]以邻接表为存储结构,实现连通无向图的深度优先和广度优先遍历。
以用户指定的结点为起点,分别输出每种遍历下的结点访问序列。
【测试数据】由学生依据软件工程的测试技术自己确定。
三、实验前的准备工作1、掌握图的相关概念。
2、掌握图的逻辑结构和存储结构。
3、掌握图的两种遍历算法的实现。
四、实验报告要求1、实验报告要按照实验报告格式规范书写。
2、实验上要写出多批测试数据的运行结果。
3、结合运行结果,对程序进行分析。
【设计思路】【代码整理】#include "stdafx.h"#include <iostream>#include <malloc.h>using namespace std;typedef int Status;#define OK 1#define ERROR 0#define OVERFLOW -1#define MAX_SIZE 20typedef enum{DG,DN,UDG,UDN}Kind;typedef struct ArcNode{int adjvex; //顶点位置struct ArcNode *nextarc; //下一条弧int *info; //弧信息};typedef struct{char info[10]; //顶点信息ArcNode *fistarc; //指向第一条弧}VNode,AdjList[MAX_SIZE];typedef struct{AdjList vertices;int vexnum,arcnum; //顶点数,弧数int kind; //图的种类,此为无向图}ALGraph;//这是队列的节点,仅用于广度优先搜索typedef struct Node{int num;struct Node* next;};//队列的头和尾typedef struct{Node * front;Node *rear;}PreBit;int LocateV ex(ALGraph G,char info[]);//定位顶点的位置Status addArcNode(ALGraph &G,int adjvex); //图中加入弧Status CreatGraph(ALGraph&G);//创建图的邻接表Status DFSTraverse(ALGraph G);//深度优先搜索Status BFSTraverse(ALGraph G);//广度优先搜索Status DFS(ALGraph G,int v);//深度优先搜索中的数据读取函数,用于递归bool visited[MAX_SIZE]; // 访问标志数组//初始化队列Status init_q(PreBit&P_B){P_B.front=P_B.rear=(Node*)malloc(sizeof(Node));if(!P_B.front){exit(OVERFLOW);}P_B.front->next=NULL;}//将数据入队Status en_q(PreBit & P_B,int num){Node *p=(Node*)malloc(sizeof(Node));if(!p){exit(OVERFLOW);}p->num=num;p->next=NULL;P_B.rear->next=p;P_B.rear=p;return OK;}//出队Status de_q(PreBit & P_B){if(P_B.front==P_B.rear){return ERROR;}Node* p=P_B.front->next;P_B.front->next=p->next;if(P_B.rear==p){P_B.rear=P_B.front;}free(p);return OK;}Status CreatGraph(ALGraph&G){cout<<"请输入顶点数目和弧数目"<<endl;cin>>G.vexnum>>G.arcnum;//依次输入顶点信息for(int i=0;i<G.vexnum;i++){cout<<"请输入顶点名称"<<endl;cin>>G.vertices[i].info;G.vertices[i].fistarc=NULL;}//依次输入弧信息for(int k=1;k<=G.arcnum;k++){char v1[10],v2[10]; //用于表示顶点名称的字符数组int i,j; //表示两个顶点的位置BACK: //返回点cout<<"请输入第"<<k<<"条弧的两个顶点"<<endl;cin>>v1>>v2;i=LocateV ex(G,v1); //得到顶点v1的位置j=LocateV ex(G,v2); //得到顶点v2的位置if(i==-1||j==-1){ //头信息不存在则返回重输cout<<"不存在该节点!"<<endl;goto BACK; //跳到BACK 返回点}addArcNode(G,i); //将弧的顶点信息插入表中addArcNode(G,j);}return OK;}//倒序插入弧的顶点信息Status addArcNode(ALGraph &G,int adjvex){ArcNode *p; //弧节点指针p=(ArcNode*)malloc(sizeof(ArcNode));p->adjvex=adjvex;p->nextarc=G.vertices[adjvex].fistarc;//指向头结点的第一条弧G.vertices[adjvex].fistarc=p; //头结点的第一条弧指向p,即将p作为头结点的第一条弧return OK;}//定位顶点的位置int LocateV ex(ALGraph G,char info[]){for(int i=0;i<G.vexnum;i++){if(strcmp(G.vertices[i].info,info)==0){ //头结点名称与传入的信息相等,证明该头节点存在return i; //此时返回位置}}return -1;}//深度优先搜索Status DFSTraverse(ALGraph G){for(int v=0;v<G.vexnum;v++){visited[v]=false;}char v1[10];int i;BACK:cout<<"请输入首先访问的顶点"<<endl;cin>>v1;i=LocateV ex(G,v1);if(i==-1){cout<<"不存在该节点!"<<endl;goto BACK;}DFS(G,i);return OK;}//深度优先搜索递归访问图Status DFS(ALGraph G,int v){visited[v]=true;cout<<G.vertices[v].info<<" ";//输出信息ArcNode *p;p=G.vertices[v].fistarc; //向头节点第一条while(p) //当弧存在{if(!visited[p->adjvex]){DFS(G,p->adjvex); //递归读取}p=p->nextarc;}return OK;}//广度优先搜索Status BFSTraverse(ALGraph G){for(int v=0;v<G.vexnum;v++){visited[v]=false;}char v1[10];int v;BACK:cout<<"请输入首先访问的顶点"<<endl;cin>>v1;v=LocateV ex(G,v1);if(v==-1){cout<<"不存在该节点!"<<endl;goto BACK;}PreBit P_B;init_q(P_B);ArcNode *p;visited[v]=true;cout<<G.vertices[v].info<<" ";//输出信息en_q(P_B,v); //将头位置v入队while(P_B.front!=P_B.rear){//当队列不为空时,对其进行访问int w=P_B.front->next->num;//读出顶点位置de_q(P_B);//顶点已经访问过,将其出队列p=G.vertices[w].fistarc;//得到与顶点相关的第一条弧while(p){if(!visited[p->adjvex]){en_q(P_B,p->adjvex);//将弧入队,但不读取,只是将其放在队尾}p=p->nextarc;}}return OK;}int _tmain(int argc, _TCHAR* argv[]){ALGraph G;CreatGraph(G);cout<<"深度优先搜索图:"<<endl;DFSTraverse(G);cout<<endl;cout<<"广度优先搜索图:"<<endl;BFSTraverse(G);cout<<endl;system("pause");return 0;}。
数据结构第七章:图

例
a c G1
b d
vexdata firstarc adjvex next 1 4 ^ a 2 3 4 b c d 1 1 3 ^ ^ ^
19
7.3 图的遍历
深度优先遍历(DFS) 深度优先遍历
方法:从图的某一顶点 出发,访问此顶点; 方法:从图的某一顶点V0出发,访问此顶点;然后依 次从V 的未被访问的邻接点出发,深度优先遍历图, 次从 0的未被访问的邻接点出发,深度优先遍历图, 直至图中所有和V 相通的顶点都被访问到; 直至图中所有和 0相通的顶点都被访问到;若此时图 中尚有顶点未被访问, 中尚有顶点未被访问,则另选图中一个未被访问的顶 点作起点,重复上述过程, 点作起点,重复上述过程,直至图中所有顶点都被访 问为止。 问为止。
ω ij , 若(v i , v j )或 < v i , v j >∈ E(G) A[i, j ] = 0,其它
11
例
1 3
5
2
8 4 7 5 1 6 3 4 2
0 5 7 0 3
5 0 0 4 8
7 0 0 2 1
0 4 2 0 6
3 8 1 6 0
12
关联矩阵——表示顶点与边的关联关系的矩阵 表示顶点与边的关联关系的矩阵 关联矩阵
1
7.1 图的定义和术语
是由两个集合V(G)和E(G)组成的 组成的, 图(Graph)——图G是由两个集合 图 是由两个集合 和 组成的 记为G=(V,E) 记为
其中: 其中:V(G)是顶点的非空有限集 是顶点的非空有限集 E(G)是边的有限集合,边是顶点的无序对或有序对 是边的有限集合, 是边的有限集合
有向图——有向图 是由两个集合 有向图G是由两个集合 有向图 有向图 是由两个集合V(G)和E(G)组成的 和 组成的
《数据结构》实验教学大纲

《数据结构》实验教学大纲课程代码: B03203课程名称:数据结构英文名称: Data Structures课程总学时: 60 (其中理论课 46 学时,实验 14 学时)学分: 2.5课程类别:必修课程性质:专业基础课先修课程:计算机导论、Java语言程序设计面向专业:软件技术、计算机网络技术开课单位:软件工程系一、实验教学的性质地位和任务数据结构实验课是计算机类专业的一门专业基础实验课,是后续专业课程的基础;该课程的主要任务是:进一步掌握和拓展所学的理论知识,初步掌握解决问题的基本结构以及建立在该结构上的算法,培养学生的综合能力;本课程主要内容包括:线性表及其应用实验,串及其应用实验,树及其应用实验,图及其应用实验,查找实验,内部排序实验;通过本实验课的学习,学生应学会分析研究计算机加工的数据结构的特性,培养数据抽象的能力,训练学生进行复杂程序设计的技能,培养良好程序设计的习惯,初步掌握算法的时间分析和空间分析的技术。
二、实验内容与要求项目一、线性表及其应用(1)实验目标1.加深理解线性表的顺序表示与链式表示的意义和区别,理解不同存储结构下插入与删除操作的算法;2.熟练掌握线性表的顺序存储方式及其插入、删除等基本操作的算法实现;3.熟练掌握线性表的链式存储方式及其插入、删除等基本操作的算法实现;(2)具体内容1.设计一组输入数据并编写主程序分别调用上述算法(顺序表示的算法为InitList_Sq、ListInsert_Sq、ListDelete_Sq等,链式表示的算法为InitList_L、ListInsert_L、ListDelete_L等),调试程序并对相应的输出作出分析;修改输入数据,预期输出并验证输出的结果,加深对有关算法的理解;2.设计一个可以容纳40位数的求n!的程序。
(3)主要仪器设备与工具PC机一台/每人。
项目二、栈及其应用(1)实验目标1.理解栈的概念;2.掌握利用数组实现栈的基本操作;3.应用栈结构来解决表达式求值的问题。
数据结构流程图

数据结构流程图数据结构是计算机科学中非常重要的概念之一,它用于描述数据元素之间的关系和存储方式。
而流程图则是一种用于表示算法、操作过程或系统设计的图形化工具。
在计算机科学领域中,流程图常用于描述算法和程序设计过程。
本文将探讨数据结构流程图的相关概念和使用方法。
一、概述数据结构流程图是一种使用标准符号和连线来表示数据结构及其操作的图形化工具。
它包括了各种数据结构的表示方法和基本操作的实现流程。
通过使用数据结构流程图,人们可以清晰地了解数据元素之间的关系以及各种操作的执行过程。
二、符号表示数据结构流程图使用了一系列标准化的符号来表示不同类型的数据结构和操作。
下面是几种常用的符号表示:1. 开始/结束符号:用于表示程序的开始和结束点,通常使用圆角矩形来表示。
2. 输入/输出符号:用于表示输入或输出操作,通常使用矩形或平行四边形来表示。
3. 过程符号:用于表示具体的执行过程,通常使用矩形来表示。
4. 判断符号:用于表示条件分支和判断操作,通常使用菱形来表示。
5. 箭头线:用于表示不同符号之间的流向,表示数据或控制信息的传输方向。
三、使用方法数据结构流程图的使用方法可以分为以下几个步骤:1. 定义数据结构:根据实际需求,确定所需的数据结构类型,例如数组、链表、栈、队列等。
2. 设计算法流程:根据数据结构的特点和需求,设计相应的算法流程,包括数据的插入、删除、查找等操作。
3. 表示数据结构:使用符号表示数据结构及其属性,例如使用方框表示数组,使用箭头表示指针等。
4. 表示算法流程:使用符号表示算法流程,包括条件判断、循环操作、数据的移动等。
5. 绘制流程图:根据之前的设计,将数据结构和算法流程以符号形式绘制在图形界面上,使用箭头线表示数据流向。
6. 调试和改进:通过对流程图的分析和调试,发现问题并进行改进,保证算法的正确性和高效性。
四、实例演示以下是一个使用数据结构流程图描述数组插入操作的示例:思路:1. 输入待插入的元素和插入位置;2. 检查插入位置是否合法;3. 如果合法,将插入位置后的元素依次向后移动一个位置;4. 将待插入的元素放入插入位置处;5. 输出修改后的数组。
数据结构图的存储结构及基本操作

数据结构图的存储结构及基本操作数据结构图的存储结构及基本操作1·引言数据结构图是一种用来描述数据元素之间关系的图形结构,它可以表示实体之间的联系和依赖关系。
本文将介绍数据结构图的存储结构及基本操作。
2·存储结构2·1 邻接矩阵邻接矩阵是使用二维数组来表示数据结构图中各个节点之间的关系。
矩阵的行和列代表节点,如果两个节点之间存在边,则矩阵相应位置的值为1,否则为0。
2·2 邻接表邻接表是使用链表来表示数据结构图中各个节点之间的关系。
每个节点都有一个链表,链表中的每个元素表示与该节点相邻的节点。
2·3 十字链表十字链表是使用链表来表示数据结构图中各个节点之间的关系。
每个节点都有两个链表,一个表示该节点指向的节点,另一个表示指向该节点的节点。
2·4 邻接多重表邻接多重表是使用链表来表示数据结构图中各个节点之间的关系。
每个节点都有一个链表,链表中的每个元素表示与该节点相邻的边。
3·基本操作3·1 创建图创建一个空的数据结构图,根据需要选择适当的存储结构。
3·2 插入节点在数据结构图中插入一个节点,并建立与其他节点的关系。
3·3 删除节点从数据结构图中删除一个节点,并删除与其他节点的关系。
3·4 插入边在数据结构图中插入一条边,连接两个节点。
3·5 删除边从数据结构图中删除一条边,断开两个节点的连接。
3·6 遍历图按照某种规则遍历整个数据结构图,访问每个节点。
本文档涉及附件:无本文所涉及的法律名词及注释:1·邻接矩阵:用于表示图的存储结构,矩阵的行和列代表图的节点,矩阵的值表示节点之间的连接关系。
2·邻接表:用于表示图的存储结构,每个节点都有一个链表,链表中的每个元素表示与该节点相邻的节点。
3·十字链表:用于表示图的存储结构,每个节点都有两个链表,一个表示该节点指向的节点,另一个表示指向该节点的节点。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
- .1.实验题目图的基本操作2.实验目的1)掌握图的邻接矩阵、邻接表的表示方法。
2)掌握建立图的邻接矩阵的算法。
3)掌握建立图的邻接表的算法。
4)加深对图的理解,逐步培养解决实际问题的编程能力3.需求分析(1)编写图基本操作函数。
①建立图的邻接表,邻接矩阵Create_Graph( LGraph lg. MGraph mg )②邻接表表示的图的递归深度优先遍历LDFS( LGraph g, int i )③邻接矩阵表示的图的递归深度优先遍历MDFS( MGraph g,int i, int vn )④邻接表表示的图的广度优先遍历LBFS( LGraph g, int s, int n )⑤邻接矩阵表示的图的广度优先遍历MBFS(MGraph g, int s, int n )(2)调用上述函数实现下列操作。
①建立一个图的邻接矩阵和图的邻接表。
②采用递归深度优先遍历输出图的邻接矩阵③采用递归深度优先遍历输出图的邻接表。
④采用图的广度优先调历输出图的邻接表。
⑤采用图的广度优先遍历输出图的邻接矩阵4.概要设计(1):/**********************************图的基本操作**********************************///------------------------------- 邻接矩阵数据类型的定义--------------------------------// 最大顶点个数typedef struct{char vexs[MAX_VERTEX_NUM]; // 顶点向量int acrs[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; // 邻接矩阵int vexnum,arum; // 图当前顶点数和弧数}MGraph ;//--------------------------------邻接表数据类型的定义---------------------------------- typedef struct Arode{int adjvex;// 该弧所指向的顶点的位置struct Arode *nextarc;// 指向下一条弧的指针}Arode;typedef struct VNode { char data;// 顶点信息Arode *firstarc;// 指向第一条依附该顶点的弧的指针}VNode, AdjList[MAX_VERTEX_NUM]; typedef struct { AdjList vertices;int vexnum,arum;// 图当前顶点数和弧数}LGraph;(2) 本程序主要包含6个函数:• 主函数main()• 建立图的邻接矩阵,邻接表Create_Graph() • 邻接表表示的图的递归深度优先遍历LDFS() • 邻接矩阵表示的图的递归深度优先遍历 MDFS()• 邻接表表示的图的广度优先遍历LBFS() • 邻接矩阵表示的图的广度优先遍历MBFS () 各函数间调用关系如下:(3) 主函数的伪码main(){ 定义邻接矩阵和邻接表;建立邻接矩阵和邻接表; 邻接矩阵MDFS 深度优先遍历;mainCreate_Graph () LDFS () MDFS () LBFS () MBFS ()邻接矩阵MBFS广度优先遍历;邻接表LDFS深度优先遍历;邻接表LBFS广度优先遍历}5详细设计/**********************************图的基本操作**********************************///------------------------------- 邻接矩阵数据类型的定义--------------------------------// 最大顶点个数typedef struct{char vexs[MAX_VERTEX_NUM]; // 顶点向量int acrs[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; // 邻接矩阵int vexnum,arum; // 图当前顶点数和弧数}MGraph ;//--------------------------------邻接表数据类型的定义---------------------------------- typedef struct Arode{int adjvex; // 该弧所指向的顶点的位置struct Arode *nextarc; // 指向下一条弧的指针}Arode;typedef struct VNode{char data; // 顶点信息Arode *firstarc; // 指向第一条依附该顶点的弧的指针}VNode, AdjList[MAX_VERTEX_NUM];typedef struct{AdjList vertices;int vexnum,arum; // 图当前顶点数和弧数}LGraph;int Create_Graph( MGraph *Mg , LGraph *Lg ) // 建立图的邻接矩阵,邻接表{输入图的顶点个数(字符),构造顶点向量输入图的任意两个顶点的弧构造邻接矩阵构造邻接表}void LDFS(LGraph *Lg,int i) 邻接表表示的图的递归深度优先遍历{显示顶点向量,指针指向下一个顶点向量下一个顶点没有被访问,继续否则退会上一个顶点向量的另一个边}void MDFS(MGraph *Mg,int i)邻接矩阵表示的图的递归深度优先遍历{显示顶点向量,指针指向下一个顶点向量下一个顶点没有被访问,继续否则退会上一个顶点向量的另一个边}void LBFS( LGraph *Lg )邻接表表示的图的广度优先遍历{初始化visited[]初始化队列没被访问过显示顶点向量入队出队访问下一个顶点向量}void MBFS(MGraph *Mg )邻接矩阵表示的图的广度优先遍历{初始化visited[]初始化队列没被访问过显示顶点向量入队出队访问下一个顶点向量}//-------------------主函数------------------------------- main(){ 定义邻接矩阵和邻接表;建立邻接矩阵和邻接表;邻接矩阵MDFS深度优先遍历;邻接矩阵MBFS广度优先遍历;邻接表LDFS深度优先遍历;邻接表LBFS广度优先遍历}6测试结果7. 参考文献《数据结构》8.附录#include <stdio.h>#include <malloc.h>#include <stddef.h>#include <math.h>#define OK 1#define ERROR 0#define MAX_VERTEX_NUM 20/**********************************图的基本操作**********************************/int visited[MAX_VERTEX_NUM]; // 访问标志数组//------------------------------- 邻接矩阵数据类型的定义-------------------------------- // 最大顶点个数typedef struct{char vexs[MAX_VERTEX_NUM]; // 顶点向量int acrs[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; // 邻接矩阵int vexnum,arum; // 图当前顶点数和弧数}MGraph ;//--------------------------------邻接表数据类型的定义----------------------------------typedef struct Arode{int adjvex; // 该弧所指向的顶点的位置struct Arode *nextarc; // 指向下一条弧的指针}Arode;typedef struct VNode{char data; // 顶点信息Arode *firstarc; // 指向第一条依附该顶点的弧的指针}VNode, AdjList[MAX_VERTEX_NUM];typedef struct{AdjList vertices;int vexnum,arum; // 图当前顶点数和弧数}LGraph;//_________________________________队列函数__________________________________________ typedef struct Queue{int arry[MAX_VERTEX_NUM];int front,rear;}Queue;Queue Q;void InitQueue() // 队列初始化{Q.front=Q.rear=0;}int QueueEmpty(Queue *Q) // 清空队列{if(Q->front==Q->rear)return 1;elsereturn 0;}void EnQueue(Queue *Q,int w)// 入队{if((Q->rear+1)%MAX_VERTEX_NUM==Q->front)printf("Error!");else{Q->arry[Q->rear]=w;Q->rear=(Q->rear+1)%MAX_VERTEX_NUM;}}int DeQueue(Queue *Q) // 出队{int u;if(Q->front==Q->rear)return -1;u=Q->front;Q->front=(Q->front+1)%MAX_VERTEX_NUM;return u;}//____________________________________队列函数end_______________________________________ /**************************************************************************************** *函数:Create_Graph*功能:建立图的邻接矩阵,邻接表*说明:该构建的为无向网mg 为邻接矩阵,lg为邻接表, 无权值***************************************************************************************/ int Locatevex(MGraph *Mg , char v) // 确定v 元素在Mg中的位置{int i;for(i=0;Mg->vexs[i]!=v;i++);if(i>Mg->vexnum) // 输入的元素不正确则显示错误printf("ERROR ");return i; // 返回位置}int Create_Graph( MGraph *Mg , LGraph *Lg ) // 建立图的邻接矩阵,邻接表{int i , j , k ;char v1 , v2 ;Arode *q,*p;printf("输入图的顶点数和弧数: ");scanf("%d %d",&Mg->vexnum,&Mg->arum);getchar();Lg->vexnum=Mg->vexnum; // 邻接表的顶点数和弧数Lg->arum=Mg->arum;for(i=0;i<Mg->vexnum;i++) // 构造顶点向量{printf("请输入一个图的顶点(字符):");scanf("%c" , &Mg->vexs[i]);getchar();Lg->vertices[i].data=Mg->vexs[i]; // 赋值Lg->vertices[i].firstarc=NULL; // 指向第一条依附该顶点的弧的指针为空}for(i=0;i<Mg->vexnum;i++) // 初始化邻接矩阵for(j=0;j<Mg->vexnum;j++)Mg->acrs[i][j]=0 ;for(k=0;k<Mg->arum;k++) // 构造邻接矩阵和邻接表{printf("请输入一条边连接的2个顶点:");scanf("%c %c",&v1,&v2);getchar();i=Locatevex(Mg,v1); // 确定v1 在Mg 中的位置j=Locatevex(Mg,v2); // 确定v2 在Mg 中的位置Mg->acrs[j][i]=Mg->acrs[i][j]=1; // 置《v1,v2》的对称弧《v2,v1》p=(Arode *)malloc(sizeof(Arode));p->adjvex=i; // 确认顶点位置p->nextarc=Lg->vertices[j].firstarc;// 指向下一条弧的指针Lg->vertices[j].firstarc=p; // 赋值q=(Arode *)malloc(sizeof(Arode));q->adjvex=j; // 确认顶点位置q->nextarc=Lg->vertices[i].firstarc;// 指向下一条弧的指针Lg->vertices[i].firstarc=q; // 赋值}return OK ;}/**************************************************************************************** *函数:LDFS*功能:邻接表表示的图的递归深度优先遍历*说明:***************************************************************************************/ int LAdjVex(LGraph *Lg,int k) // 位置{Arode *p;for(p=Lg->vertices[k].firstarc;p!=NULL;p=p->nextarc)if(!visited[p->adjvex])return p->adjvex;return -1;}void LDFS(LGraph *Lg,int i){int k;visited[i]=OK;printf("%c",Lg->vertices[i].data);for(k=LAdjVex(Lg,i);k>=0;k=LAdjVex(Lg,k))if(!visited[k])LDFS(Lg,k);}/**************************************************************************************** *函数:MDFS*功能:邻接矩阵表示的图的递归深度优先遍历*说明:***************************************************************************************/ int AdjVes(MGraph *Mg,int k) // 位置{int i;for(i=0;i<Mg->vexnum;i++)if(Mg->acrs[k][i]&&(!visited[i]))return i;return -1;}void MDFS(MGraph *Mg,int i) // 递归深度优先遍历{int k;visited[i]=1; // 访问标志数组某位置1printf("%c",Mg->vexs[i]); // 显示for(k=AdjVes(Mg,i);k>=0;k=AdjVes(Mg,k))if(!visited[k])MDFS(Mg,k); // 递归}/**************************************************************************************** *函数:LBFS*功能:邻接表表示的图的广度优先遍历*说明:***************************************************************************************/void LBFS( LGraph *Lg ){int i,u,w;for(i=0;i<Lg->vexnum;++i) // 初始化visited[]visited[i]=0;InitQueue(); // 初始化队列for(i=0;i<Lg->vexnum;++i)if(!visited[i]) // 没被访问过{visited[i]=1;printf("%c",Lg->vertices[i].data);EnQueue(&Q,i); // 入队while(!QueueEmpty(&Q)){u=DeQueue(&Q); // 出队for(w=LAdjVex(Lg,u);w>=0;w=LAdjVex(Lg,u))if(!visited[w]) // 没被访问过{visited[w]=1;printf("%c",Lg->vertices[w].data);EnQueue(&Q,w); // 入队}}}}/**************************************************************************************** *函数:MBFS*功能:邻接矩阵表示的图的广度优先遍历*说明:***************************************************************************************/ void MBFS(MGraph *Mg ){int i,w,u;for(i=0;i<Mg->vexnum;i++) // 初始化visited[]visited[i]=0;InitQueue(); // 初始化队列for(i=0;i<Mg->vexnum;++i)if(!visited[i]) // 没被访问过{visited[i]=1;printf("%c",Mg->vexs[i]); // 显示EnQueue(&Q,i); // 入队while(!QueueEmpty(&Q)){u=DeQueue(&Q); // 出队for(w=AdjVes(Mg,u);w>=0;w=AdjVes(Mg,u))if(!visited[w]) // 没被访问过{visited[w]=1;printf("%c",Mg->vexs[w]);// 显示EnQueue(&Q,w); // 入队}}}}/***************************************主函数*******************************************/void main(){int i ;MGraph Mg;LGraph Lg;Create_Graph( &Mg, &Lg);printf("邻接矩阵MDFS深度优先遍历:\t");for(i=0;i<Mg.vexnum;i++)visited[i]=0; // 初始化visited[]for(i=0;i<Mg.vexnum;i++)if(!visited[i])MDFS(&Mg,i); // 遍历Mgprintf("\n邻接矩阵MBFS广度优先遍历:\t");MBFS(&Mg) ; // 遍历Mgprintf("\n");printf("邻接表LDFS深度优先遍历:\t");for(i=0;i<Lg.vexnum;++i)visited[i]=0; // 初始化visited[]for(i=0;i<Lg.vexnum;++i)if(!visited[i])LDFS(&Lg,i); // 遍历Lgprintf("\n邻接表LBFS广度优先遍历:\t");LBFS(&Lg) ; // 遍历Lgprintf("\n");}}注意事项:●每位同学必须完成实验任务,并提交实验报告。