栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

数据结构实验六 图的综合应用

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

数据结构实验六 图的综合应用

实验六  图的综合应用

一、实验目的

1.掌握图的基本操作—遍历;

2. 掌握图的应用。

二、实验内容

对给定的输入内容,完成实验任务

输入顶点集:1 2 3 4 5 6 7 8

输入边的集合: 1  2

1  3

2  4

2  5

4  8

5  8

3  6

3  7

6  7

(1)创建一个图(可用邻接矩阵或邻接表的方式进行存储);

(2)输入选项:0或1,0为DFS,1为BFS;

(3)分别输出DFS和BFS两种遍历序列。

三、实验要求

1. 程序要添加适当的注释,程序的书写要采用缩进格式。

2. 程序要具在一定的健壮性,即当输入数据非法时,程序也能适当地做出反应,如插入删除时指定的位置不对等等。

3. 程序要做到界面友好,在程序运行时用户可以根据相应的提示信息进行操作。

4. 实验课前完成实验内容源程序的初稿;实验课对源程序进行编辑、调试、运行;实验课后按规定时间上交实验内容。

5. 按照实验内容完成程序编写,并将源代码和运行结果截图粘贴到word文档中,A4正反打印,写清班级和姓名提交。

 代码部分

头文件与邻接矩阵、邻接表、辅助队列的定义

#include
#include
#include
#include
#define MaxInt 32767
#define MVNum 100
using namespace std;

typedef struct{
	int vexs[MVNum];//顶点表 
	int arcs[MVNum][MVNum];//邻接矩阵 
	int vexnum,arcnum;
}AMGraph;
 
typedef struct{
	int *base;
	int frone;
	int rear;
	int maxize;
}SqQueue;
 
typedef struct ArcNode{
	int adivex;
	struct ArcNode *nextarc;
}ArcNode;//指针p 
typedef struct VNode{
	int data;
	ArcNode * firstarc;
}Vnode,AdjList[MVNum];
typedef struct{
	AdjList vertices;
	int vexnum,arcnum;
}ALGraph;

菜单函数 

