实验5 图的操作
一、实验目的
1. 熟悉图的存储结构;
2.熟悉图的创建操作;
3.熟悉图的遍历操作。
三、实验要求
1..每个同学必须独立完成;
2.程序中的开头部分必须对本程序的总体功能进行注释;程序中每个函数段必须要有注释说明该函数的功能或作用;
3.上机进行调试和修改并填写实验报告;
4.实验报告中的源程序必须调试通过。
5.在体会中描述如下内容:
(1)对算法与程序的区别上的体会。
(2)本次实验过程的体会,是否自己独立完成?最大的困难是什么?自己准备如何解决这个困难?
6.提交实验报告(报告中包含关键源代码)
实验内容
1、用邻接表结构实现如图所示无向图的存储;
2、在第1步骤基础上实现该无向图的深度优先遍历;输出遍历序列;
3、在第1步骤基础上实现该无向图的广度优先遍历;输出遍历序列;
参考代码:
#include "stdio.h"
#include "conio.h"
#define MaxVertexNum 100
#define MAXSIZE 100
typedef struct
{
int data[MAXSIZE];
int front;
int rear;
}SeqQueue;
typedef char VertexType;
typedef enum{FALSE,TRUE}Boolean;
Boolean visited[MaxVertexNum];
typedef char elemtype;
/*边结点*/
typedef struct node
{
int adjvex;/*邻接点域*/
struct node *nextedge;/*链域*/
}EdgeNode;
/*顶点表结点*/
typedef struct vnode
{
VertexType vertex; /*顶点域*/
EdgeNode *firstedge; /*边表头指针*/
}VertexNode;
typedef VertexNode AdjList[MaxVertexNum];/*AdjList是邻接表类型*/
/*
对于简单的应用,无须定义此类型,可直接使用AdjList类型
*/
typedef struct
{
AdjList adjlist;/*邻接表*/
int n,e; /*当前结点数和边数*/
int kind; /*图的种类标志*/
}ALGraph;
/*建立无向图的邻接表*/
void CreateALGraPh(ALGraph *G1)
{
int i,j,k;
EdgeNode *s;
/*读入顶点数和边数*/
printf("please input vertices: ");
scanf("%d",&G1->n);getchar();
printf("please input Vertex edge number: ");
scanf("%d",&G1->e);getchar();
/*建立顶点表*/
for(i=0;i<G1->n;i++)
{
printf("please input the %dth Vertex\n",i+1);
scanf("%c",&G1->adjlist[i].vertex);getchar(); /*读入顶点信息*/
G1->adjlist[i].firstedge=NULL; /*边表置为空表*/
}
printf("Please enter no to chart the relationship between vertices.the style is vi,vj\n\n ");
/*建立边表*/
for(k=0;k<G1->e;k++)
{
printf("the %dth is: ",k+1);
scanf("%d,%d",&i,&j); /*读入边(vi,vj)的顶点对序号*/
s=(EdgeNode *)malloc(sizeof(EdgeNode)); /*生成边表结点*/
s->adjvex=j;/*邻接点序号为j*/
s->nextedge=G1->adjlist[i].firstedge;
G1->adjlist[i].firstedge=s;/*将新结点*s插入顶点vi的边表头部*/
s=(EdgeNode *)malloc(sizeof(EdgeNode));
s->adjvex=i;/*邻接点序号为i*/
s->nextedge=G1->adjlist[j].firstedge;
G1->adjlist[j].firstedge=s; /*将新结点*s插入顶点vj的边表头部*/
}
}
/*邻接表表示的深度优先遍历*/
void DFS(ALGraph *G1,int i)
{
EdgeNode *p;
printf("%c ",G1->adjlist[i].vertex);/*访问顶点vi*/
visited[i]=TRUE;/*标记vi已访问*/
p=G1->adjlist[i].firstedge; /*取vi边表的头指针*/
while(p)
{
if(!visited[p->adjvex]) /*若vi尚未被访问,则以vj为出发点向纵深搜索*/
{
DFS(G1,p->adjvex);
}
p=p->nextedge;/*找vi的下一邻接点*/
}
}
/*邻接表表示的广度优先遍历*/
void BFS(ALGraph *G,int k)
{
int i;
SeqQueue *Q;
EdgeNode *p;
/*初始队列*/
Q=(SeqQueue *)malloc(sizeof(SeqQueue));
Q->front=Q->rear=0;
printf("%c ",G->adjlist[k].vertex);
visited[k]=TRUE;
/*入队*/
Q->data[Q->rear]=k;
Q->rear=(Q->rear+1)%MAXSIZE;
Q->rear++;
while(Q->rear)
{
i=Q->data[Q->front];
Q->front=(Q->front+1)%MAXSIZE;
Q->rear--;
p=G->adjlist[i].firstedge;
while(p)
{
if(!visited[p->adjvex])
{
printf("%c ",G->adjlist[p->adjvex].vertex);
visited[p->adjvex]=TRUE;
Q->data[Q->rear]=p->adjvex;
Q->rear=(Q->rear+1)%MAXSIZE;
Q->rear++;
}
p=p->nextedge;
}
}
}
executeBFS(ALGraph *G)
{
int i;
for(i=0;i<G->n;i++)/*将图G的所有顶点设置未访问过标记 */
visited[i]=FALSE;
for(i=0;i<G->n;i++)/*对图G调用bfs函数进行广度优先搜索*/
if(!visited[i])
BFS(G,i);
}
main()
{
ALGraph *G1;
int i;
CreateALGraPh(&G1);
printf("DFS\n");
DFS(&G1,0);
printf("\nBFS\n");
executeBFS(&G1);
getch();
}
分享到:
相关推荐
华工计科实验5,实现银行家算法,解决死锁,包含样例
一个能够完整运行出来的PV操作的实验报告,然后实验报告的结构也很完整,实验目的,实验过程,甚至实验的结果也有截图,如果有小伙伴需要,尽管下载哦
操作系统实验教程中实验五,关于shell脚本编程,实验部分程序
A.3实验三:熟悉常用的HBase操作 本实验对应第5章的内容。 A.3.1 实验目的 (1)理解HBase在Hadoop体系结构中的角色。(2)熟练使用HBase操作常用的 Shell命令。(3)熟悉HBase操作常用的 Java API。 A.3.2 实验平台 (1...
实验5:查看当前用户的所有表和视图 13 实验6:关于null值的问题 15 实验7:在列上起一个别名 15 实验8:在显示的时候去掉重复的行 16 实验9:显示表的部分行和部分列,使用where子句过滤出想要的行 18 实验10:使用...
一、实验目的 1、掌握图的存储方式 2、 掌握图的相关操作 二、实验内容 1、实现拓扑排序算法。
实验5HFISO14443A操作.pdf
包含实验内容:对应实验要求上的1/2/3/5实验,分别为setName/setNice,petree输出进程,模拟shell,进程通信,文件系统。包含全部实验源代码和详尽的word实验报告。同时包含在线PTA编程题目:进程模拟,模拟进程调度...
有实验源码和实验报告,附有实验算法流程图。实验一:进程控制、实验二:分页式存储管理、实验三:文件与磁盘管理、实验四:进程调度。实验报告包含实验目的、实验内容、数据结构、实现算法及流程图、运行截图。能够...
来自广东工业大学 UNIX 网络操作系统 实验 报告 一、 实验目的 1. 掌握UNIX系统的目录和文件管理命令。 2. 掌握shell的输入输出重定向操作符。 3. 编写shell脚本文件,并调试、执行它。 二、 实验要求 1. 要求每人...
存储管理实验·进程调度实验·文件管理实验·主存空间分配与回收·作业调度 其中包含5个操作系统实验,保证你的资源分不会白出。
计算机操作系统实验(5个详细实验),内包含5个实验,1.短进程优先 2.高响应比优先 2.先来先服务 3.内存分配 4.银行家算法 BUG较少,综合了网上的优秀代码,并进一步形成自己的代码。代码基本有注释,风格良好,能够...
使用信号量及P、V操作实现子进程之间通过共享内存通信的读写同步,如实验图5-1所示。要求如下: 生产者进程消费者进程A消费者进程B父进程sum 生产者进程 消费者进程A 消费者进程B 父进程 sum 实验图 5-1 请参考附件...
题目:实验六:熟悉Hive的基本操作 姓名:小猪猪 日期:2022/5/15 1、实验环境: 设备名称 LAPTOP-9KJS8HO6 处理器 Intel(R) Core(TM) i5-10300H CPU @ 2.50GHz 2.50 GHz 机带 RAM 16.0 GB (15.8 GB 可用) 主机操作...
实验5 外部中断实验 实现代码完整版
操作系统实验(含实验报告) 1、进程调度 2、作业调度 3、主存空间的分配与回收 4、文件系统 一、 实验目的 用高级语言编写和调试一个进程调度程序,以加深对进程的概念及进程调度算法的理解。 二、实验内容和要求...
5、对文件的操作设计提供一套文件操作: CREATE建立文件; DELETE删除文件; OPEN打开文件; CLOSE关闭文件; READ读文件; WRITE写文件。 6、二级目录结构如下图所示。 用户名 用户文件目录地址 主文件...
上海交通大学头歌实践教学平台操作系统Chcore实验二、三通关操作
林子雨大数据原理与技术第三版实验5实验报告 大数据技术与原理实验报告 MapReduce 初级编程实践 姓名: 实验环境: 操作系统:Linux(建议Ubuntu16.04); Hadoop版本:3.2.2; 实验内容与完成情况: (一)...
操作系统实验报告包含五个四个主要实验,linux操作系统基本命令使用及操作、C语言编程环境的使用、数据传送、存储管理等