图的遍历
1.需求分析
【实验目的】
很多涉及图上操作的算法都是以图的遍历操作为基础的,通过这个实验的算法设计,可以巩固所学的有关图的基本知识。
【基本要求】
以邻接表为存储结构,实现连通无向图的深度优先和广度优先遍历。以用户指定的结点为起点,分别输出每种遍历下的结点访问序列。
2.算法设计
1)为了实现上述程序功能,需要定义单链表的抽象数据类型:
定义边结点 ArcNode
数据成员 int adjvex;
struct ArcNode *nextarc;
定义顶点信息 VNode
数据成员 VertexType data;
ArcNode *firstarc;
定义无向图 typedef struct
数据成员 AdjList vertices;
int vexnum,arcnum;
定义链表 typedef struct LNode
数据成员 ElemType data;
struct LNode *next;
定义头结点 typedef struct QNode
数据成员 QElemType data;
struct QNode *next;
定义队列 typedef struct
数据成员 QueuePtr front;
QueuePtr rear;
2)本程序用到的主要函数:
InitQueue(LinkQueue &Q) //初始化队
EnQueue(LinkQueue &Q,QElemType e) //入队
DeQueue(LinkQueue &Q,QElemType &e) //出队
LocateVex(ALGraph G,char v) //确定v在G中的位置
CreateDG(ALGraph &G) //创建无向连通图的邻接表结构
FirstAdjvex(ALGraph G,int v) //返回G中顶点v的第一个邻接点
NextAdjVex(ALGraph G,int v,int w) //返回G中顶点v相对于w的下一个邻接点
BFSTraverse(ALGraph G) //进行深度优先遍历
DFS(ALGraph G,int v,int *visited)
DFSTraverse(ALGraph G) //进行广度优先遍历3.调试分析
刚开始输入的是abcdef可是遍历出来的是123456的数字,后来将入前的出输改写成G.vertices[w].data形式就可以了。
4.经验收获和体会
每次都要写这个,我都不知写什么好了呵呵,嗯总体来说还是那句话程序要自已编出来的才叫好。无论编得怎么样总会学到东西的,编写的同时也可以复习以前的知识这样很好。
5.测试数据及结果
6.附录
#include"iostream.h"
#include"stdlib.h"
typedef char VertexType;
typedef int QElemType;
typedef int ElemType;
typedef int Status;
#define MAX 20
#define ok 1
bool visit[MAX];
typedef struct ArcNode //定义边结点
{
int adjvex;
struct ArcNode *nextarc;
}ArcNode;
typedef struct VNode //定义顶点信息
{
VertexType data;
ArcNode *firstarc;
}VNode,AdjList[MAX];
typedef struct //定义无向图
{
AdjList vertices;
int vexnum,arcnum;
}ALGraph;
typedef struct LNode //定义链表
{
ElemType data;
struct LNode *next;
}LNode,*LinkList;
typedef struct QNode //定义头结点
{
QElemType data;
struct QNode *next;
}QNode,*QueuePtr;
typedef struct //定义队列
{
QueuePtr front;
QueuePtr rear;
}LinkQueue;
Status InitQueue(LinkQueue &Q) //初始化队
{
Q.front=new QNode;
if(!Q.front)exit(-
1);
Q.front->next=NULL;
Q.rear=Q.front;
return ok;
}
Status EnQueue(LinkQueue &Q,QElemType e) //入队
{
QueuePtr p;
p=new QNode;
if(!p)exit(-
1);
p->data=e;
p->next=NULL;
Q.rear->next=p;
Q.rear=p;
return ok;
}
Status DeQueue(LinkQueue &Q,QElemType &e) //出队
{
if(Q.front==Q.rear)return false;
QueuePtr p;
p=Q.front->next;
Q.front->next=p->next;
e=p->data;
if(Q.rear==p)Q.rear=Q.front;
delete p;
return ok;
}
int LocateVex(ALGraph G,char v) //确定v在G中的位置
{
for(int i=0;i<G.vexnum;i++)
if(G.vertices[i].data==v)
return i;
if(i==G.vexnum)
{
cout<<"你的输入有错请重新输入"<<endl;
return -1;
}
return 0;
}
void CreateDG(ALGraph &G) //创建无向连通图的邻接表结构
{
cout<<"请输入图的结点数:"<<endl;
cin>>G.vexnum;
cout<<"请输入图的边数:"<<endl;
cin>>G.arcnum;
for(int i=0;i<G.vexnum;i++) //构造表头向量
{
cout<<"请输入第"<<i+1<<"个结点的信息"<<endl;
cin>>G.vertices[i].data;
G.vertices[i].firstarc=NULL; //初始化头结点
} for(int k=0;k<G.arcnum;k++) //输入各边并构造邻接表
{
cout<<"请输入第"<<k+1<<"条边所对应的的两个结点"<<endl;
e: int s=LocateVex(G,v
1); //确定v1在G中的位置
int t=LocateVex(G,v
2); //确定v2在G中的位置
if(s<0||t<0)
goto e;
ArcNode *p=new ArcNode;
p->adjvex=t;
ArcNode *q=G.vertices[s].firstarc; //采用头插法插入链表
G.vertices[s].firstarc=p;
p->nextarc=q; //因为是无向图,每条边对应两个结点
s=LocateVex(G,v
2);
t=LocateVex(G,v
1);
p=new ArcNode;
p->adjvex=t;
q=G.vertices[s].firstarc;
G.vertices[s].firstarc=p;
p->nextarc=q;
}
}
void BFSTraverse(ALGraph G) //进行广度优先遍历
{
int v,w,u;
int visited[MAX];
LinkQueue Q;
for(v=0;v<G.vexnum;++v)
visited[v]=0;
InitQueue(Q);
for(v=0;v<G.vexnum;++v)
if(visited[v]==0)
{
visited[v]=1;
cout<<G.vertices[v].data<<" ";
EnQueue(Q,v);
while(!(Q.rear==Q.front))
{
DeQueue(Q,u);
for(w=G.vertices[u].data;
G.vertices[u].firstarc!=NULL;
w=G.vertices[u].firstarc->adjvex,
G.vertices[u].firstarc=G.vertices[u].firstarc->nextarc)
if(visited[w]==0)
{
visited[w]=1;
cout<<G.vertices[w].data<<" ";
EnQueue(Q,w);
}
}
}
}
void DFS(ALGraph G,int v,int *visited)
{
int w;
visited[v]=1;
cout<<G.vertices[v].data<<" ";
for(w=G.vertices[v].data;
G.vertices[v].firstarc!=NULL;
w=G.vertices[v].firstarc->adjvex,
G.vertices[v].firstarc=G.vertices[v].firstarc->nextarc)
if(visited[w]==0)
DFS(G,w,visited);
}
void DFSTraverse(ALGraph G) //进行深度优先遍历
{
int v;
int visited[MAX];
for(v=0;v<G.vexnum;++v)
visited[v]=0;
for(v=0;v<G.vexnum;++v)
if(visited[v]==0)
DFS(G,v,visited);
}
int main()//主函数
{
ALGraph G;
CreateDG(G);
cout<<"深度优先遍历序列:";
DFSTraverse(G);
cout<<endl;
cout<<"广度优先遍历序列:";
BFSTraverse(G);
cout<<endl;
return 0;
播音主持在职业教育中的问题及对策一引言播音主持专业人才的创新培养需要建立在与社会人才需要基础之上,实现与社会要求相符合的主要发展目标。如果我们高校培养出来的播音主持专业人才没能适销对路,没能适应社会发展的需求,没
高职教育课程教学改革高等职业教育不同于普通高等教育和其他教育类型,高等职业教育培养的是技术技能型的应用型人才,这有别于普通高等教育培养研究型工程型的人才。高等职业教育培养目标的独特性决定了其课程开发思
舞蹈教学中钢琴伴奏的作用在舞蹈课堂的实际教学中,音乐的作用至关重要。通过音乐伴奏,学生能够更好的领悟每一个舞蹈动作的内在节奏,也能够从不同风格的音乐旋律中体会不同舞蹈所蕴含的思想感情。目前而言,部分教师并
综合实践活动课的教学设计与实践摘要综合实践活动课是面向生活,培养学生综合能力的课程。其课程资源来于学生生活,课题的开发以学生兴趣和内在需要为基础。在综合实践的活动过程中,教师要以生为本,为学生创设认识世界关注生
现代学徒制模式中师徒之间默会知识的传递研究摘要相对于显性知识来说,默会知识也属于一种非常重要的知识。默会知识很容易被我们忽视,但它在我们日常工作与生活中发挥的作用却是不可忽略的。默会知识的传递是现代知识传递领域研究的重要内
高职院校酒店管理专业艺术素质教育的研究与实践摘要在旅游业已然成为当今世界最具发展活力和潜力的第一大产业,占到全球GDP的9全球就业率的10的国际大背景下,我国已经明确了ldquo建设世界旅游强国rdquo的战略目标,并将其上
高职教育经管类专业人才培养优化研究摘要要实现ldquo中部崛起rdquo,必须提升人力资源竞争力,而提升人力资源竞争力首先应该提高一线劳动者素质,高职院校中,只有创新经管类专业人才培养模式才能完成此重任。因此,优化
环境影响评价课程教学探讨摘要环境影响评价课程是高职高专院校环境监测与治理技术专业的专业主干必修课程之一,本文针对高职环境监测与治理技术专业的学生,主要从课程的教学内容教学方法与手段和课程考核等几个方面对环
高职院校专业群课程体系的构建摘要课程体系的构建是高职院校专业群建设的重点。论文以会计与金融服务专业群为例,阐述基于ldquo底层共享中层分立高层互选rdquo的课程体系的构建导向与建设内容。关键词高职专业群课
职业院校搭建产学研平台实现协同创新研究摘要职业教育的目的是培养应用人才和具有一定文化水平和专业知识技能的劳动者,与普通教育和成人教育相比较,职业教育侧重于实践技能和实际工作能力的培养。天津的职业教育起步较早,近年来发展
工学结合模式下中职国际贸易实务课程教学改革探讨摘要国际贸易实务作为中职学校商贸类专业的核心课程,是基于外贸业务流程工学交替紧密结合的ldquo教学做一体化rdquo的课程,重点是培养学生对实际业务的操作能力,这门课程开发的质量
经济管理现代化及经济管理发展趋势的论文一前言经济发展的进程的加快,现代化的经济管理模式也要于之相匹配,并且要以更加现代化为目标创新管理模式,以适应我国经济发展的速度。现代化管理模式不但要借鉴西方国家先进的管理模式,还要
日本文化产业的特点的论文摘要日本的文化产业的发展处于世界前列,文化产业的发展与国家文化软实力息息相关,并且与其历史背景与发展情况密不可分。本文通过对日本文化产业的发展情况进行阐述和分析,从五个方面总结了日
教学公共心理学论文1教师对公共心理学现状的认识本文对4名担课教师(2名工作3年以上的老教师,2名工作3年以内的新教师)进行了无结构访谈,来了解公共心理学的存在问题。教师集中反映的问题主要有以下两点1
公路桥梁的安全性设计研讨论文随着我国市场经济体制的不断发展与完善,我国与世界的联系越来越紧密,尤其是我国加入了世界经济贸易组织以来,随着我国经济的不断发展,人民生活水平得到了提高,家庭私有轿车的数量逐年增加。
纪念性主题公园景观规划设计初探以内蒙古多伦县为例论文摘要纪念性主题公园是人们为表达纪念情感而建设的一种园林景观形式,其整体布局规划有自身的特点与构成方式。本文旨在探讨纪念性主题公园景观的规划设计原则,不仅布局要依据景观规划的相关准则
关于让孩子说我能行的小学语文论文我们班有一个孩子理解能力差,反映慢学习比较落后,学习态度较差,经常出现赖作业的现象课上不会听讲,经常走神儿。优点爱劳动,比较关心班级。父母离异,跟着母亲生活,母亲知识水平较低,没有
校园文化平台建设论文校园文化建设是学校教育不可缺少的重要组成部分,是学校所具有的特定的精神环境和文化氛围,它体现了一所学校的校风。健康和谐的校园文化能给师生创造一个有形而庄重的心理磁场,能在无形中统摄
云计算网络教学平台设计与实现论文摘要云计算的出现在极大程度上降低了个人计算机性能,放大了个人计算机的功能,以新的分配方式将资源进行重组,更好地满足现代网络教学管理所提出的需要。文章就云计算框架下的网络教学平台的设
关于省级政务服务网上平台的设计与实现论文一引言经过多年的电子政务建设,围绕行政审批和政务服务,各级政府和部门建设了大量相对独立的业务系统,在有效实现各自业务目标的同时,也造成了信息孤岛,信息资源缺乏共享,部门间的业务协同
基于校园网的网络教学平台架构设计和实现论文1概述网络平台教学的必要性表1将传统教学模式与网络教学模式进行比较表1教学模式比较教学时间性和地域性学习人数学习内容学习主体教学进度控制知识获取途径传统教学方式同时同地受教室容量而
高校社会体育人才培养研究的论文1引言大学社会体育发展人才培养是传统的认知教育,而拓展训练是一种体验性教学为主要内容和活动的参考。它更新于传统的教学设计内容的具体教学情境,让学生参与户外活动,以多种户外活动形式通