图的基本操作数据实验报告书.docx
- 文档编号:9354852
- 上传时间:2023-02-04
- 格式:DOCX
- 页数:18
- 大小:60.54KB
图的基本操作数据实验报告书.docx
《图的基本操作数据实验报告书.docx》由会员分享,可在线阅读,更多相关《图的基本操作数据实验报告书.docx(18页珍藏版)》请在冰豆网上搜索。
图的基本操作数据实验报告书
《数据结构》
实
验
报
告
书
实验内容:
图的基本操作
2011008141**
计科111**
前言
计算机编程中加工处理的对象是数据,而数据具有一定的组织结构,所以学习计算机编程仅仅了解计算机语言是不够的,还必须掌握数据的组织、存储和运算的一般方法,这便是数据结构课程中所研究的内容,也是我们编写计算机程序的重要基础,由于它对计算机学科起到承前启后的作用,因此本课程被列为计算机等相关专业最重要的专业基础课;同时数据结构是计算机专业教学的一门核心课程。
计算机各领域都要用到各种数据结构,而且要从事计算机科学与技术工作,尤其是计算机领域的软件开发工作,必须具备较强的数据结构基础。
数据结构课程内容丰富、学习量大,实践性强;隐含在各部分内容中的方法和技术多;算法设计具有动态性和抽象性等特点,看懂听明白与掌握会应用之间有相当大的一段距离。
所以学生必须多实践才能进一步加深对课程的理解,理解和掌握算法设计所需的方法和技术,为整个专业学习打下良好的基础。
一、实验目的
1、使学生可以巩固所学的有关图的基本知识。
2、熟练掌握图的存储结构。
3、熟练掌握图的两种遍历算法。
二、实验内容
[问题描述]
对给定图,实现图的深度优先遍历和广度优先遍历。
[基本要求]
以邻接表为存储结构,实现连通无向图的深度优先和广度优先遍历。
以用户指定的结点为起点,分别输出每种遍历下的结点访问序列。
【测试数据】
由学生依据软件工程的测试技术自己确定。
三、实验前的准备工作
1、掌握图的相关概念。
2、掌握图的逻辑结构和存储结构。
3、掌握图的两种遍历算法的实现。
四、实验报告要求
1、实验报告要按照实验报告格式规范书写。
2、实验上要写出多批测试数据的运行结果。
3、结合运行结果,对程序进行分析。
3、算法设计
1、程序所需头文件已经预处理宏定义和结构体定义如下
#include
#defineMaxVerNum100
structedgenode
{
intendver;
intinform;
edgenode*edgenext;
};
structvexnode
{
charvertex;
edgenode*edgelink;
};
structGraph
{
vexnodeadjlists[MaxVerNum];
intvexnum;
intarcnum;
};
2、队列的定义及相关函数的实现
structQueueNode
{
intnData;
QueueNode*next;
};
structQueueList
{
QueueNode*front;
QueueNode*rear;
};
voidEnQueue(QueueList*Q,inte)
{
QueueNode*q=newQueueNode;
q->nData=e;
q->next=NULL;
if(Q==NULL)
return;
if(Q->rear==NULL)
Q->front=Q->rear=q;
else
{
Q->rear->next=q;
Q->rear=Q->rear->next;
}
}
voidDeQueue(QueueList*Q,int*e)
{
if(Q==NULL)
return;
if(Q->front==Q->rear)
{
*e=Q->front->nData;
Q->front=Q->rear=NULL;
}
else
{
*e=Q->front->nData;
Q->front=Q->front->next;
}
}
3、创建无向图
voidCreatAdjList(Graph*G)
{
inti,j,k;
edgenode*p1;
edgenode*p2;
cout<<"请输入顶点数和边数:
"< cin>>G->vexnum>>G->arcnum; cout<<"开始输入顶点表: "< for(i=0;i { cin>>G->adjlists[i].vertex; G->adjlists[i].edgelink=NULL; } cout<<"开始输入边表信息: "< for(k=0;k { cout<<"请输入边 "; cin>>i>>j; p1=newedgenode; p1->endver=j; p1->edgenext=G->adjlists[i].edgelink; G->adjlists[i].edgelink=p1; p2=newedgenode; p2->endver=i; p2->edgenext=G->adjlists[j].edgelink; G->adjlists[j].edgelink=p2; //因为是无向图,所以有两次建立边表的过程 } } 4、深度优先遍历 voidDFS(Graph*G,inti,intvisit[]) { cout< visit[i]=1; edgenode*p=newedgenode; p=G->adjlists[i].edgelink; if(G->adjlists[i].edgelink&&! visit[p->endver]) { DFS(G,p->endver,visit); } } voidDFStraversal(Graph*G,charc)//深度优先遍历 { cout<<"该图的深度优先遍历结果为: "< intvisit[MaxVerNum]; for(inti=0;i { visit[i]=0;//全部初始化为0,即未访问状态 } intm; for(i=0;i { if(G->adjlists[i].vertex==c)//根据字符查找序号 { m=i; DFS(G,i,visit); break; } } //继续访问未被访问的结点 for(i=0;i { if(visit[i]==0) DFS(G,i,visit); } cout< } 5、广度优先遍历 voidBFS(Graph*G,intv,intvisit[]) { QueueList*Q=newQueueList; Q->front=Q->rear=NULL; EnQueue(Q,v); while(Q->rear! =NULL) { inte=0; DeQueue(Q,&e); cout< visit[e]=1; edgenode*p=newedgenode; p=G->adjlists[e].edgelink; if(p) { intm=p->endver; if(m==0) { EnQueue(Q,m); while(visit[m]==0) { p=p->edgenext; if(p==NULL) break; m=p->endver; EnQueue(Q,m); } } } } } voidBFStraversal(Graph*G,charc) { cout<<"该图的广度优先遍历结果为: "< intvisited[MaxVerNum]; for(inti=0;i { visited[i]=0; } intm; for(i=0;i { if(G->adjlists[i].vertex==c) { m=i; BFS(G,i,visited); break; } } //继续访问未被访问的结点 for(i=0;i { if(visited[i]==0) BFS(G,i,visited); } cout< } 4、调试与测试 我们开始测试数据,如图: 由图可知,我们得出了结果。 五、总结 通过做这次实验,发现自己在数据结构这门课中还有很多不足有很多知识还没掌握,所以在写程序的时候出现了很多的错误,及还有很多的知识不以灵活运用。 因为以前C语言没有掌握好,所以这次做本次实验还是有点吃力,刚开始完全没有思,后来经过查找资料,在自己的努力下和同学的帮助下,终于完了本次实验。 还要注意输入的问题,什么时候用空格,什么时候用回车,这一点是需要注意的,因为一旦数据的输入有问题,结果当然也就不可能正确了。 只有正确的输入数据,建立图,才能得出正确的遍历结果。 此次实验发现的自己的不足,我相信在以后的学习中,我会更加的努力。 六、源代码 #include #defineMaxVerNum100 structedgenode { intendver; intinform; edgenode*edgenext; }; structvexnode { charvertex; edgenode*edgelink; }; structGraph { vexnodeadjlists[MaxVerNum]; intvexnum; intarcnum; }; //队列的定义及相关函数的实现 structQueueNode { intnData; QueueNode*next; }; structQueueList { QueueNode*front; QueueNode*rear; }; voidEnQueue(QueueList*Q,inte) { QueueNode*q=newQueueNode; q->nData=e; q->next=NULL; if(Q==NULL) return; if(Q->rear==NULL) Q->front=Q->rear=q; else { Q->rear->next=q; Q->rear=Q->rear->next; } } voidDeQueue(QueueList*Q,int*e) { if(Q==NULL) return; if(Q->front==Q->rear) { *e=Q->front->nData; Q->front=Q->rear=NULL; } else { *e=Q->front->nData; Q->front=Q->front->next; } } //创建图 voidCreatAdjList(Graph*G) { inti,j,k; edgenode*p1; edgenode*p2; cout<<"请输入顶点数和边数: "< cin>>G->vexnum>>G->arcnum; cout<<"开始输入顶点表: "< for(i=0;i { cin>>G->adjlists[i].vertex; G->adjlists[i].edgelink=NULL; } cout<<"开始输入边表信息: "< for(k=0;k { cout<<"请输入边 "; cin>>i>>j; p1=newedgenode; p1->endver=j; p1->edgenext=G->adjlists[i].edgelink; G->adjlists[i].edgelink=p1; p2=newedgenode; p2->endver=i; p2->edgenext=G->adjlists[j].edgelink; G->adjlists[j].edgelink=p2; //因为是无向图,所以有两次建立边表的过程 } } //深度优先遍历 voidDFS(Graph*G,inti,intvisit[]) { cout< visit[i]=1; edgenode*p=newedgenode; p=G->adjlists[i].edgelink; if(G->adjlists[i].edgelink&&! visit[p->endver]) { DFS(G,p->endver,visit); } } voidDFStraversal(Graph*G,charc)//深度优先遍历 { cout<<"该图的深度优先遍历结果为: "< intvisit[MaxVerNum]; for(inti=0;i { visit[i]=0;//全部初始化为0,即未访问状态 } intm; for(i=0;i { if(G->adjlists[i].vertex==c)//根据字符查找序号 { m=i; DFS(G,i,visit); break; } } //继续访问未被访问的结点 for(i=0;i { if(visit[i]==0) DFS(G,i,visit); } cout< } //广度优先遍历 voidBFS(Graph*G,intv,intvisit[]) { QueueList*Q=newQueueList; Q->front=Q->rear=NULL; EnQueue(Q,v); while(Q->rear! =NULL) { inte=0; DeQueue(Q,&e); cout< visit[e]=1; edgenode*p=newedgenode; p=G->adjlists[e].edgelink; if(p) { intm=p->endver; if(m==0) { EnQueue(Q,m); while(visit[m]==0) { p=p->edgenext; if(p==NULL) break; m=p->endver; EnQueue(Q,m); } } } } } voidBFStraversal(Graph*G,charc) { cout<<"该图的广度优先遍历结果为: "< intvisited[MaxVerNum]; for(inti=0;i { visited[i]=0; } intm; for(i=0;i { if(G->adjlists[i].vertex==c) { m=i; BFS(G,i,visited); break; } } //继续访问未被访问的结点 for(i=0;i { if(visited[i]==0) BFS(G,i,visited); } cout< } voidmain() { Graph*G=newGraph; CreatAdjList(G); charch; cout<<"请输入开始遍历的顶点: "; cin>>ch; DFStraversal(G,ch); BFStraversal(G,ch); }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基本 操作 数据 实验 报告书