《数据结构》上机实验报告—有向图的邻接表的建立及遍历
数据结构实验五---图的遍历及其应用实现

数据结构实验五---图的遍历及其应用实现实验五图的遍历及其应用实现一、实验目的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同样是一种遍历图的算法,其基本思想是从图的某一顶点开始,首先访问其所有邻接点,然后再依次访问邻接点的邻接点,直到所有顶点都被访问过为止。
数据结构实验---图的储存与遍历

数据结构课程实验报告一、实验目的掌握图这种复杂的非线性结构的邻接矩阵和邻接表的存储表示, 以及在此两种常用存储方式下深度优先遍历(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开始。
数据结构上机报告10

数据结构上机报告班级:13 软件工程(本)班学号:姓名:周次:上机时间:一、上机目的:图的遍历;二、上机内容:一)建立一个无向图+遍历+插入(1)以邻接矩阵表示法作为存储结构,从键盘依次输入顶点数、弧数与各弧信息建立一个无向图;(2)对(1)中生成的无向图进行广度优先遍历并打印结果;(3)向(1)中生成的无向图插入一条新边并打印结果;二)建立一个有向图+遍历+插入+删除(1)以邻接表作为图的存储结构,从键盘输入图的顶点与弧的信息建立一个有向图;(2)对(1)中生成的有向图进行深度优先遍历并打印结果;(3)在(1)中生成的有向图中,分别插入与删除一条弧并打印其结果;三、实验要求:(1)程序要添加适当的注释,程序的书写要采用缩进格式。
(2)必须要有操作界面。
(2) 程序要具在一定的健壮性,即当输入数据非法时,程序也能适当地做出反应,如插入删除时指定的位置不对等等。
(3)将本文件改名为:学号后三位+姓名+上机报告10.doc上交。
四.上机结果:给出代码和运行结果截图。
(一)#include<stdio.h>#include<string.h>#include<malloc.h>#include<stdlib.h>#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define OVERFLOW -2#define MAX_NAME 5 /* 顶点字符串的最大长度+1 */#define MAX_INFO 20 /* 相关信息字符串的最大长度+1 */#define INFINITY INT_MAX /* 用整型最大值代替∞*/#define MAX_VERTEX_NUM 20 /* 最大顶点个数*/typedef int Boolean;Boolean visited[MAX_VERTEX_NUM]; /* 访问标志数组(全局量) */typedef int Status;typedef int VRType;typedef char InfoType;typedef char VertexType[MAX_NAME];typedef enum{DG,DN,AG,AN}GraphKind; /* {有向图,有向网,无向图,无向网} */typedef struct{VRType adj; /* 顶点关系类型。
数据结构有向网络实验报告

2,数据输入
从键盘输入n个整型数据,来表示图的顶点,再从键盘输入e组有序数对来表示图的e条边,与此同时,输入相应边的权值,权值定义为浮点型,数据间都以逗号间隔,以回车作为结束符。本程序中定义图的顶点数为7,边数为10。
3,数据输出
从键盘输入数据后,由BFSL函数对图进行广度优先搜索遍历,再由preorder函数输出生成树的边集,输出结果都是整型数据。
s=T[i]->headptr->next;
T[i]->headptr->next=sp;
sp->next=s;
visited[p->adjvex-1]=1;
ENQUEUE(Q,p->adjvex-1);//访问过的顶点入队
}p=p->next;找vi+1的下一个邻接点
(2)函数声明:void preorder(ctree *T)
}
p=ga[i].link;//取vi+1的边表头指针
while(p!=NULL)//依次搜索v(i+1)的邻接点
{
if (! visited[p->adjvex-1])//访问v(i+1)未曾访问的邻接点
{
sp=(link*)malloc(sizeof(link));
sp->child=p->adjvex;
s->adjvex=j; //邻接点序号为j
s->next=ga[i].link;
s->weight=w;
ga[i].link=s; //将新结点*s插入顶点vi的边表头部
}
}
void BFSL(int k)//从v(k+1)出发广度优先搜索图ga
数据结构与算法-图的邻接表

数据结构与算法-图的邻接表实验报告课程: 数据结构与算法实验日期: 实验名称: 图的邻接表一、实验目的掌握图的邻接表的创建和遍历二、实验内容必做部分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、在主函数中调用上述操作函数。
要求给出至少两组测试数据。
选做部分基于邻接表存储结构实现图的广度优先搜索算法。
【实验】数据结构图的遍历实验报告