void menu1(){
	cout<<"<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>"<>>>>>>>>>>>>>>>"<>>>>>>>>>>>>>>>"<>>>>>>>>>>>>>>>"<>>>>>>>>>>>>>>>"< 

 邻接矩阵与邻接表的下标定位LocateVex函数

int LocateVex1(AMGraph &G,int v){
	for(int i=0;i<=G.vexnum;++i)
		if(v==G.vexs[i])
			return i;
	cout<<"未在图中找到编号为"< 

辅助队列所需使用的基本函数 

void InitQueue(SqQueue &Q,int n){
	Q.base=new int[n];
	Q.maxize=n;
	Q.frone=Q.rear=0;
}
void EnQueue(SqQueue &Q,int v){
	Q.base[Q.rear]=v;
	Q.rear=(Q.rear+1)%Q.maxize;
}
int DeQueue(SqQueue &Q){
	int x=Q.base[Q.frone];
	Q.frone=(Q.frone+1)%Q.maxize;
	return x;
}
int QueueEmpty(SqQueue &Q){
	if(Q.frone==Q.rear)	return 1;
	else return 0;
}
以邻接矩阵存储图 代码部分 

 创建邻接矩阵

 
 
void CreatUDNAM(AMGraph &G){
	int i,j,k,v1,v2;
	cout<<"|---请输入总顶点数与总边数!---|"<>G.vexnum>>G.arcnum;
	
	cout<<"|---------请输入顶点值!--------|"<>G.vexs[i];
	}
	for(i=0;i>v1>>v2;
		i=LocateVex1(G,v1);
		j=LocateVex1(G,v2);
		if(i==-1||j==-1){
			cout<<"|-----邻接矩阵中无"< 

输出邻接矩阵 

void putAMGragp(AMGraph G){
	int i,j;
	cout<<"   ";
	for(i=0;i 

DFS递归遍历邻接矩阵 

 
bool visitedDFS[MVNum];

void DFS_AM(AMGraph G,int v){
	cout< 

BFS遍历邻接矩阵 (需要使用辅助队列)

 
bool visitedBFS[MVNum];
  
void BFS_AM(AMGraph G,int v){//注意返回值 
	SqQueue Q;
	InitQueue(Q,G.vexnum);
	int i,w;
	cout< 
以邻接表存储图 代码部分 

创建邻接表 

 
void CreatUDNAL(ALGraph &g){
	int v1,v2,i,j;
	ArcNode *p1,*p2;

	cout<<"|---请输入总顶点数与总边数!---|"<>g.vexnum>>g.arcnum;//输入总点数与总边数 
	cout<<"|--------请输入顶点值!--------|"<>g.vertices[i].data;//输入点值 
		g.vertices[i].firstarc=NULL;//表头结点的指针域初始化为空 
	}
	cout<<"|--------请输入边的值!--------|"<>v1>>v2;//输入边的两个顶点 
		i=LocateVex2(g,v1);//定位i 
		j=LocateVex2(g,v2);//定位j 
		p1=new ArcNode;//生成边结点p1 
		p1->adivex=j;//p1的邻接点记为j 
		p1->nextarc=g.vertices[i].firstarc; 
		g.vertices[i].firstarc=p1;
		 
		p2=new ArcNode;//生成新的边结点p2 
		p2->adivex=i;//p2的邻接定记为i 
		p2->nextarc=g.vertices[j].firstarc;
		g.vertices[j].firstarc=p2;
		
	}	
	cout<<"|-----以邻接表建立图完成!-----|"< 

DFS递归遍历邻接表 

 
bool visitDFS[MVNum];

void DFS_AL(ALGraph g,int v){
	int w;
	cout<adivex;//找到v的下个点 
		if(visitDFS[w]!=true)//未被访问过的点 
			DFS_AL(g,w);//递归调用,深度遍历 
			p=p->nextarc;
	}
}

 BFS遍历邻接表

 
bool visitBFS[MVNum]; 

void BFS_AL(ALGraph &g,int v){
	SqQueue q;
	ArcNode *p;//指针指向邻接表 
	int w;
	InitQueue(q,g.vexnum);//创建队列 
	cout<adivex]!=true){//判断是否被遍历过 
				cout<adivex].data<<" ";//输出指针p指向的data 
				visitBFS[p->adivex]=true;//标记 
				EnQueue(q,p->adivex);//将指针p指向的值入队 
			}
			if(p->nextarc==NULL){//若为最后一个结点则跳出该循环 
				break;
			}
			else{
				p=p->nextarc;//不是最后一个结点则p指向下一个结点 
			}
		}

//		while(p){//当p的指向为空时候跳出循环 
//			if(visitBFS[p->adivex]!=true){
//				cout<adivex].data<<" ";
//				visitBFS[p->adivex]=true;
//				EnQueue(q,p->adivex);
//			}
//				p=p->nextarc;
//		}
	}
	cout< 

 输出邻接表

 
void printf_ALGraph(ALGraph &g){
	ArcNode *p;
	int flag=0;
	for(int i=0;i";
				cout<adivex].data;
				p=p->nextarc;
			}
			else{
				cout<<"《"<"<adivex].data;
				flag=1;
				p=p->nextarc;
			}	
		}
		flag=0;
		cout< 

主函数 

int main(){
	int choose,n,v=0;
A:	menu1();
	cout<<"请选择操作:";
	cin>>choose;
	if(choose==1){ 
	cout<<"|---图将以邻接矩阵进行存储!---|"<>n;
			switch(n){
				case 0:
					cout<<"该图的深度优先遍历结果为:"; 
					DFS_AM(G,v);
					cout<>n;
			switch(n){
				case 0:
					cout<<"该图的深度优先遍历结果为:"; 
					DFS_AL(g,v);
					cout< 
完整测试样例:
#include
#include
#include
#include
#define MaxInt 32767
#define MVNum 100
using namespace std;

typedef struct{
	int vexs[MVNum];//顶点表 
	int arcs[MVNum][MVNum];//邻接矩阵 
	int vexnum,arcnum;
}AMGraph;
 
typedef struct{
	int *base;
	int frone;
	int rear;
	int maxize;
}SqQueue;
 
typedef struct ArcNode{
	int adivex;
	struct ArcNode *nextarc;
}ArcNode;//指针p 
typedef struct VNode{
	int data;
	ArcNode * firstarc;
}Vnode,AdjList[MVNum];
typedef struct{
	AdjList vertices;
	int vexnum,arcnum;
}ALGraph;

 
int LocateVex1(AMGraph &G,int v){
	for(int i=0;i<=G.vexnum;++i)
		if(v==G.vexs[i])
			return i;
	cout<<"未在图中找到编号为"<>G.vexnum>>G.arcnum;
	
	cout<<"|---------请输入顶点值!--------|"<>G.vexs[i];
	}
	for(i=0;i>v1>>v2;
		i=LocateVex1(G,v1);
		j=LocateVex1(G,v2);
		if(i==-1||j==-1){
			cout<<"|-----邻接矩阵中无"<>>>>>>>>>>>>>>>"<>>>>>>>>>>>>>>>"<>>>>>>>>>>>>>>>"<>>>>>>>>>>>>>>>"<>>>>>>>>>>>>>>>"<>g.vexnum>>g.arcnum;//输入总点数与总边数 
	cout<<"|--------请输入顶点值!--------|"<>g.vertices[i].data;//输入点值 
		g.vertices[i].firstarc=NULL;//表头结点的指针域初始化为空 
	}
	cout<<"|--------请输入边的值!--------|"<>v1>>v2;//输入边的两个顶点 
		i=LocateVex2(g,v1);//定位i 
		j=LocateVex2(g,v2);//定位j 
		p1=new ArcNode;//生成边结点p1 
		p1->adivex=j;//p1的邻接点记为j 
		p1->nextarc=g.vertices[i].firstarc; 
		g.vertices[i].firstarc=p1;
		 
		p2=new ArcNode;//生成新的边结点p2 
		p2->adivex=i;//p2的邻接定记为i 
		p2->nextarc=g.vertices[j].firstarc;
		g.vertices[j].firstarc=p2;
		
	}	
	cout<<"|-----以邻接表建立图完成!-----|"<adivex;//找到v的下个点 
		if(visitDFS[w]!=true)//未被访问过的点 
			DFS_AL(g,w);//递归调用,深度遍历 
			p=p->nextarc;
	}
}
 
bool visitBFS[MVNum]; 

void BFS_AL(ALGraph &g,int v){
	SqQueue q;
	ArcNode *p;//指针指向邻接表 
	int w;
	InitQueue(q,g.vexnum);//创建队列 
	cout<adivex]!=true){//判断是否被遍历过 
				cout<adivex].data<<" ";//输出指针p指向的data 
				visitBFS[p->adivex]=true;//标记 
				EnQueue(q,p->adivex);//将指针p指向的值入队 
			}
			if(p->nextarc==NULL){//若为最后一个结点则跳出该循环 
				break;
			}
			else{
				p=p->nextarc;//不是最后一个结点则p指向下一个结点 
			}
		}

//		while(p){//当p的指向为空时候跳出循环 
//			if(visitBFS[p->adivex]!=true){
//				cout<adivex].data<<" ";
//				visitBFS[p->adivex]=true;
//				EnQueue(q,p->adivex);
//			}
//				p=p->nextarc;
//		}
	}
	cout<";
				cout<adivex].data;
				p=p->nextarc;
			}
			else{
				cout<<"《"<"<adivex].data;
				flag=1;
				p=p->nextarc;
			}	
		}
		flag=0;
		cout<>choose;
	if(choose==1){ 
	cout<<"|---图将以邻接矩阵进行存储!---|"<>n;
			switch(n){
				case 0:
					cout<<"该图的深度优先遍历结果为:"; 
					DFS_AM(G,v);
					cout<>n;
			switch(n){
				case 0:
					cout<<"该图的深度优先遍历结果为:"; 
					DFS_AL(g,v);
					cout< 
 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/938635.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号