数据结构 实验六 图基本操作的编程实现
【实验目的】
图基本操作的编程实现
要求:
图基本操作的编程实现(2学时,验证型),掌握图的建立、遍历、插入、删除等基本操作的编程实现,存储结构可以在顺序结构、链接结构、联合使用多种结构等中任选,也可以全部实现。也鼓励学生利用基本操作进行一些应用的程序设计。
【实验性质】
验证性实验(学时数:2H)
【实验内容】
编程对图进行存储(邻接矩阵或邻接表都可以,由学生自由选择),之后可以询问任何两个结点之间是否有通路和路径数。
设计一个将图形转成邻接链表的程序。
设计一个深度优先搜索法来查找图形的程序。
设计一个广度优先搜索法来查找一个图形的程序。
鼓励开发出难度更高的程序。
【注意事项】
1.开发语言:使用C。
2.可以自己增加其他功能。
【实验分析、说明过程】
【深度遍历】 深度遍历程序主要是利用了栈的先进后出的思想,回溯,递归的思想,而广度遍历主要是利用了队列的思想,先进先出。 1先从开始指定的结点进行访问,然后标记位它为一,(代表他已经被访问过) 2然后取他的第一个邻接点。 3然后进入循环,循环条件为邻接点不为空,如果这个邻接结点,没有被标记,则执行语句递归,再次执行该函数,然后再继续寻找该点的邻接结点,依次进行下去,最后直到递归返回到第一层,结束程序。 【广度遍历】 1.从某个结点开始,把这个结点入队,然后设置标志为1. 2.执行循环体里面的内容,条件为队列不为空,循环体,先将队列出队,然后查找这个点是否具有邻接点,如果有结点先判断这个邻接点是否时被标记过的,如果没被标记,就先访问这个结点,设置标志位为1,然后入队。 3.反复进行2步骤,直到队列为空。 |
【思考问题】
定义和特性:图 (Graph) 是由若干给定的顶点及连接两顶点的边所构成的图形,这种图形通常用来描述某些事物之间的某种特定关系。顶点用于代表事物,连接两顶点的边则用于表示两个事物间具有这种关系。
答:存储结构主要是邻接矩阵和邻接表。不是独立的。
广度优先搜索思想:从图中某顶点v出发,在访问了v之后依次访问v的各个未曾访问过的邻接点,然后分别从这些邻接点出发依次访问它们的邻接点,并使得“先被访问的顶点的邻接点先于后被访问的顶点的邻接点被访问,直至图中所有已被访问的顶点的邻接点都被访问到。如果此时图中尚有顶点未被访问,则需要另选一个未曾被访问过的顶点作为新的起始点,重复上述过程,直至图中所有顶点都被访问到为止。 深度优先搜索思想:假设初始状态是图中所有顶点均未被访问,则从某个顶点v出发,首先访问该顶点,然后依次从它的各个未被访问的邻接点出发深度优先搜索遍历图,直至图中所有和v有路径相通的顶点都被访问到。若此时尚有其他顶点未被访问到,则另选一个未被访问的顶点作起始点,重复上述过程,直至图中所有顶点都被访问到为止。
答:道路畅通工程和最短路径 |
【实验小结】 (总结本次实验的重难点及心得、体会、收获)
对于这次的实验,由于图的思想还是不能很好的理解,在图的遍历的时候,主要有利用邻接矩阵为存储结构,但是对于它的遍历的思路还不是十分的清晰,有时还会混淆,在自己做完实验以后,又继续对代码进行研究,还有遍历的思路进行整理,一遍一遍的画图,对照着程序画图,将它遍历的思想深深地理解,现可以利用图进行编写程序,也有了那些思想,现在编写那些程序觉得比以前好了不少,最起码思路有了一个很大的跃升,编写代码顺着思路及可以了,虽然还是有不少的漏洞。 |
【附录-实验代码】
#include<stdio.h> #include<conio.h> #include <stdlib.h> #define vertexnum 100 //定义最大可输入的结点个数 typedef struct node //定义图形的顶点结构 { int vertex; //图中的顶点信息为数字 struct node *next; }Graph; Graph head[vertexnum]; //邻接表的表头结点 int Visited[vertexnum]; //遍历记录 void Create_l_Graph(int Vertex1,int Vertex2,int no) { //以邻接链表建立图形 Graph *searchP; //结点声明 Graph *New; //新结点声明 New=(Graph *)malloc(sizeof(struct node)); if (New!= NULL ) { New->vertex=Vertex2; New->next=NULL; searchP=&(head[Vertex1]); while(searchP->next!=NULL) searchP=searchP->next; searchP->next =New; if(no==0) { New=(Graph *)malloc(sizeof(struct node)); New->vertex=Vertex1; New->next=NULL; searchP=&(head[Vertex2]); while(searchP->next!=NULL) searchP=searchP->next; searchP->next =New; } } } void showmenu() { //显示菜单 printf(" 欢迎使用图的操作演示软件\n"); printf("\t1、创建图的邻接表\n"); printf("\t2、图的输出\n"); printf("\t3、图的深度优先遍历\n"); printf("\t4、退出程序\n"); } void print_l_graph(Graph *head) { //输出邻接链表的数据 Graph *searchP; searchP=head->next; while(searchP!=NULL) { printf("%d",searchP->vertex); searchP=searchP->next; } printf("\n"); } void DFS(int vertex) { //深度优先遍历 Graph *SearchP; //结点声明 //标记某个结点已遍历过 printf("[%d]==>",vertex); SearchP=head[vertex].next; while(SearchP!=NULL) { if(!Visited[SearchP->vertex]) //判断结点未被遍历过 DFS(SearchP->vertex); //递归调用深度优先遍历函数 SearchP=SearchP->next; //下一个邻接点 } } void main() { int source; //图中一条边的起始顶点 int destination; //图中一条边的终止顶点 int i,j; int vermax; //定义图中最大的顶点数 int edgemax; //定义图中最大的边数 int choice; int no; while(1) { showmenu(); printf(" 请输入你的选择:"); scanf("%d",&choice); fflush(stdin);//清除键盘缓冲区 switch(choice) { case 1:printf("请输入图的类别(有向图-1,无向图-0):"); scanf("%d",&no); printf("请输入图中的总顶点数和边数:"); scanf("%d%d",&vermax,&edgemax); for(i=1;i<vermax;i++) { head[i].vertex = i; head[i].next = NULL; } for(i=1;i<=edgemax;i++) { printf("请输入第%d条边的起点:",i); scanf("%d",&source); printf("请输入第%d条边的终点:",i); scanf("%d",&destination); if(source==destination) printf("输入有误!\n");//出错:自身循环 else //调用建立邻接链表 Create_l_Graph(source,destination,no); } printf("图创建成功,按任意键继续…\n"); getch(); system("cls"); break; case 2:printf("图的邻接表如下:\n"); for(i=1;i<=vermax;i++) { printf("顶点[%d]:",i); print_l_graph(&head[i]);//调用输出邻接链表数据 } printf("\n"); system("pause"); system("cls"); break; case 3:for(i=1;i<=vermax;i++) Visited[i]=0; printf("请输入遍历的起点:"); scanf("%d",&source); printf("图的深度优先遍历结果为:\n"); DFS(source); printf("END\n"); system("pause"); system("cls"); break; case 4:return; default: printf("你的输入有误,请从新输入!\n"); system("pause"); system("cls"); } } } |
数据结构 实验六 图基本操作的编程实现相关推荐
- 数据结构实验六 图的操作实现
数据结构实验六 图的操作实现 一.实验目的 1. 理解图的存储结构与基本操作: 2. 掌握图的创建过程 二.实验内容 1.根据下图,采用邻接矩阵的存储结构保存此图,并打印出邻接矩阵. 图的创建代码参考 ...
- 数据结构实验六 图的综合应用
实验六 图的综合应用 一.实验目的 1.掌握图的基本操作-遍历: 2. 掌握图的应用. 二.实验内容 对给定的输入内容,完成实验任务 输入顶点集:1 2 3 4 5 6 7 8 输入边的集合: 1 ...
- 数据结构实验三 图的操作与实现
系列文章: 数据结构实验一 线性表.堆栈和队列的操作与实现 数据结构实验二 二叉树的操作与实现 数据结构实验三 图的操作与实现 数据结构实验四 查找和排序算法实现 一.实验目的: 1.领会图的两种主要 ...
- 数据结构实验八 图及其应用
数据结构实验八 图及其应用 实验内容 1.编写一个程序,完成如下功能: (1) 建立如下有向图G1的邻接矩阵输出,并由邻接矩阵产生邻接表输出之: (2) 输出图G1从顶点0开始的深度优先遍历序列: ( ...
- Oracle 实验六:PL/SQL编程基础(1)
实验六:PL/SQL编程基础(1) 一.实验目的 1.熟悉掌握PL/SQL编程中的变量定义语句 2.熟悉掌握PL/SQL编程中的条件语句和循环语句等流程控制语句. 3.能熟练使用上述基本语句编写PL/ ...
- 实验六 图的遍历操作及应用
实验六 图的遍历操作及应用 一.实验实习目的及要求 掌握有向图和无向图的概念:掌握邻接矩阵和邻接链表建立图的存储结构:掌握DFS及BFS对图的遍历操作:了解图结构在人工智能.工程等领域的广泛应用. 二 ...
- 数据结构实验 二叉树的基本操作
数据结构实验 二叉树的基本操作 实验环境: Visual C++ 实验目的: 1.掌握二叉树的定义: 2.掌握二叉树的基本操作,如二叉树的建立.遍历.结点个数统计.树的深 度计算等. 实验内容: 用递 ...
- 数据结构实验六 综合数据处理
广州大学学生实验报告 开课实验室:计算机科学与工程实验(电子楼416A) 2019年6月14日 学院 计算机科学与教育软件学院 年级.专业.班 计算机大类 144班 姓名 学号 实验课程名称 ...
- 数据结构 实验七 排序技术的编程实现
实验七 排序技术的编程实现 [实验目的] 排序技术的编程实现 要求: 排序技术的编程实现(2学时,综合型),掌握排序技术的编程实现,可以实现一种,也可以实现多种.也鼓励学生利用基本操作进行一些应用的 ...
最新文章
- 初创公司面试要问什么_聘请初创公司的产品设计师时要问的问题
- GET请求中URL的最大长度限制总结
- PYTHON——多线程:队列Queue数据结构
- 一起来看流星雨剧情简介/剧情介绍/剧情分集介绍第六集
- 如何让一个用户拥有root权限
- java 文本词频统计_Java实现中文词频统计
- 栈 -- 4.1.1 Valid Parentheses I-II -- 图解
- [置顶] 63行代码完美实现html5 贪吃蛇游戏
- Linux 如何安装*.bin的文件 ,例如刚刚下载了一个(AdbeRdr9.4.2-1_i486linux_enu.bin)的文件
- 实验10. Hadoop环境搭建
- php中文歌词,pr怎么导入歌词字幕
- 《DSP:matlab释义与实现》学习笔记|freqz()函数详解
- 阿里巴巴icon font导入CSS
- 三星在中国一面撤资,一面增资是为何?
- pcf8563c语言程序,PCF8563T标准驱动源程序
- 初识机器阅读理解(Machine Reading Comprehension)
- 语言信号处理 总复习 第三讲 *秋昊
- hadoop命令无法创建目录
- 电脑双屏变单屏后,界面显示问题
- Linux工具学习之【git】