【关键字】实验数据结构图的遍历实验报告篇一:【数据结构】图的保存和遍历实验报告《数据结构B》实验报告系计算机与电子专业级班姓名学号XX年1 0月9日1. 上机题目:图的保存和遍历2. 详细设计#include#define GRAPHMAX 10#define FALSE 0#define TRUE 1#define error printf#define QueueSize 30typedef 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;void InitQueue(CirQueue *Q){Q->front=Q->rear=0;Q->count=0;}int QueueEmpty(CirQueue *Q){return Q->count=QueueSize;}int QueueFull(CirQueue *Q){return Q->count==QueueSize;}void EnQueue(CirQueue *Q,int x){if(QueueFull(Q))error("Queue overflow");else{ Q->count++;Q->data[Q->rear]=x;Q->rear=(Q->rear+1)%QueueSize;}}int DeQueue(CirQueue *Q){int temp;if(QueueEmpty(Q)){ error("Queue underflow");return NULL;}else{ temp=Q->data[Q->front]; Q->count--;Q->front=(Q->front+1)%QueueSize;return temp;}}void CreateMGraph(MGraph *G){int i,j,k;char ch1,ch2;printf("\n\t\t请输入定点数,边数并按回车(格式如:3,4):");scanf("%d,%d",&(G->n),&(G->e));for(i=0;in;i++){ getchar();printf("\n\t\t请输入第%d个定点数并按回车:",i+1);scanf("%c",&(G->vexs[i]));}for(i=0;in;i++)for(j=0;jn;j++)G->edges[i][j]=0;for(k=0;ke;k++){ getchar();printf("\n\t\t请输入第%d条边的顶点序号(格式如:i,j):",k+1); scanf("%c,%c",&ch1,&ch2);for(i=0;ch1!=G->vexs[i];i++);for(j=0;ch2!=G->vexs[j];j++);G->edges[i][j]=1;}}void DFSM(MGraph *G,int i){int j;printf("\n\t\t深度优先遍历序列:%c\n",G->vexs[i]);visited[i]=TRUE;for(j=0;jn;j++)if(G->edges[i][j]==1 && visited[j]!=1) ////////////////DFSM(G,j);}void BFSM(MGraph *G,int k){ int i,j;CirQueue Q;InitQueue(&Q);printf("\n\t\t广度优先遍历序列:%c\n",G->vexs[k]);visited[k]=TRUE;EnQueue(&Q,k);while(!QueueEmpty(&Q)){ i=DeQueue(&Q);for(j=0;jn;j++)if(G->edges[i][j]==1 && visited[j]!=1){ visited[j]=TRUE;EnQueue(&Q,j);}}}void DFSTraverseM(MGraph *G){int i;for(i=0;in;i++)visited[i]=FALSE;for(i=0;in;i++)if(!visited[i]) DFSM(G,i);}void BFSTraverseM(MGraph *G){int i;for(i=0;in;i++)visited[i]=FALSE;for(i=0;in;i++)if(!visited[i]) BFSM(G,i);}void main(){MGraph *G,a;char ch1;int i,j,ch2;G=&a;printf("\n\t\t建立一个有向图的邻接矩阵表示\n"); CreateMGraph(G);printf("\n\t\t已建立一个有向图的邻接矩阵保存\n"); for(i=0;in;i++){ printf("\n\t\t");for(j=0;jn;j++)printf("%5d",G->edges[i][j]);}getchar();ch1='y';while(ch1=='y'||ch1=='Y'){ printf("\n");printf("\n\t\t图的保存与遍历");printf("\n\t\t********************************"); printf("\n\t\t*1-----更新邻接矩阵*");printf("\n\t\t*2-----深度优先遍历*");printf("\n\t\t*3-----广度优先遍历*");printf("\n\t\t*0-----退出*");printf("\n\t\t********************************");}} printf("\n\t\t请选择菜单号(0----3)"); scanf("%d",&ch2); getchar(); switch(ch2) { case 1:CreateMGraph(G); printf("\n\t\t图的邻接矩阵保存建立完成\n");break; case 2:DFSTraverseM(G);break; case 3:BFSTraverseM(G);break; case 0:ch1='n';break; default:printf("\n\t\t输出错误!清重新输入!"); }3. 调试分析(1)调试过程中主要遇到哪些问题?是如何解决的?由于实习之初对邻接表的保存结构了解不是很清楚,所以在运行出了一个小错误,即在输出邻接表时,每个结点都少了一个邻接点。
数据结构图的遍历实验报告

