图的邻接表存储结构实验报告
浙大城院数据结构实验报告report13
浙江大学城市学院实验报告课程名称数据结构基础实验项目名称实验十三图的基本操作—邻接表存储结构学生姓名专业班级学号实验成绩指导老师(签名)日期头文件AdjLink.h,在该文件中定义图的邻接表存储结构,并编写图的初始化、建立图、输出图、输出图的每个顶点的度图的深度优先遍历函数与广度优先遍历函数等基本操作实现函数。
同时在主函数文件test5_2.cpp中调用这些函数进行验证。
三. 函数的功能说明及算法思路(包括每个函数的功能说明,及一些重要函数的算法实现思路)这里针对的都是无向无权图结构类型定义//边表结点//顶点表结点//图类型typedef struct node typedef struct { typedef struct {{ int adjvex; //邻接点域V ertexType vertex; //顶点域AdjList adjlist; //邻接表node *next; //链域EdgeNode *firstedge; //边表头指针int n,e; //图中当前顶点数和边数}EdgeNode; }VertexNode; } ALGraph; //图类型typedef VertexNode AdjList[MaxVertexNum]; //AdjList是邻接表类型基本面函数1.void CreatALGraph(ALGraph *G)//构造图{ 定义边表结点s;读入顶点数和边数;读入顶点信息,并将边表置为空;依次读入<入度点vi,出度点vj>边的信息直到输入的边数达到要求{为s开辟新空间,邻接点序号为j,并将邻接点指针为i顶点的头指针值,将新结点*S插入顶点Vi的边表头部为s再开辟新空间,邻接点序号为i,并将邻接点指针为j顶点的头指针值,将新结点*S插入顶点Vj的边表头部} }2.void DFS(ALGraph *G,int i) //以Vi为出发点对邻接链表表示的图G进行DFS搜索3.void DFSTraverseM(ALGraph *G)//对整个图进行深度搜索4.void BFS(ALGraph *G,int k) //以Vk为源点对用邻接链表表示的图G进行广度优先搜索5.void BFSTraverseM(ALGraph *G){//对整个图进行广度搜索广度搜索时要建立队列并写队列的相应函数6.void PrintALGraph(ALGraph *G){//输出表四. 实验结果与分析(包括运行结果截图、结果分析等)五. 心得体会(记录实验感受、上机过程中遇到的困难及解决办法、遗留的问题、意见和建议等。
实验六 图的邻接表存储及遍历
}
printf("\n"); /* 换行 */
}
}
{
printf("顶点%d =>",head[i].vertex);/* 顶点值 */
ptr = head[i].nextnode; /* 顶点位置 */
while ( ptr != NULL ) /* 遍历至链表尾 */
{
printf(" %d ",ptr->vertex); /* 输出顶点内容 */
2)当队列非空时重复做:
(1)取பைடு நூலகம்首顶点;
(2)对与队首顶点邻接的所有未被访问的顶点依次做:
打印该顶点;
置顶点为“已访问”标志;
该顶点入队;
否则,当前队首顶点出队。
3) 结束。
三、目的要求
1.掌握图的基本存储方法;
2.掌握有关图的操作算法并用高级语言实现;
3.熟练掌握图的两种搜索路径的遍历方法。
四、实验内容
1.编写程序实现下图的邻接表表示及其基础上的深度和广度优先遍历。
五、程序实例
图的邻接表表示法的C语言描述:
#include <stdlib.h>
#include <stdio.h>
struct node /* 图形顶点结构定义 */
{
int vertex; /* 顶点 */
struct node *nextnode; /* 指下一顶点的指针 */
};
typedef struct node *graph;
struct node head[vertexnum];
数据结构课程实验(图的存储与遍历)
实验五图的存储与遍历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、给出图的邻接表存储结构的类型定义。
2、设计并实现以邻接表的方式构造一个无向网的算法。
Status CreateUDN(ALGraph &G) 3、设计并实现无向网的输出算法,要求能显示顶点以及顶点之间的邻接关系(方式自定) 4、基于邻接表方式实现:a) int FirstAdjVex(ALGraph G,int v) //返回v的第一个邻接点的下标,若不存在,则返回-1 b) int NextAdjVex(ALGraph G,int v,int w) // 返回v相对于w的下一个邻接点,若不存在,则返回-15、基于邻接表存储结构实现图的深度优先搜索算法。
void DFSTraverse(ALGraph G)6、在主函数中调用上述操作函数。
要求给出至少两组测试数据。
选做部分基于邻接表存储结构实现图的广度优先搜索算法。
三、实验步骤必做部分1、给出图的邻接表存储结构的类型定义。
12、设计并实现以邻接表的方式构造一个无向网的算法。
Status CreateUDN(ALGraph &G)3、设计并实现无向网的输出算法,要求能显示顶点以及顶点之间的邻接关系(方式自定)24、基于邻接表方式实现:a) int FirstAdjVex(ALGraph G,int v) //返回v的第一个邻接点的下标,若不存在,则返回-1b) int NextAdjVex(ALGraph G,int v,int w) // 返回v相对于w的下一个邻接点,若不存在,则返回-135、基于邻接表存储结构实现图的深度优先搜索算法。
void DFSTraverse(ALGraph G)6、在主函数中调用上述操作函数。
要求给出至少两组测试数据。
选做部分基于邻接表存储结构实现图的广度优先搜索算法。
数据结构实验报告4(电大)
实验报告四图的存储方式和应用(学科:数据结构)姓名单位班级学号实验日期成绩评定教师签名批改日期实验名称:实验四图的存储方式和应用4.1建立图的邻接矩阵【问题描述】根据图中顶点和边的信息编制程序建立图的邻接矩阵。
【基本要求】(1)程序要有一定的通用性。
(2)直接根据图中每个结点与其他结点的关联情况输入相关信息,程序能自动形成邻接矩阵【测试用例】【实现提示】(1)对图的顶点编号。
(2)在上图中,以顶点1为例,因为顶点2,3,4与顶点1关联,可以输入信息1 2 3 4,然后设法求出与顶点1关联的结点,从而求得邻接矩阵中相应与顶点1的矩阵元素。
实验图4-1【实验报告内容】设计程序代码如下:#include<stdio.h>#define MaxVertexNum 5#define MaxEdgeNum 20#define MaxValue 1000typedef int VertexType;typedef VertexType vexlist [MaxVertexNum];typedef int adjmatrix [MaxVertexNum] [MaxVertexNum];void Createl(vexlist Gv,adjmatrix GA,int n,int e){int i,j,k,w;printf("输入%d个顶点数据\n",n);for(i=0;i<n;i++) scanf("%d",&Gv[i]);for(i=0;i<n;i++)for(j=0;j<n;j++){if(i==j) GA[i][j]=0;else GA[i][j]=MaxValue;}Printf(“输入一条边的两端点序号i和j及边上的权w\n”);printf("输入%d条无向带权边\n",e);for(k=1;k<=e;k++){scanf("%d%d%d",&i,&j,&w);GA[i][j]=GA[j][i]=w;}}void main(){vexlist vl;adjmatrix a;Createl(vl,a,5,8);}。
实验报告:图的存储结构和遍历
武汉东湖学院
实验报告
学院:计算机科学学院专业计算机科学与技术2016年11月18日
姓名付磊学号42
班级计科一班指导老师吴佳芬
课程名称数据结构成
绩
实验名称图的存储结构和遍历
1.实验目的
(1)了解邻接矩阵存储法和邻接表存储法的实现过程。
(2)了解图的深度优先遍历和广度优先遍历的实现过程。
2.实验内容
1. 采用图的邻接矩阵存储方法,实现下图的邻接矩阵存储,并输出该矩阵.
2. 设计一个将第1小题中的邻接矩阵转换为邻接表的算法,并设计一个在屏幕上显示邻接表的算法
3. 实现基于第2小题中邻接表的深度优先遍历算法,并输出遍历序列
4. 实现基于第2小题中邻接表的广度优先遍历算法,并输出遍历序列
3.实验环境
Visual C++ 6.0
4.实验方法和步骤(含设计)
我们通过二维数组中的值来表示图中节点与节点的关系。
通过上图可知,其邻接矩阵示意图为如下:
V0 v1 v2 v3 v4 v5
V0 0 1 0 1 0 1
V1 1 0 1 1 1 0
V2 0 1 0 0 1 0
V3 1 1 0 0 1 1
V4 0 1 1 1 0 0
V5 1 0 0 1 0 0
此时的“1”表示这两个节点有关系,“0”表示这两个节点无关系。
我们通过邻接表来在计算机中存储图时,其邻接表存储图如下:
}。
数据结构实验报告图的存储
数据结构实验报告图的存储数据结构图实验报告一、实验目的和要求(1)掌握图的相关概念,包括图,有向图,无向图,完全图,子图,连通图,度,入度,出度,简单回路和环等定义。
(2)重点掌握图的各种存储结构,包括邻接矩阵和邻接表等。
(3)重点掌握图的基本运算,包括创建图,输出图,深度优先遍历,广度优先遍历等。
(4)掌握图的其他运算,包括最小生成树,最短路径,拓扑排序和关键路径等算法。
(5)灵活运用图这种数据结构解决一些综合应用问题。
二、实验内容和方法(1)实验内容:1、编写一个程序algo8-1.cpp,实现不带权图和带权图的邻接矩阵与邻接表的相互转换算法、输出邻接矩阵与邻接表的算法,并在此基础上设计一个程序exp8-1.cpp实现如下功能:①建立如图1所示的有向图G的邻接矩阵,并输出;②由有向图G的邻接矩阵产生邻接表,并输出;③再由②的邻接表产生对应的邻接矩阵,并输出。
图12、编写一个程序algo8-2.cpp,实现图的遍历运算,并在此基础上设计一个程序exp8-2.cpp完成如下功能:①输出图1所示的有向图G从顶点0开始的深度优先遍历序列(递归算法);②输出图1所示的有向图G从顶点0开始的深度优先遍历序列(非递归算法);③输出图1所示的有向图G从顶点0开始的广度优先遍历序列。
3、设计一个程序exp8-3.cpp,采用邻接表存储图,并输出图8.1(a)中从指定顶点1出发的所有深度优先遍历序列。
(2)实验方法:1、综合运用课本所学的知识,用不同的算法实现在不同的程序功能。
2、结合指导老师的指导,解决程序中的问题,正确解决实际中存在的异常情况,逐步改善功能。
3、根据实验内容,编译程序。
三、实验环境:Windows 7,Visual C++6.0三、实验过程描述文件graph.h中定义了图的邻接矩阵表示类型和邻接表表示类型,该头文件在以下三个实验中都会使用到。
其代码如下:#ifndef GRAPH_H_INCLUDED#define GRAPH_H_INCLUDEDtypedef int InfoType;#define MAXV 100 //最大顶点个数#define INF 32767 //INF表示无限大//以下定义邻接矩阵类型typedef struct{int no;InfoType info;}VertexType;typedef struct{int edges[MAXV][MAXV];int n,e;VertexType vexs[MAXV];}MGraph;//以下定义邻接表类型typedef struct ANode{int adjvex;struct ANode* nextarc;InfoType info;}ArcNode;typedef int Vertex;typedef struct VNode{Vertex data;实验①源程序。
数据结构上机实验报告有向图的邻接表的建立及遍历
《数据构造》上机试验汇报—有向图旳邻接表旳建立及遍历福州大学数计学院《数据构造》上机试验汇报专业和班级:信息计算科学与应用数学6班学号姓名成绩试验名称图旳有关操作试验内容有向图旳邻接表旳建立及遍历实【试验目旳】验 ,(掌握图旳存储思想及其存储实现。
目 ,(掌握图旳深度、广度优先遍历算法思想及其程序实现。
旳 ,(掌握图旳常见应用算法旳思想及其程序实现。
和要求【试验内容】1. 键盘输入数据,建立一种有向图旳邻接表。
2(在有向图旳邻接表旳基础上计算各顶点旳度。
3(采用邻接表存储实既有向图旳深度优先遍历。
4(采用邻接表存储实既有向图旳广度优先遍历。
【重要程序】#include<stdio.h>#include<stdlib.h>#include<conio.h>#define MAX_VERTEX_NUM 20#define OK 1#define ERROR 0#define OVERFLOW 0int visited[MAX_VERTEX_NUM];typedef struct ArcNode //表结点问 { 题 int adjvex; //该弧所指向旳顶点旳位置描 struct ArcNode *nextarc;//指向下一条弧旳指针char *info; //该弧有关信息旳指针述 }ArcNode; 和主 typedef struct VNode //头结点{ 要 char data; //顶点信息步 ArcNode *firstarc; //第一种表结点旳地址,指向第一条依附顶骤点旳弧旳指针}VNode,AdjList[MAX_VERTEX_NUM]; //头结点,头结点旳次序表AdjList[]类型typedef struct //图构造{AdjList vertices;int vexnum,arcnum; //图旳目前顶点数与弧数}ALGraph;typedef struct QNode //用于BFS遍历旳附设链队列结点构造{int data;struct QNode *next;}QNode,*QueuePtr;typedef struct //链队列{QueuePtr rear;}LinkQueue;int InitQueue(LinkQueue &Q) //初始化链队{Q.front=Q.rear=(QueuePtr)malloc(sizeof(QNode));if(!Q.front) exit(OVERFLOW);Q.front->next=NULL;return OK;}int EnQueue(LinkQueue &Q,int e) //元素e入队 {QueuePtr p;p=(QueuePtr)malloc(sizeof(QNode));if(!p) exit(OVERFLOW);p->next=NULL;p->data=e;Q.rear->next=p;Q.rear=p;return OK;}int DeQueue(LinkQueue &Q,int &e)//队首元素出队,由e返回其值{QueuePtr p;if(Q.front==Q.rear) exit(OVERFLOW);e=p->data;Q.front->next=p->next;if(Q.rear==p)Q.rear=Q.front;free(p);return OK;}int EmptyQueue(LinkQueue Q) //判断队列Q与否为空{if(Q.front==Q.rear)return 1;return 0;}int LocateVex(ALGraph G,char v) //查找值为v旳顶点在顶点向量G.vexs[]中旳位置{int i;for(i=0;i<G.vexnum;i++)if(v==G.vertices[i].data)return i;return -1;}int FirstAdjVex(ALGraph G,char v)//返回v旳第一种邻接顶点旳序号{int i;ArcNode *p;i=LocateVex(G,v); //i为顶点v在图G中旳序号if(i==-1)return -1;p=G.vertices[i].firstarc;if(p)return p->adjvex;elsereturn -1;}int NextAdjVex(ALGraph G,char v,char w)//返回v旳(相对于w)旳下一种邻接顶点旳序号{int i,j;ArcNode *p,*q;i=LocateVex(G,v);j=LocateVex(G,w);if(i==-1||j==-1||i==j)return -1;p=G.vertices[i].firstarc; //p指向v旳邻接顶点链表中旳第一种邻接顶点while(p->nextarc&&p->adjvex!=j) //找到邻接顶点wp=p->nextarc;if(p->nextarc) //找到邻接顶点w,且w非v旳最后一种邻接顶点{q=p->nextarc;return q->adjvex; //返回v旳(相对于w)旳下一种邻接顶点旳序号}elsereturn -1; //没有找到w或w是v旳最终一种邻接顶点}int Visit(char v){printf("%c ",v);return OK;}int CreateDG(ALGraph &G) //采用邻接表表达,构造有向图G {int v,e,i,j,t;ArcNode *p,*q;char tail,head;printf("输入顶点个数:");scanf("%d",&v);if(v<0)return ERROR;G.vexnum=v;printf("输入弧旳条数:");scanf("%d",&e);if(e<0)return ERROR;G.arcnum=e;printf("建立DG:\n");for(t=0;t<G.vexnum;t++) //建立头结点次序表{fflush(stdin);printf("输入%d旳信息:",t+1);scanf("%c",&G.vertices[t].data);G.vertices[t].firstarc=NULL; //初始化该头结点指针域}for(t=0;t<G.arcnum;t++) //建立表结点链表(每个顶点旳邻接顶点链表){fflush(stdin);printf("输入弧旳信息(弧尾-弧头)");scanf("%c%*c%c",&tail,&head);i=LocateVex(G,tail);j=LocateVex(G,head);if(i==-1||j==-1||i==j)return ERROR;p=(ArcNode *)malloc(sizeof(ArcNode));p->adjvex=j;p->info=NULL;p->nextarc=NULL;if(!G.vertices[i].firstarc)G.vertices[i].firstarc=p;else{//找尾结点for(q=G.vertices[i].firstarc;q->nextarc;q=q->nextarc);q->nextarc=p; //插入到链表尾}}}int DFS(ALGraph G,int v) //从第v个顶点出发,递归旳深度优先遍历有向图G{int w;visited[v]=-1;printf("%c ",G.vertices[v].data);w=FirstAdjVex(G,G.vertices[v].data);for(;w>=0;w=NextAdjVex(G,G.vertices[v].data,G.vertices[w].data)) if(!visited[w])DFS(G,w); //对v旳尚未访问旳邻接顶点w递归调用DFS()return OK;}int DFSTraverse(ALGraph G) //深度优先搜索遍历图G { int i;for(i=0;i<G.vexnum;i++)visited[i]=0;for(i=0;i<G.vexnum;i++)if(!visited[i])DFS(G,i);return OK;}int BFSTraverse(ALGraph G,int(*visit)(char v)) { LinkQueue Q;int v,w,u;for(v=0;v<G.vexnum;v++)visited[v]=0;InitQueue(Q);for(v=0;v<G.vexnum;v++){if(!visited[v]){visited[v]=1;Visit(G.vertices[v].data);}EnQueue(Q,v);while(!EmptyQueue(Q)){DeQueue(Q,u);for(w=FirstAdjVex(G,G.vertices[u].data);w>0;w=NextAdjVex (G,G.vertices[u].data,G.vertices[w].data))if(!visited[w]){visited[w]=1;Visit(G.vertices[w].data);EnQueue(Q,w);}}}return OK;}void main(){ALGraph G;printf("建立有向图G\n");if(CreateDG(G)){printf("深度优先搜索旳次序:"); DFSTraverse(G);printf("\n");printf("广度优先搜索旳次序:"); BFSTraverse(G,Visit);}printf("\n");}【成果截图】。
数据结构实验报告--图
.数据结构实验报告图一、实验目的1、熟悉图的结构和相关算法。
二、实验内容及要求1、编写创建图的算法。
2、编写图的广度优先遍历、深度优先遍历、及求两点的简单路径和最短路径的算法。
三、算法描述1、图的邻接表存储表示:对图的每个顶点建立一个单链表,第i个单链表表示所有依附于第i个点的边(对于有向图表示以该顶点为尾的弧);链表的每个节点存储两个信息,该弧指向的顶点在图中的位置(adjvex)和指向下一条弧的指针(nextarc)。
每个连表的头结点存储顶点的数据:顶点信息(data)和指向依附于它的弧的链表域。
存储表示如下:typedef struct ArcNode {int adjvex; // 该弧所指向的顶点的位置struct ArcNode *nextarc;// 指向下一条弧的指针// InfoType *info; // 该弧相关信息的指针} ArcNode;typedef struct VNode {char data; // 顶点信息int data2;int sngle;ArcNode *firstarc;// 指向第一条依附该顶点的弧} VNode, AdjList[MAX_NUM];typedef struct {AdjList vertices;int vexnum, arcnum;int kind; // 图的种类标志} ALGraph;2、深度优先搜索:假设初始态是图中所有定点未被访问,从图中的某个顶点v开始,访问此顶点,然后依次从v的未访问的邻接点出发深度优先遍历,直至途中所有和v有相同路径的点都被访问到;若图中仍有点未被访问,则从图中另选一个未被访问的点作为起点重复上述过程,直到图中所有点都被访问到。
为了便于区分途中定点是否被访问过,需要附设一个访问标致数组visited [0..n-1],将其初值均设为false,一旦某个顶点被访问,将对应的访问标志赋值为true。
2、广度优先搜索:假设初始态是图中所有顶点未被访问,从图中的某个顶点v开始依次访问v的各个未被访问的邻接点,然后分别从这些邻接点出发以此访问他们的邻接点,并使“先被访问的邻接顶点”先于“后被访问的邻接顶点”被访问,直至图中所有已被访问过的顶点的邻接顶点都被访问。
数据结构-邻接表存储及遍历-课程设计-实验报告
数据结构-邻接表存储及遍历-课程设计-实验报告数据结构课程设计设计题目:邻接表存储及遍历学生姓名:专业班级:指导教师:完成时间:目录第一章需求分析 01.1 图 01.2 邻接表的概念 01.3邻接表的表示法 0第二章概要分析 (1)2.1 无向图 (1)2.2 有相图 (1)2.3 无向图 (1)2.4有向图 (1)第三章详细分析 (2)3.1 邻接表的建立 (2)3.2 邻接表的建立过程如下: (2)3.2.1无向图邻接表的建立 (2)3.2.2 有向图邻接表的建立 (3)3.3 邻接表的输出过程如下: (4)3.4 邻接表的遍历 (4)3.4.1 连通图的深度优先搜索遍历 (4)3.4.2 有向图的广度优先搜索遍历 (5)3.5 流程图 (6)3.5.1 主流程图 (6)3.5.2 无向图邻接表的流程图 (6)3.5.3 有向图邻接表的流程图 (10)第四章测试分析 (13)4.1 无向图 (14)4.1.1 主程序main()编写如下: (14)4.1.2 运行步骤 (16)4.2 有向图 (18)第五章心得体会 (20)第六章、参考文献 (20)第一章需求分析1.1 图①若图1.1②若图1.1v2图1.11.2 邻接表的概念对于图1.1中的每个顶点vi,该方法把所有邻接于vi的顶点vj链成一个单链表,这个单链表就称为顶点vi的邻接表。
1.3邻接表的表示法邻接表中每个表结点均有2个域,其一是邻接点域(adjvex),用以存放与vi 相邻接的顶点vj的序号;其二是链域(next),用来将邻接表的所有表结点链在一起。
并且为每个顶点vi的邻接表设置一个具有2个域的表头结点:一个是顶点域(vertex),用来存放顶点vi的信息;另一个是指针域(link),用于存入指向vi 的邻接表中第一个表结点的头指针。
第二章概要分析2.1 无向图无向图邻接表的建立,无向图邻接表的输出,无向图邻接表的深度优先搜索遍历,无向图邻接表的广度优先搜索遍历。
数据结构实验报告 图
数据结构实验报告图一、实验目的本次实验的主要目的是深入理解和掌握图这种数据结构的基本概念、存储结构和相关算法,并通过实际编程实现来提高对图的操作和应用能力。
二、实验环境本次实验使用的编程语言为C++,开发工具为Visual Studio 2019。
三、实验内容(一)图的存储结构1、邻接矩阵邻接矩阵是用一个二维数组来表示图中顶点之间的关系。
如果顶点i 和顶点 j 之间有边相连,则数组中对应的元素值为 1;否则为 0。
这种存储结构简单直观,适用于顶点数较少且边数较多的稠密图。
2、邻接表邻接表是为图的每个顶点建立一个单链表,链表中存储的是与该顶点相邻的顶点信息。
这种存储结构在存储空间上比较节省,适用于顶点数较多且边数较少的稀疏图。
(二)图的遍历算法1、深度优先遍历(DepthFirst Search,简称 DFS)从图中的某个顶点出发,沿着一条路径尽可能深地访问顶点,直到无法继续前进,然后回溯到上一个未完全访问的顶点,继续进行深度优先搜索。
2、广度优先遍历(BreadthFirst Search,简称 BFS)从图中的某个顶点出发,先访问其所有相邻的顶点,然后再依次访问这些相邻顶点的相邻顶点,以此类推,逐层向外扩展。
(三)图的最短路径算法1、迪杰斯特拉(Dijkstra)算法用于求解单源最短路径问题,即从一个给定的源顶点到图中其他所有顶点的最短路径。
2、弗洛伊德(Floyd)算法用于求解任意两个顶点之间的最短路径。
四、实验步骤(一)邻接矩阵的实现```cppinclude <iostream>using namespace std;const int MAX_VERTEX_NUM = 100;class Graph {private:int vertexNum;int edgeNum;int adjMatrixMAX_VERTEX_NUMMAX_VERTEX_NUM;public:Graph(int vNum) {vertexNum = vNum;edgeNum = 0;for (int i = 0; i < vertexNum; i++){for (int j = 0; j < vertexNum; j++){adjMatrixij = 0;}}}void addEdge(int i, int j) {if (i >= 0 && i < vertexNum && j >= 0 && j < vertexNum) {adjMatrixij = 1;adjMatrixji = 1;edgeNum++;}}void printGraph(){for (int i = 0; i < vertexNum; i++){for (int j = 0; j < vertexNum; j++){cout << adjMatrixij <<"";}cout << endl;}}};int main(){Graph g(5);gaddEdge(0, 1);gaddEdge(0, 2);gaddEdge(1, 2);gaddEdge(2, 3);gaddEdge(3, 4);gprintGraph();return 0;}```(二)邻接表的实现```cppinclude <iostream>include <vector>using namespace std;const int MAX_VERTEX_NUM = 100; class Graph {private:int vertexNum;vector<int> adjListMAX_VERTEX_NUM;public:Graph(int vNum) {vertexNum = vNum;}void addEdge(int i, int j) {if (i >= 0 && i < vertexNum && j >= 0 && j < vertexNum) {adjListipush_back(j);adjListjpush_back(i);}}void printGraph(){for (int i = 0; i < vertexNum; i++){cout << i <<":";for (int j = 0; j < adjListisize(); j++){cout << adjListij <<"";}cout << endl;}}};int main(){Graph g(5);gaddEdge(0, 1);gaddEdge(0, 2);gaddEdge(1, 2);gaddEdge(2, 3);gaddEdge(3, 4);gprintGraph();return 0;}```(三)深度优先遍历的实现```cppinclude <iostream>include <vector>using namespace std;const int MAX_VERTEX_NUM = 100;class Graph {private:int vertexNum;vector<int> adjListMAX_VERTEX_NUM;bool visitedMAX_VERTEX_NUM;public:Graph(int vNum) {vertexNum = vNum;for (int i = 0; i < vertexNum; i++){visitedi = false;}}void addEdge(int i, int j) {if (i >= 0 && i < vertexNum && j >= 0 && j < vertexNum) {adjListipush_back(j);adjListjpush_back(i);}}void DFS(int v) {visitedv = true;cout << v <<"";for (int i = 0; i < adjListvsize(); i++){int u = adjListvi;if (!visitedu) {DFS(u);}}}void DFSTraversal(){for (int v = 0; v < vertexNum; v++){if (!visitedv) {DFS(v);}}}};int main(){Graph g(5);gaddEdge(0, 1);gaddEdge(0, 2);gaddEdge(1, 2);gaddEdge(2, 3);gaddEdge(3, 4);gDFSTraversal();return 0;}```(四)广度优先遍历的实现```cppinclude <iostream>include <queue>include <vector>using namespace std;const int MAX_VERTEX_NUM = 100; class Graph {private:int vertexNum;vector<int> adjListMAX_VERTEX_NUM; bool visitedMAX_VERTEX_NUM; public:Graph(int vNum) {vertexNum = vNum;for (int i = 0; i < vertexNum; i++){visitedi = false;}}void addEdge(int i, int j) {if (i >= 0 && i < vertexNum && j >= 0 && j < vertexNum) {adjListipush_back(j);adjListjpush_back(i);}}void BFS(int v) {queue<int> q;visitedv = true;qpush(v);while (!qempty()){int u = qfront();qpop();cout << u <<"";for (int i = 0; i < adjListusize(); i++){int w = adjListui;if (!visitedw) {visitedw = true;qpush(w);}}}}void BFSTraversal(){for (int v = 0; v < vertexNum; v++){if (!visitedv) {BFS(v);}}}};int main(){Graph g(5);gaddEdge(0, 1);gaddEdge(0, 2);gaddEdge(1, 2);gaddEdge(2, 3);gaddEdge(3, 4);gBFSTraversal();return 0;}```(五)迪杰斯特拉算法的实现```cppinclude <iostream>include <climits>include <vector>using namespace std;const int MAX_VERTEX_NUM = 100; const int INFINITY = INT_MAX; class Graph {private:int vertexNum;int adjMatrixMAX_VERTEX_NUMMAX_VERTEX_NUM;int distanceMAX_VERTEX_NUM;bool visitedMAX_VERTEX_NUM;public:Graph(int vNum) {vertexNum = vNum;for (int i = 0; i < vertexNum; i++){for (int j = 0; j < vertexNum; j++){adjMatrixij = INFINITY;}distancei = INFINITY;visitedi = false;}}void addEdge(int i, int j, int weight) {if (i >= 0 && i < vertexNum && j >= 0 && j < vertexNum) {adjMatrixij = weight;adjMatrixji = weight;}}int minDistance(){int min = INFINITY;int minIndex =-1;for (int v = 0; v < vertexNum; v++){if (!visitedv && distancev <= min) {min = distancev;minIndex = v;}}return minIndex;}void dijkstra(int src) {distancesrc = 0;for (int count = 0; count < vertexNum 1; count++){int u = minDistance();visitedu = true;for (int v = 0; v < vertexNum; v++){if (!visitedv && adjMatrixuv!= INFINITY && distanceu!=INFINITY && distanceu + adjMatrixuv < distancev) {distancev = distanceu + adjMatrixuv;}}}for (int i = 0; i < vertexNum; i++){cout <<"源点"<< src <<"到顶点"<< i <<"的最短距离为: "<< distancei << endl;}}};int main(){Graph g(5);gaddEdge(0, 1, 2);gaddEdge(0, 2, 4);gaddEdge(1, 2, 1);gaddEdge(1, 3, 7);gaddEdge(2, 3, 3);gaddEdge(3, 4, 5);gdijkstra(0);return 0;}```(六)弗洛伊德算法的实现```cppinclude <iostream>include <climits>using namespace std;const int MAX_VERTEX_NUM = 100; const int INFINITY = INT_MAX; class Graph {private:int vertexNum;int adjMatrixMAX_VERTEX_NUMMAX_VERTEX_NUM;int distanceMAX_VERTEX_NUMMAX_VERTEX_NUM;public:Graph(int vNum) {vertexNum = vNum;for (int i = 0; i < vertexNum; i++){for (int j = 0; j < vertexNum; j++){adjMatrixij = INFINITY;}}}void addEdge(int i, int j, int weight) {if (i >= 0 && i < vertexNum && j >= 0 && j < vertexNum) {adjMatrixij = weight;}}void floyd(){for (int i = 0; i < vertexNum; i++){for (int j = 0; j < vertexNum; j++){distanceij = adjMatrixij;}}for (int k = 0; k < vertexNum; k++){for (int i = 0; i < vertexNum; i++){for (int j = 0; j < vertexNum; j++){if (distanceik!= INFINITY && distancekj!= INFINITY &&distanceik + distancekj < distanceij) {distanceij = distanceik + distancekj;}}}}for (int i = 0; i < vertexNum; i++){for (int j = 0; j < vertexNum; j++){if (distanceij == INFINITY) {cout <<"顶点"<< i <<"到顶点"<< j <<"的距离为: 无穷大" << endl;} else {cout <<"顶点"<< i <<"到顶点"<< j <<"的距离为: "<< distanceij << endl;}}}}};int main(){Graph g(4);gaddEdge(0, 1, 5);gaddEdge(0, 3, 10);gaddEdge(1, 2, 3);gaddEdge(2, 3, 1);gfloyd();return 0;}```五、实验结果分析(一)邻接矩阵和邻接表的比较邻接矩阵的优点是可以快速判断两个顶点之间是否有边相连,时间复杂度为O(1)。
实验报告:图的存储结构和遍历
武汉东湖学院
实验报告
学院:计算机科学学院专业计算机科学与技术2016年11月18日
姓名付磊学号2015040131042
班级计科一班指导老师吴佳芬
课程名称数据结构成
绩
实验名称图的存储结构和遍历
1.实验目的
(1)了解邻接矩阵存储法和邻接表存储法的实现过程。
(2)了解图的深度优先遍历和广度优先遍历的实现过程。
2.实验内容
1. 采用图的邻接矩阵存储方法,实现下图的邻接矩阵存储,并输出该矩阵.
2. 设计一个将第1小题中的邻接矩阵转换为邻接表的算法,并设计一个在屏幕上显示邻接表的算法
3. 实现基于第2小题中邻接表的深度优先遍历算法,并输出遍历序列
4. 实现基于第2小题中邻接表的广度优先遍历算法,并输出遍历序列
3.实验环境
Visual C++ 6.0
4.实验方法和步骤(含设计)
我们通过二维数组中的值来表示图中节点与节点的关系。
通过上图可知,其邻接矩阵示意图为如下:
V0 v1 v2 v3 v4 v5
V0 0 1 0 1 0 1
V1 1 0 1 1 1 0
V2 0 1 0 0 1 0
V3 1 1 0 0 1 1
V4 0 1 1 1 0 0
V5 1 0 0 1 0 0
此时的“1”表示这两个节点有关系,“0”表示这两个节点无关系。
我们通过邻接表来在计算机中存储图时,其邻接表存储图如下:
}。
图的存储实验报告
图的存储实验报告图的存储实验报告引言在计算机科学领域中,图是一种重要的数据结构,用于描述对象之间的关系。
图的存储方式对于图的遍历、搜索和其他操作有着重要的影响。
本实验旨在探究不同的图存储方式,并比较它们在不同操作下的性能差异。
一、邻接矩阵存储方式邻接矩阵是一种常见的图存储方式,它使用二维数组来表示图中各个顶点之间的关系。
在邻接矩阵中,行和列分别代表图中的顶点,矩阵中的元素表示两个顶点之间的边的关系。
实验中,我们通过一个简单的例子来说明邻接矩阵的存储方式。
假设有一个无向图,其中包含5个顶点和6条边。
我们可以使用一个5x5的矩阵来表示这个图,矩阵中的元素为1表示两个顶点之间存在边,为0表示不存在边。
邻接矩阵的优点是可以快速判断两个顶点之间是否存在边,时间复杂度为O(1)。
然而,邻接矩阵的缺点是当图中的边数较少时,会造成存储空间的浪费。
此外,在图中顶点的增加和删除操作时,需要重新调整矩阵的大小,开销较大。
二、邻接表存储方式邻接表是另一种常见的图存储方式,它使用链表来表示图中各个顶点之间的关系。
在邻接表中,每个顶点都有一个链表,链表中存储了与该顶点相邻的顶点。
实验中,我们同样以一个简单的例子来说明邻接表的存储方式。
假设有一个有向图,其中包含4个顶点和5条边。
我们可以使用一个包含4个链表的数组来表示这个图,数组中的每个元素表示一个顶点,链表中的元素表示与该顶点相邻的顶点。
邻接表的优点是在图中边的数量较少时,可以节省存储空间。
此外,在图中顶点的增加和删除操作时,开销较小。
然而,邻接表的缺点是判断两个顶点之间是否存在边的时间复杂度较高,需要遍历链表,时间复杂度为O(顶点的度数)。
三、性能比较与结论通过实验,我们对比了邻接矩阵和邻接表两种图存储方式在不同操作下的性能差异。
在判断两个顶点之间是否存在边的操作中,邻接矩阵的时间复杂度为O(1),而邻接表的时间复杂度为O(顶点的度数)。
因此,在此操作下,邻接矩阵的性能更优。
数据结构_实验六_报告
实验报告实验六图的应用及其实现一、实验目的1.进一步功固图常用的存储结构。
2.熟练掌握在图的邻接表实现图的基本操作。
3.理解掌握AOV网、AOE网在邻接表上的实现以及解决简单的应用问题。
二、实验内容一>.基础题目:(本类题目属于验证性的,要求学生独立完成) [题目一]:从键盘上输入AOV网的顶点和有向边的信息,建立其邻接表存储结构,然后对该图拓扑排序,并输出拓扑序列. 试设计程序实现上述AOV网的类型定义和基本操作,完成上述功能。
[题目二]:从键盘上输入AOE网的顶点和有向边的信息,建立其邻接表存储结构,输出其关键路径和关键路径长度。
试设计程序实现上述AOE网类型定义和基本操作,完成上述功能。
测试数据:教材图7.29【题目五】连通OR 不连通描述:给定一个无向图,一共n个点,请编写一个程序实现两种操作:D x y 从原图中删除连接x,y节点的边。
Q x y 询问x,y节点是否连通输入第一行两个数n,m(5<=n<=40000,1<=m<=100000)接下来m行,每行一对整数 x y (x,y<=n),表示x,y之间有边相连。
保证没有重复的边。
接下来一行一个整数 q(q<=100000)以下q行每行一种操作,保证不会有非法删除。
输出按询问次序输出所有Q操作的回答,连通的回答C,不连通的回答D样例输入3 31 21 32 35Q 1 2D 1 2Q 1 2D 3 2Q 1 2样例输出CCD【题目六】 Sort ProblemAn ascending sorted sequence of distinct values is one in which some form of a less-than operator is used to order the elements from smallest to largest. For example, the sorted sequence A, B, C, D implies that A < B, B < C and C < D. in this problem, we will give you a set of relations of the form A < B and ask you to determine whether a sorted order has been specified or not.【Input】Input consists of multiple problem instances. Each instance starts with a line containing two positive integers n and m. the first value indicated the number of objects to sort, where 2 <= n<= 26. The objects to be sorted will be the first n characters of the uppercase alphabet. The second value m indicates the number of relations of the form A < B which will be given in this problem instance. 1 <= m <= 100. Next will be m lines, each containing one such relation consisting of three characters: an uppercase letter, the character "<" and a second uppercase letter. No letter will be outside the range of the first n letters of the alphabet. Values of n = m = 0 indicate end of input.【Output】For each problem instance, output consists of one line. This line should be one of the following three:Sorted sequence determined: y y y… y.Sorted sequence cannot be determined.Inconsistency found.y y y… y is the sorted, ascending sequence.Sample Input Sample Output4 6 Sorted sequence determined: A B C D. A<B Inconsistency found.A<C Sorted sequence cannot be determined. B<CC<DB<DA<B3 2A<BB<A26 2A<ZD<S0 0设计要求:1、上机前,认真学习教材,熟练掌握AOV网、AOE网的构造和拓扑排序算法。
图的实验报告
《数据结构》实验报告题目:图一、实现图的邻接矩阵和邻接表存储(一)需求分析对于下图所示的有向图G,编写一个程序完成如下功能:1.建立G的邻接矩阵并输出之2.由G的邻接矩阵产生邻接表并输出之3.再由2的邻接表产生对应的邻接矩阵并输出之(二)系统设计1、本程序中用到的所有抽象数据类型的定义;typedef struct{ int no;InfoType info;} VertexType; //顶点类型typedef struct //图的定义{ int edges[MAXV][MAXV];int vexnum,arcnum;VertexType vexs[MAXV];} MGraph; //图的邻接矩阵类型typedef struct ANode //弧的结点结构类型{ int adjvex;struct ANode *nextarc;InfoType info;} ArcNode;typedef int Vertex;typedef struct Vnode //邻接表头结点的类型{ Vertex data;ArcNode *firstarc; //指向第一条弧} VNode;typedef VNode AdjList[MAXV]; //AdjList是邻接表类型typedef struct{ AdjList adjlist; //邻接表int n,e;} ALGraph; //图的邻接表类型2、主程序的流程以及各程序模块之间的层次调用关系,函数的调用关系图:3、列出各个功能模块的主要功能及输入输出参数void MatToList(MGraph g,ALGraph *&G) 将邻接矩阵g转换成邻接表Gvoid DispMat(MGraph g) 输出邻接矩阵gvoid DispAdj(ALGraph *G) 输出邻接表Gint OutDegree(ALGraph *G,int v) 求图中每个顶点的出度(三)调试分析调试过程中还是出现了一些拼写错误,经检查后都能及时修正。
2-深度优先遍历以邻接表存储的图-实验报告
福建江夏学院《数据结构与关系数据库(本科)》实验报告姓名班级学号实验日期课程名称数据结构与关系数据库(本科)指导教师成绩实验名称:深度优先遍历以邻接表存储的图一、实验目的1、掌握以邻接表存储的图的深度优先遍历算法;二、实验环境1、硬件环境:微机2、软件环境:Windows XP,VC6.0三、实验内容、步骤及结果1、实验内容:基于图的深度优先遍历编写一个算法,判别以邻接表方式存储的有向图中是否存在由顶点vi到顶点vj的路径(i≠j)。
2、代码:#include <stdio.h>#include <stdlib.h>#define MaxVertexNum 100 /*最大顶点数为100*/typedef char VertexType;typedef struct node{ /*边表结点*/int adjvex; /*邻接点域*/struct node * next; /*指向下一个邻接点的指针域*//*若要表示边上信息,则应增加一个数据域info*/}EdgeNode;typedef struct vnode{ /*顶点表结点*/VertexType vertex; /*顶点域*/EdgeNode * firstedge; /*边表头指针*/}VertexNode;typedef VertexNode AdjList[MaxVertexNum]; /*AdjList 是邻接表类型*/typedef struct{AdjList adjlist; /*邻接表*/int n,e; /*顶点数和边数*/}ALGraph; /*ALGraph 是以邻接表方式存储的图类型*/bool visited[MaxVertexNum];void CreateALGraph(ALGraph *G){/*建立有向图的邻接表存储*/int i,j,k;EdgeNode * s;printf("请输入顶点数和边数(输入格式为:顶点数,边数):\n");scanf("%d,%d",&(G->n),&(G->e)); /*读入顶点数和边数*/printf("请输入顶点信息(输入格式为:顶点号<CR>):\n");for (i=0;i<G->n;i++) /*建立有n 个顶点的顶点表*/{scanf("\n%c",&(G->adjlist[i].vertex)); /*读入顶点信息*/G->adjlist[i].firstedge=NULL; /*顶点的边表头指针设为空*/}printf("请输入边的信息(输入格式为:i,j):\n");for (k=0;k<G->e;k++) /*建立边表*/{scanf("\n%d,%d",&i,&j); /*读入边<Vi,Vj>的顶点对应序号*/s=(EdgeNode*)malloc(sizeof(EdgeNode)); /*生成新边表结点s*/s->adjvex=j; /*邻接点序号为j*/s->next=G->adjlist[i].firstedge; /*将新边表结点s 插入到顶点Vi 的边表头部*/G->adjlist[i].firstedge=s;}}/*CreateALGraph*/void DFSAL(ALGraph *G,int i){/*以Vi 为出发点对邻接表存储的图G 进行DFS 搜索*/EdgeNode *p;printf("visit vertex:V%c\n",G->adjlist[i].vertex);/*访问顶点Vi*/visited[i]=true; /*标记Vi 已访问*/p=G->adjlist[i].firstedge; /*取Vi 边表的头指针*/while(p) /*依次搜索Vi 的邻接点Vj,j=p->adjva*/{if (!visited[p->adjvex]) /*若Vj 尚未访问,则以Vj 为出发点向纵深搜索*/ DFSAL(G,p->adjvex);p=p->next; /*找Vi 的下一个邻接点*/}}/*DFSAL*/void DFSTraverseAL(ALGraph *G){/*深度优先遍历以邻接表存储的图G*/int i;for (i=0;i<G->n;i++)visited[i]=false; /*标志向量初始化*/for (i=0;i<G->n;i++)if (!visited[i]) DFSAL(G,i); /*vi 未访问过,从vi 开始DFS 搜索*/}/*DFSTraveseAL*/void main(){ALGraph *G;G=(ALGraph *)malloc(sizeof(ALGraph));CreateALGraph(G);printf("深度优先搜索结果:\n");DFSTraverseAL(G);}3、测试数据与实验结果分析(可以用组合键Alt+Print Screen截图):四、心得体会。
河南工业大学实验报告_实验二 非线性结构(二)——图
河南工业大学实验报告课程名称数据结构实验项目实验二非线性结构(二)——图院系信息学院计科系专业班级计科1401 姓名赵振学号 201416010121 指导老师范艳峰日期 2013.5.17 批改日期成绩一实验目的1.掌握图的邻接矩阵和邻接链表存储结构。
2.掌握图的建立、遍历、最小生成树等典型操作。
二实验内容及要求实验内容:(自选一题)1.建立图的邻接矩阵或邻接链表存储结构,并在对应存储结构上实现图的递归遍历操作。
2.在邻接矩阵存储结构上,完成最小生成树的操作。
实验要求:1. 根据所选题目,用C语言编写程序源代码。
2. 源程序须编译调试成功,独立完成。
三实验过程及运行结果本次试验是采用邻接表的方法建立图,然后进行深度优先遍历具体实现结如下://算法功能:采用邻接表存储结构建立无向图#include <stdio.h>#include <stdlib.h>#define OK 1#define NULL 0#define MAX_VERTEX_NUM 20 // 最大顶点数typedef int Status; //函数的类型,其值是函数结果状态代码typedef char VertexType;typedef int VRType;typedef int InforType;typedef struct ArcNode{int adjvex; //该边所指的顶点的位置struct ArcNode *nextarc; //指向下一条边的指针int weight; //边的权}ArcNode; //表的结点typedef struct VNode{VertexType data; //顶点信息(如数据等)ArcNode *firstarc; //指向第一条依附该顶点的边的弧指针}VNode, AdjList[MAX_VERTEX_NUM]; //头结点typedef struct ALGraph{AdjList vertices;int vexnum, arcnum; //图的当前顶点数和弧数}ALGraph;//返回顶点v在顶点向量中的位置int LocateVex(ALGraph G, char v){int i;for(i = 0; v != G.vertices[i].data && i < G.vexnum; i++) ;if(i >= G.vexnum)return -1;return i;}//构造邻接链表Status CreateUDN(ALGraph &G){int j;ArcNode *s, *t;printf("输入无向图顶点数: ");scanf("%d", &G.vexnum);printf("输入无向图边数: ");scanf("%d", &G.arcnum);getchar();for(int i = 0; i < G.vexnum; i++){printf("输入第%d个顶点信息:", i+1);scanf("%c", &G.vertices[i].data); //构造顶点向量 G.vertices[i].firstarc = NULL;getchar();}char v1, v2;for(int k = 0; k < G.arcnum; k++){printf("输入第 %d 条边依附的顶点v1: ", k+1);scanf("%c", &v1);getchar();printf("输入第 %d 条边依附的顶点v2: ", k+1);scanf("%c", &v2);getchar();int i = LocateVex(G, v1);int j = LocateVex(G, v2); //确定v1 , v2在G中的位置s = (ArcNode*) malloc (sizeof(ArcNode));t = (ArcNode*) malloc (sizeof(ArcNode));s->adjvex = j; //该边所指向的顶点的位置为js->nextarc = G.vertices[i].firstarc;G.vertices[i].firstarc =s;t->adjvex = i; //该边所指向的顶点的位置为jt->nextarc = G.vertices[j].firstarc;G.vertices[j].firstarc =t;}return OK;}Status PrintAdjList(ALGraph &G){ArcNode *p;printf("%4s%6s%12s\n", "编号", "顶点", "相邻边编号");for(int i = 0; i < G.vexnum; i++){printf("%4d%6c", i, G.vertices[i].data);for(p = G.vertices[i].firstarc; p; p = p->nextarc) printf("%4d", p->adjvex);printf("\n");}return OK;}int main(){ALGraph G;CreateUDN(G);PrintAdjList(G);return 0;}运行结果如下:四调试情况、设计技巧及体会图的邻接表表示不唯一,这是因为在每个顶点对应的单链表中,各边节点的链接次序可以是任意的,取决于建立邻接表的算法以及边的输入次序,另外对于有N个顶点和E条边的无向图,其邻接表有N个顶点节点和2e个边节点。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《图的邻接表存储结构实验报告》1.需解决的的问题利用邻接表存储结果,设计一种图。
2.数据结构的定义typedef struct node{//边表结点int adj;//边表结点数据域struct node *next;}node;typedef struct vnode{//顶点表结点char name[20];node *fnext;}vnode,AList[M];typedef struct{AList List;//邻接表int v,e;//顶点树和边数}*Graph;3.程序的结构图4.函数的功能1)建立无向邻接表Graph Create1( )//建立无向邻接表{Graph G;int i,j,k;node *s;G=malloc(M*sizeof(vnode));printf("输入图的顶点数和边数:");scanf("%d%d",&G->v,&G->e);//读入顶点数和边数for(i=0;i<G->v;i++)//建立顶点表{ printf("请输入图第%d个元素:",i+1);scanf("%s",&G->List[i].name);//读入顶点信息G->List[i].fnext=NULL;//边表置为空表}for(k=0;k<G->e;k++)//建立边表--建立了2倍边的结点{ printf("请输入边的两顶点序号:(从0考试)");scanf("%d%d",&i,&j);//读入边(Vi,Vj)的顶点对序号s=(node *)malloc(sizeof(node));//生成边表结点s->adj=j;s->next=G->List[i].fnext;G->List[i].fnext=s;//将新结点*s插入顶点Vi的边表头部s=(node *)malloc(sizeof(node));s->adj=i;//邻接点序号为is->next=G->List[j].fnext;G->List[j].fnext=s;// 将新结点*s插入顶点Vj的边表头部}return G;}2)建立有向邻接图Graph Create2() //有向邻接图{Graph G;int i,j,k;node *q;G=malloc(M*sizeof(vnode));printf("请输入顶点数和弧数:");scanf("%d%d",&G->v,&G->e);for (i=0;i<G->v;i++) //建立有n个顶点的顶点表{ printf("请输入图第%d个元素:",i+1);scanf("%s",&G->List[i].name); //读入顶点信息G->List[i].fnext=NULL;}for (k=0;k<G->e;k++) //建立边表{ printf("请输入两顶点的序号:(从0开始)");scanf("%d%d",&i,&j);q=(node *)malloc(sizeof(node)); //生成新边表结点sq->adj=j; //邻接点序号为jq->next=G->List[i].fnext;G->List[i].fnext=q;}return G;}3)输出无向图的邻接表void Print1(Graph G)//输出无向图的邻接表{int i;node *p;printf("\n\t\t\t邻接表\n");for(i=0;i<G->v;i++){ p=G->List[i].fnext;printf("\t\t\t%d | %3s",i,G->List[i].name);while(p){printf("->%d",p->adj);p=p->next;}printf("\n");}}4)输出个元素的度数void Du(Graph G)//输出各元素的度数{int i,j;node *p;printf("\n\t\t\t各点度数\n");for(i=0;i<G->v;i++){ p=G->List[i].fnext;printf("\t\t\t顶点%2s的度为:",G->List[i].name);j=0;while(p){ j++;p=p->next;}printf("%d\n",j);}}5)返回图结点在的序号int LocateVex(Graph G,char *u){//初始条件:图G存在,u和G中顶点有相同的特征//操作结果:若G中存在顶点u,则返回该顶点在图中的位置;否则返回-1 int i;for(i=0;i<G->v;++i)if(strcmp(u,G->List[i].name)==0)return -1;}6)返回序号为v的图结点的值char *VertexGet(Graph G,int v){if(v>=G->v||v<0)exit(0);return G->List[v].name;}7)返回图结点v的第一个邻接顶点的序号int FirstAdjVex(Graph G,char *v){//初始条件:图G存在,v是G中的某个顶点//操作结果:返回v中第一个邻接顶点的序号。
若顶点在G中没有邻接顶点//则返回-1node *p;int v1;v1=LocateVex(G,v);p=G->List[v1].fnext;if(p)return p->adj;else}8)找到图结点v的第二个邻接顶点的序号void NextAdjVex(Graph G,char *v,char *w){//初始条件:图G存在,v是G中某个顶点,w是v得邻接点//操作结果:输出v的(相对于w的)下一个邻接点的序号node *p;int v1,w1;v1=LocateVex(G,v);w1=LocateVex(G,w);p=G->List[v1].fnext;while(p&&p->adj!=w1)p=p->next;if(!p||!p->next)printf("没有第二个邻接点!\n");elseprintf("第二个邻接点序号是:%d\n",p->next->adj);}9)深度优先遍历图void DFS(Graph G,int i,int flag[]){node *p;printf("%2s ",G->List[i].name);flag[i]=1;p=G->List[i].fnext;while(p){if(!flag[p->adj])DFS(G,p->adj,flag);p=p->next;}}void DFSTravel(Graph G)//深度优先遍历{int i;int flag[M];//标志数组for(i=0;i<G->v;i++)flag[i]=0;for(i=0;i<G->v;i++)if(!flag[i])DFS(G,i,flag);}10)广度优先遍历void BFSTravel(Graph G)//广度优先遍历{ Queue Q;node *p;int i,j=0;int flag[M];//标志数组Q=malloc(sizeof(M));InitQueue(Q);for(i=0;i<G->v;i++)flag[i]=0;for(i=0;i<G->v;i++)if(flag[i]==0)//此点未被访问{flag[i]=1;printf("%2s ",G->List[i].name);Enter(Q,i);while(Q->front!=Q->rear){Leave(Q,j);//队头元素出队并置为jp=G->List[j].fnext;while(p!=NULL){ if(flag[p->adj]==0){printf("%2s ",G->List[p->adj].name);flag[p->adj]=1;Enter(Q,p->adj);}//ifp=p->next;}//while}//while}//if}5.输入/输出数据1)选择操作2)选择“1”然后输入“3 3”输入“a”,“b”,“c”输入“0 1”,“1 2”,“2 0”3)选择“2”跟选择“1”类似4)选择“3”5)选择“4”输入“1”6)选择“5”输入“a”7)选择“6”8)选择“7”9)选择“0”退出程序6.总结此次实验要求熟练掌握关于图的各项基本操作,重点在利用邻接表存储图的结构,以及深度、广度优先遍历图的方法。
THANKS !!!致力为企业和个人提供合同协议,策划案计划书,学习课件等等打造全网一站式需求欢迎您的下载,资料仅供参考。