厦门理工学院数据结构实验7图的定义和操作
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
} int main() { /*定义图结点*/
ALGraph alGraph;
/*建立图的邻接表*/ CreateGraph(&alGraph); /*输出图的邻接表*/ OutputGraph(&alGraph); /*深度优先遍历*/ DFSTraverse(&alGraph); /*广度优先遍历*/ BFSTraverse(&alGraph); getch(); return 0;
w = DelQueue(&queue); vexNode = alGraph->vertices[w].firstarc; while(vexNode != NULL) { w = vexNode->adjvex; if(visited[w]==0) { visited[w] = 1;
printf("[%d] -> ",w); EnQueue(&queue,w); } vexNode = vexNode->nextarc; } } } } printf("[end]\n");
newnode = ( ArcNode * ) malloc (sizeof(ArcNode)); newnode->adjvex = GraphEdge[j][1]; newnode->nextarc = NULL; alGraph->vertices[i].firstarc = newnode; } else { vexNode = alGraph->vertices[i].firstarc; while(vexNode->nextarc != NULL) { vexNode = vexNode->nextarc; } newnode = ( ArcNode * ) malloc (sizeof(ArcNode)); newnode->adjvex = GraphEdge[j][1]; newnode->nextarc = NULL; vexNode->nextarc = newnode; } } } void OutputGraph(ALGraph * alGraph) { int i; ArcNode * vexNode; printf("The graph dedicated by adjacency list is:\n"); for(i=0;i<MAX_VEXTEX_NUM;i++) {
/*定义数组 visited 用来标示一个顶点是否被访问过*/
int visited[MAX_VEXTEX_NUM]={0,0,0,0,0,0,0,0,0};
/*定义表结点,即每条弧对应的结点 */
typedef struct ArcNode{
int adjvex;
/* 该弧所指向的顶点的位置 */
/* 定义图的结构 */
typedef struct {
VNode vertices[MAX_VEXTEX_NUM];/* 定义表头数组 */
int vexnum;
/* 定义图中顶点数 */
int arcnum;
/* 定义图中弧数 */
}ALGraph;
void CreateGraph(ALGraph * alGraph) { int i,j; ArcNode * newnode; ArcNode * vexNode; alGraph->vexnum = MAX_VEXTEX_NUM; alGraph->arcnum = ARC_NUM; /* 初始化表头 */ for(i=0;i<MAX_VEXTEX_NUM;i++) { alGraph->vertices[i].data = i; alGraph->vertices[i].firstarc = NULL; } for(j=0;j<2*ARC_NUM;j++) { i = GraphEdge[j][0]; if(alGraph->vertices[i].firstarc==NULL) {
*
2][2]
=
{{0,1},{1,0},{1,2},{2,1},{2,3},{3,2},{3,4},{4,3},{4,5},{5,4},{5,0},{0,5},{0,6},{6,0},{6,8},{8,6}
,{6,7},{7,6},{7,8},{8,7},{7,3},{3,7},{8,4},{4,8}};
while(vexNode != NULL)
{
w = vexNode->adjvex;
if(visited[w]==0)
DFS(alGraph,w);
vexNode = vexNode->nextarc;
}
}
void DFSTraverse(ALGraph * alGraph)
{
int i;
/*访问标志数组初始化*/
{
if(visited[i] == 0)
DFS(alGraph,i);
}
printf("[end]\n"); } typedef struct{
int queuemem[MAX_QUEUEMEM]; int header; int rear; }QUEUE; void InitQueue(QUEUE *queue) { queue->header = 0; queue->rear = 0; } void EnQueue(QUEUE *queue,int v) { queue->queuemem[queue->rear] = v; queue->rear++; } int DelQueue(QUEUE *queue) {
printf("the header is: [%d] -> ",alGraph->vertices[i].data);
vexNode = alGraph->vertices[i].firstarc;
while(vexNode != NULL)
{
printf("[%d] -> ",vexNode->adjvex);
struct ArcNode * nextarc; /* 指向下一条弧的指针 */
}ArcNode;
/* 定义头结点 */
typedef struct VNode{
int data;
/* 顶点信息 */
struct ArcNode * firstarc; /* 指向第一条依附该顶点的弧的指针 */
}VNode,AdjList[MAX_VEXTEX_NUM];
三、实验内容与步骤 1、 编程实现图的遍历图算法(按图的深度优先搜索算法或广度优先搜索算
法遍历);
2、 应用拓朴排序算法编制程序解决问题。(附加题)
四、分析与讨论
对上机实践结果进行分析,上机的心得体会。
五、教师评语
成绩
签名:
日期:
附源程序清单:
#include <stdio.h>
#include <stdlib.h>
puts("the result of BFS is:"); for(i=0;i<MAX_VEXTEX_NUM;i++) { if(visited[i] == 0) { visited[i] = 1;
printf("[%d] -> ",i); EnQueue(&queue,i); while(!EmptyQueue(&queue)) {
for(i=0;i<MAX_VEXTEX_NUM;i++)
{
visited[i] = 0;
}
printf("\n");
puts("********************************************");
puts("* the function DFSTraverse will traverse *");
}
#include <conio.h>
#define MAX_VEXTEX_NUM 9 /* 图中顶点数 */
#define ARC_NUM 12
/* 图中弧数 */
#defΒιβλιοθήκη Baidune MAX_QUEUEMEM (MAX_VEXTEX_NUM+1)
/* 定义描述图的顶点之间连接信息的数组 */
int
GraphEdge[ARC_NUM
puts("* the graphby Depth First Search
*");
puts("********************************************");
puts("the result of DFS is:");
for(i=0;i<MAX_VEXTEX_NUM;i++)
return queue->queuemem[queue->header++]; } int EmptyQueue(QUEUE *queue) {
if(queue->header == queue->rear) return 1;
return 0; } void BFSTraverse(ALGraph * alGraph) { int i; int w; ArcNode * vexNode; QUEUE queue; InitQueue(&queue); /*访问标志数组初始化*/ for(i=0;i<MAX_VEXTEX_NUM;i++) { visited[i] = 0; } printf("\n"); puts("********************************************"); puts("* the function BFSTraverse will traverse *"); puts("* the graph by Breadth First Search *"); puts("********************************************");
实验序号:7
《数据结构》实验报告
实验项目名称:图的定义和操作
学号 实验地点
姓名 指导教师
专业、班 实验时间
一、实验目的及要求 1、 掌握图的基本存储方法; 2、 掌握图的两种搜索路径的遍历算法; 3、 掌握拓扑排序算法;(选做)
二、实验设备(环境)及要求 微型计算机; windows 操作系统; Microsoft Visual Studio 6.0 集成开发环境。
vexNode=vexNode->nextarc;
}
printf("[END]\n");
}
}
void DFS(ALGraph * alGraph,int v)
{
int w;
ArcNode * vexNode;
visited[v] = 1;
printf("[%d] -> ",v);
vexNode = alGraph->vertices[v].firstarc;
ALGraph alGraph;
/*建立图的邻接表*/ CreateGraph(&alGraph); /*输出图的邻接表*/ OutputGraph(&alGraph); /*深度优先遍历*/ DFSTraverse(&alGraph); /*广度优先遍历*/ BFSTraverse(&alGraph); getch(); return 0;
w = DelQueue(&queue); vexNode = alGraph->vertices[w].firstarc; while(vexNode != NULL) { w = vexNode->adjvex; if(visited[w]==0) { visited[w] = 1;
printf("[%d] -> ",w); EnQueue(&queue,w); } vexNode = vexNode->nextarc; } } } } printf("[end]\n");
newnode = ( ArcNode * ) malloc (sizeof(ArcNode)); newnode->adjvex = GraphEdge[j][1]; newnode->nextarc = NULL; alGraph->vertices[i].firstarc = newnode; } else { vexNode = alGraph->vertices[i].firstarc; while(vexNode->nextarc != NULL) { vexNode = vexNode->nextarc; } newnode = ( ArcNode * ) malloc (sizeof(ArcNode)); newnode->adjvex = GraphEdge[j][1]; newnode->nextarc = NULL; vexNode->nextarc = newnode; } } } void OutputGraph(ALGraph * alGraph) { int i; ArcNode * vexNode; printf("The graph dedicated by adjacency list is:\n"); for(i=0;i<MAX_VEXTEX_NUM;i++) {
/*定义数组 visited 用来标示一个顶点是否被访问过*/
int visited[MAX_VEXTEX_NUM]={0,0,0,0,0,0,0,0,0};
/*定义表结点,即每条弧对应的结点 */
typedef struct ArcNode{
int adjvex;
/* 该弧所指向的顶点的位置 */
/* 定义图的结构 */
typedef struct {
VNode vertices[MAX_VEXTEX_NUM];/* 定义表头数组 */
int vexnum;
/* 定义图中顶点数 */
int arcnum;
/* 定义图中弧数 */
}ALGraph;
void CreateGraph(ALGraph * alGraph) { int i,j; ArcNode * newnode; ArcNode * vexNode; alGraph->vexnum = MAX_VEXTEX_NUM; alGraph->arcnum = ARC_NUM; /* 初始化表头 */ for(i=0;i<MAX_VEXTEX_NUM;i++) { alGraph->vertices[i].data = i; alGraph->vertices[i].firstarc = NULL; } for(j=0;j<2*ARC_NUM;j++) { i = GraphEdge[j][0]; if(alGraph->vertices[i].firstarc==NULL) {
*
2][2]
=
{{0,1},{1,0},{1,2},{2,1},{2,3},{3,2},{3,4},{4,3},{4,5},{5,4},{5,0},{0,5},{0,6},{6,0},{6,8},{8,6}
,{6,7},{7,6},{7,8},{8,7},{7,3},{3,7},{8,4},{4,8}};
while(vexNode != NULL)
{
w = vexNode->adjvex;
if(visited[w]==0)
DFS(alGraph,w);
vexNode = vexNode->nextarc;
}
}
void DFSTraverse(ALGraph * alGraph)
{
int i;
/*访问标志数组初始化*/
{
if(visited[i] == 0)
DFS(alGraph,i);
}
printf("[end]\n"); } typedef struct{
int queuemem[MAX_QUEUEMEM]; int header; int rear; }QUEUE; void InitQueue(QUEUE *queue) { queue->header = 0; queue->rear = 0; } void EnQueue(QUEUE *queue,int v) { queue->queuemem[queue->rear] = v; queue->rear++; } int DelQueue(QUEUE *queue) {
printf("the header is: [%d] -> ",alGraph->vertices[i].data);
vexNode = alGraph->vertices[i].firstarc;
while(vexNode != NULL)
{
printf("[%d] -> ",vexNode->adjvex);
struct ArcNode * nextarc; /* 指向下一条弧的指针 */
}ArcNode;
/* 定义头结点 */
typedef struct VNode{
int data;
/* 顶点信息 */
struct ArcNode * firstarc; /* 指向第一条依附该顶点的弧的指针 */
}VNode,AdjList[MAX_VEXTEX_NUM];
三、实验内容与步骤 1、 编程实现图的遍历图算法(按图的深度优先搜索算法或广度优先搜索算
法遍历);
2、 应用拓朴排序算法编制程序解决问题。(附加题)
四、分析与讨论
对上机实践结果进行分析,上机的心得体会。
五、教师评语
成绩
签名:
日期:
附源程序清单:
#include <stdio.h>
#include <stdlib.h>
puts("the result of BFS is:"); for(i=0;i<MAX_VEXTEX_NUM;i++) { if(visited[i] == 0) { visited[i] = 1;
printf("[%d] -> ",i); EnQueue(&queue,i); while(!EmptyQueue(&queue)) {
for(i=0;i<MAX_VEXTEX_NUM;i++)
{
visited[i] = 0;
}
printf("\n");
puts("********************************************");
puts("* the function DFSTraverse will traverse *");
}
#include <conio.h>
#define MAX_VEXTEX_NUM 9 /* 图中顶点数 */
#define ARC_NUM 12
/* 图中弧数 */
#defΒιβλιοθήκη Baidune MAX_QUEUEMEM (MAX_VEXTEX_NUM+1)
/* 定义描述图的顶点之间连接信息的数组 */
int
GraphEdge[ARC_NUM
puts("* the graphby Depth First Search
*");
puts("********************************************");
puts("the result of DFS is:");
for(i=0;i<MAX_VEXTEX_NUM;i++)
return queue->queuemem[queue->header++]; } int EmptyQueue(QUEUE *queue) {
if(queue->header == queue->rear) return 1;
return 0; } void BFSTraverse(ALGraph * alGraph) { int i; int w; ArcNode * vexNode; QUEUE queue; InitQueue(&queue); /*访问标志数组初始化*/ for(i=0;i<MAX_VEXTEX_NUM;i++) { visited[i] = 0; } printf("\n"); puts("********************************************"); puts("* the function BFSTraverse will traverse *"); puts("* the graph by Breadth First Search *"); puts("********************************************");
实验序号:7
《数据结构》实验报告
实验项目名称:图的定义和操作
学号 实验地点
姓名 指导教师
专业、班 实验时间
一、实验目的及要求 1、 掌握图的基本存储方法; 2、 掌握图的两种搜索路径的遍历算法; 3、 掌握拓扑排序算法;(选做)
二、实验设备(环境)及要求 微型计算机; windows 操作系统; Microsoft Visual Studio 6.0 集成开发环境。
vexNode=vexNode->nextarc;
}
printf("[END]\n");
}
}
void DFS(ALGraph * alGraph,int v)
{
int w;
ArcNode * vexNode;
visited[v] = 1;
printf("[%d] -> ",v);
vexNode = alGraph->vertices[v].firstarc;