实验项目名称:图的遍历一、实验目的应用所学的知识分析问题、解决问题,学会用建立图并对其进行遍历,提高实际编程能力及程序调试能力。
二、实验内容问题描述:建立有向图,并用深度优先搜索和广度优先搜素。
输入图中节点的个数和边的个数,能够打印出用邻接表或邻接矩阵表示的图的储存结构。
三、实验仪器与设备计算机,Code::Blocks。
四、实验原理用邻接表存储一个图,递归方法深度搜索和用队列进行广度搜索,并输出遍历的结果。
五、实验程序及结果#define INFINITY 10000 /* 无穷大*/#defi ne MAX_VERTEX_NUM 40#defi ne MAX 40#i nclude<stdlib.h>#i nclude<stdio.h>#in clude<c oni o.h>#i nclude<stri ng.h>typedef struct ArCell{int adj;}ArCell,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];typedef struct{ char n ame[20];实验项目名称:图的遍历}in fotype;typedef struct{ in fotype vexs[MAX_VERTEX_NUM];AdjMatrix arcs;int vex nu m,arc num;}MGraph;int LocateVex(MGraph *G,char* v){ int c = -1,i;for(i=0;i<G->vex nu m;i++)if(strcmp(v,G->vexs[i]. name)==0){ c=i; break;}return c;}MGraph * CreatUDN(MGraph *G)〃初始化图,接受用户输入{int i,j,k,w;char v1[20],v2[20];printf("请输入图的顶点数,弧数:");sca nf("%d%d",&G->vex num,&G->arc num);printf("结点名字:\n");for(i=0;i<G->vex nu m;i++){prin tf("No.%d:",i+1);sca nf("%s",G->vexs[i]. name);}for(i=0;i<G->vex nu m;i++)for(j=0;j<G->vex nu m;j++)G->arcs[i][j].adj=INFINITY;printf("请输入一条边依附的两个顶点和权值:\n");for(k=0;k<G->arc nu m;k++){printf("第%d 条边:\n",k+1);printf("起始结点:");sca nf("%s",v1);printf("结束结点:");sca nf("%s",v2);//printf(” 边的权值:");//sca nf("%d",&w);i=LocateVex(G,v1); j=LocateVex(G,v2);if(i>=0&&j>=0){//G->arcs[i][j].adj=w;G->arcs[j][i]=G->arcs[i][j];}}return G;}int FirstAdjVex(MGraph *G ,int v){int i;if(v<=0 && v<G->vex num){ //v 合理for(i=0;i<G->vex nu m;i++)if(G->arcs[v][i].adj!=INFINITY)return i;} return -1;} void VisitFu nc(MGraph *G ,int v){printf("%s ",G->vexs[v].name);}int NextAdjVex(MGraph *G ,int v,int w){int k;if(v>=0 && v<G->vex num && w>=0 && w<G->vex num)//v,w 合理{for( k=w+1;k<G->vex nu m;k++)if(G->arcs[v][k].adj!=INFINITY)return k;}return -1;}in t visited[MAX];void DFS(MGraph *G,int v)〃从第v个顶点出发递归地深度优先遍历图G {int w;visited[v]=1;VisitFunc(G,v);//访问第v个结点for(w=FirstAdjVex(G ,v);w>=O;w=NextAdjVex(G ,v,w))if(!visited[w]){DFS(Gw);prin tf("%d ",G->arcs[v][w]);}}void DFSTraverse(MGraph *G,char *s)//深度优先遍历{in t v,k;for(v=O;v<G->vex num ;v++)visited[v]=O;k=LocateVex(Gs);if(k>=0&&k<G->vex num){for(v=k;v>=0;v__){if(!visited[v])DFS(Gv);}for(v=k+1;v<G->vex nu m;v++)if(!visited[v])DFS(Gv);}}typedef struct Qnode{int vex num;struct Qnode *n ext;}QNode,*QueuePtr;typedef struct{QueuePtr front;QueuePtr rear;}Lin kQueue;int Ini tQueue(Li nkQueue *Q){Q->fro nt=Q->rear=(QueuePtr)malloc(sizeof(QNode));if(!Q->fro nt)exit(O);Q->fro nt-> next=NULL;return 1;}void En Queue(L in kQueue *Q,i nt a ){QueuePtr p;p=(QueuePtr)malloc(sizeof(QNode));if(!p)exit(0);p->vex num=a;p-> next=NULL;Q->rear- >n ext=p;Q->rear=p;}int DeQueue(L in kQueue *Q,int *v){ QueuePtr p;if(Q->fr on t==Q->rear){printf("结点不存在!\n");exit(0);}p=Q->fr ont->n ext;*v=p->vex num;Q->front->n ext=p->n ext;if(Q->rear==p)Q->fro nt=Q->rear;return *v;}int QueueEmpty(L in kQueue *Q){if(Q->rear==Q->fro nt)return 0;return 1;}int Visited[MAX];void BFSTraverse(MGraph *G,char *str)〃广度优先遍历{int w,u,v,k;Lin kQueue Q,q; for(v=0;v<G->vex num ;v++) Visited[v]=O; Ini tQueue(&Q);I nitQueue(&q); k=LocateVex(Gstr);for(v=k;v>=0;v__) if(!Visited[v]){Visited[v]=1;VisitFu nc(G,v);EnQueue(&Q,v);//v 入队while(!QueueEmpty(&Q)){DeQueue(&Q,&u);〃出队for(w=FirstAdjVex(G ,u);w>=0;w=NextAdjVex(G ,u,w)) if(!Visited[w]) {Visited[w]=1;VisitFu nc(G,v);En Queue(&Q,w);}}}for(v=k+1;v<G->vex nu m;v++)if(!Visited[v]){Visited[v]=1;VisitFu nc(G,v);EnQueue(&Q,v);//v 入队while(!QueueEmpty(&Q)){DeQueue(&Q,&u);〃出队for(w=FirstAdjVex(G ,u);w>=0;w=NextAdjVex(G ,u,w)) if(!Visited[w]) {Visited[w]=1;VisitFu nc(G,v);En Queue(&Q,w);}}}}void mai n(){MGraph *G,b;char v[10];G=CreatUDN (&b);printf("请输入起始结点名称:"); sea nf("%s",v);printf("\n深度优先遍历:\n");DFSTraverse(Qv);printf("\n广度优先遍历:\n");BFSTraverse(Qv); geteh();}六、实验总结实验要求输入图中节点的个数和边的个数,能够打印出用邻接表或邻接矩阵表示的图的储存结构。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
}
else
return -1;//没有找到w或w是v的最后一个邻接顶点
}
int Visit(char v)
{
printf("%c ",v);
return OK;
}
int CreateDG(ALGraph &G)//采用邻接表表示,构造有向图G
DFSTraverse(G);
printf("\n");
printf("广度优先搜索的顺序:");
BFSTraverse(G,Visit);
}
printf("\n");
}
【结果截图】
福州大学数计学院
《数据结构》上机实验报告
专业和班级:信息计算科学与应用数学6班
学号
姓名
成绩
实验名称
图的有关操作
实验内容
有向图的邻接表的建立及遍历
实
验
目
的
和
要
求
【实验目的】
1.掌握图的存储思想及其存储实现。
2.掌握图的深度、广度优先遍历算法思想及其程序实现。
3.掌握图的常见应用算法的思想及其程序实现。
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;
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);
else
return -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)
p=Q.front->next;
e=p->data;
Q.front->next=p->next;
if(Q.rear==p)
Q.rear=Q.front;
free(p);
returnOK;
}
int EmptyQueue(LinkQueue Q)//判断队列Q是否为空
{
if(Q.front==Q.rear)
}
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;
return -1;
p=G.vertices[i].firstarc; //p指向v的邻接顶点链表中的第一个邻接顶点
while(p->nextarc&&p->adjvex!=j)//找到邻接顶点w
p=p->nextarc;
if(p->nextarc)//找到邻接顶点w,且w非v的最后一个邻接顶点
{
q=p->nextarc;
问
题
描
述
和
主
要
步
骤
【实验内容】
1.键盘输入数据,建立一个有向图的邻接表。
2.在有向图的邻接表的基础上计算各顶点的度。
3.采用邻接表存储实现有向图的深度优先遍历。
4.采用邻接表存储实现有向图的广度优先遍历。
【主要程序】
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
{
int data;
struct QNode *next;
}QNode,*QueuePtr;
typedef struct//链队列
{
QueuePtr front;
QueuePtr rear;
}LinkQueue;
int InitQueue(LinkQueue &Q)//初始化链队
{
Q.front=Q.rear=(QueuePtr)malloc(sizeof(QNode));
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;//初始化该头结点指针域
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("深度优先搜索的顺序:");
struct ArcNode *nextarc;//指向下一条弧的指针
char *info;//该弧相关信息的指针
}ArcNode;
typedef struct VNode//头结点
{
char data;//顶点信息
ArcNode *firstarc;//第一个表结点的地址,指向第一条依附顶点的弧的指针
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()
}VNode,AdjList[MAX_VERTEX_NUM]; //头结点,头结点的顺序表AdjList[]类型
typedef struct//图结构
{
AdjList vertices;
int vexnum,arcnum;//图的当前顶点数与弧数
}ALGraph;
typedef struct QNode//用于BFS遍历的附设链队列结点结构
{
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)
returnERROR;
}
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])
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;
{
visited[v]=1;
Visit(G.vertices[v].data);
}
Enቤተ መጻሕፍቲ ባይዱueue(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(i==-1||j==-1||i==j)