数据结构上机实验8
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数据结构上机实验(八)图
班级:学号:姓名:
上机时间:地点:
一、实验目的
1.掌握图的各种存储结构,包括邻接矩阵和邻接表等。
2.掌握图的基本运算,包括创建图、输出图、深度优先遍历、广度优先遍历算
法等。
二、实验内容
1.实现图的相关运算,并在此基础上设计一个主程序完成如下功能:
(以P234图8.26所示的有向图G为例)
(1)建立如图8.26所示的有向图G的邻接矩阵并输出;
(2)由有向图G的邻接矩阵产生邻接表并输出;
(3)再由(2)的邻接表产生对应的邻接矩阵并输出。
2.实现图的遍历运算,并在此基础上设计一个主程序完成如下功能:
(以P234图8.26所示的有向图G为例)
(1)输出如图8.26所示的有向图G从顶点0开始的深度优先遍历序列(递归算法);
(2)输出如图8.26所示的有向图G从顶点0开始的深度优先遍历序列(非递归算法);
(3)输出如图8.26所示的有向图G从顶点0开始的广度优先遍历序列。
三、实验过程
1.了解常用函数所在的头文件
stdlib.h
stdlib 头文件里包含了C语言的一些函数
该文件包含了的C语言标准库函数的定义
stdlib.h里面定义了五种类型、一些宏和通用工具函数。类型例如size_t、wchar_t、div_t、ldiv_t和lldiv_t;宏例如EXIT_FAILURE、EXIT_SUCCESS、RAND_MAX 和MB_CUR_MAX等等;常用的函数如malloc()、calloc()、realloc()、free()、system()、atoi()、atol()、rand()、srand()、exit()等等。具体的内容你自己可以打开编译器的include目录里面的stdlib.h头文件看看。
conio.h
conio.h不是C标准库中的头文件。
conio是Console Input/Output(控制台输入输出)的简写,其中定义了通过控制台进行数据输入和数据输出的函数,主要是一些用户通过按键盘产生的对应操作,比如getch()函数等等。
&表示引用传递。在函数参数表中,出现带&这个的形参,表示引用传递。
2.程序实现(以下代码仅起参考作用)
(1)图的相关运算
#include
#include
#include "graph.h"
#define INF 32767 //INF表示∞
void MatToList(MGraph g,ALGraph *&G)
//将邻接矩阵g转换成邻接表G
{
int i,j,n=g.vexnum; //n为顶点数
ArcNode *p;
G=(ALGraph *)malloc(sizeof(ALGraph));
for (i=0;i
for (i=0;i for (j=n-1;j>=0;j--) if (g.edges[i][j]!=0) //邻接矩阵的当前元素不为0 { p=(ArcNode *)malloc(sizeof(ArcNode)); //创建一个结点*p p->adjvex=j; p->info=g.edges[i][j]; p->nextarc=G->adjlist[i].firstarc; //将*p链到链表后 G->adjlist[i].firstarc=p; } G->n=n;G->e=g.arcnum; } void ListToMat(ALGraph *G,MGraph &g) //将邻接表G转换成邻接矩阵g { int i,j,n=G->n; ArcNode *p; for (i=0;i for (j=0;j g.edges[i][j]=0; for (i=0;i { p=G->adjlist[i].firstarc; while (p!=NULL) { g.edges[i][p->adjvex]=p->info; p=p->nextarc; } } g.vexnum=n;g.arcnum=G->e; } void DispMat(MGraph g) //输出邻接矩阵g { int i,j; for (i=0;i { for (j=0;j if (g.edges[i][j]==INF) printf("%3s","∞"); else printf("%3d",g.edges[i][j]); printf("\n"); } } void DispAdj(ALGraph *G) //输出邻接表G { int i; ArcNode *p; for (i=0;i { p=G->adjlist[i].firstarc; if (p!=NULL) printf("%3d: ",i); while (p!=NULL) { printf("%3d",p->adjvex); p=p->nextarc; } printf("\n"); } } void main() { int i,j; MGraph g,g1; ALGraph *G; int A[MAXV][6]={ {0,5,0,7,0,0}, {0,0,4,0,0,0}, {8,0,0,0,0,9}, {0,0,5,0,0,6}, {0,0,0,5,0,0}, {3,0,0,0,1,0}};