图的基本操作Word格式文档下载.docx
《图的基本操作Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《图的基本操作Word格式文档下载.docx(19页珍藏版)》请在冰豆网上搜索。
输入:
将要求解的无/有向图按规则输入对应的文件
输出:
通过主菜单的选择,按需实现对图的各种操作,显示结果并保存到相应的文件中。
源程序说明:
头文件:
graphics.h
函数实现:
graphics.cpp
主函数:
main.cpp
存放的文件说明:
无向图:
graphics1.txt
存放格式为第一行存放图的顶点数n,边数b,下面每行存放两个相邻顶点:
Vi,Vj
有向图:
graphics2.txt
存放格式为第一行存放图的顶点数n,下面每行存放两个相邻顶点Vi-->
Vj:
无向图邻接表:
adjlist1.txt
有向图邻接表:
adjlist2.txt
无向图邻接矩阵:
adjmatrix1.txt
有向图邻接矩阵:
adjmatrix2.txt
所有抽象数据类型的定义如下:
//定义邻接表的边节点类型
structEdgeNode
{
intadjvex;
EdgeNode*next;
};
//定义邻接表类型
typedefEdgeNode**ADJLIST;
各模块的具体实现程序是:
Graphicscpp
各模块的的功能及参数说明:
graphics.h如下:
//对图操作的主菜单
voidMainMenue();
//初始化邻接表
voidInitialAdjList(ADJLIST&
GL,intn);
//以文件方式输入图
//boolInputGraphics();
//建立图的邻接表
voidCreatAdjList(ADJLIST&
GL,int&
n,intm);
//建立图的邻接矩阵
voidCreatAdjMatrix(ADJLIST&
//从初始点出发深度优先搜索由邻接表GL表示的图
voidDFSAdjList(ADJLISTGL,bool*&
visited,inti,intn);
//从初始点出发广度优先搜索由邻接表GL表示的图
voidBFSAdjList(ADJLISTGL,bool*&
4、测试结果
1、图是否有向的选择、主菜单界面:
2、建立邻接表的测试结果:
3、建立邻接矩阵的测试结果:
4、广度优先搜索的测试结果:
5、深度优先搜索的测试结果:
6、退出界面:
5、系统不足与经验体会
系统不足:
异常处理不够健壮,不能够用很形象的方式打印图的直观图。
经验体会:
通过这次实验使我对图有了比较深入的了解,熟悉了图的基本操作,同时也感受到了看似简单的程序实现,真正做起来很费劲,有很多的
困难需要去克服。
6、附录:
源代码(带注释)
graphics.h源代码如下:
#ifndefGRAPHICS_H
#defineGRAPHICS_H
structEdgeNode
{
};
#endif
Graphics.cpp源代码如下:
#include<
iostream>
stdio.h>
stdlib.h>
#include"
graphics.h"
#defineMAX_SIZE100
usingnamespacestd;
//部分函数原型声明
voidCheck(intn,int&
i,int&
j);
//全局变量,控制递归函数中提示符的输出
intflag=1;
voidMainMenue()
cout<
<
"
\n***************************************"
endl;
****"
**1.建立图的邻接表。
**"
**2.建立图的邻接矩阵。
**3.深度优先遍历图。
**4.广度优先遍历图。
**5.退出。
************fulme********************"
}/*EndofMainMuenue()*/
GL,intn)
//初始化图的邻接表
GL=newEdgeNode*[n];
for(inti=1;
i<
=n;
i++)
GL[i]=NULL;
}/*EndofInitialAdjlist()*/
n,intm)
FILE*in1;
FILE*in2;
FILE*out1;
FILE*out2;
inti;
intj;
intk;
intb;
charch;
intflag=0;
if(m==0)
//建立无向图的邻接表
if((in1=fopen("
graphics1.txt"
"
rb"
))==NULL)
打开graphics1.txt失败!
exit
(1);
}
if((out1=fopen("
adjlist1.txt"
wb"
打开adjlist1.txt失败!
flag=1;
//读入顶点的个数,"
"
边数
fscanf(in1,"
%d"
&
n);
%c"
ch);
b);
for(k=0;
k<
b;
k++)
i);
Check(n,i,j);
//向序号为i的单链表的表头插入一个边结点
EdgeNode*p=newEdgeNode;
p->
adjvex=j;
next=GL[i];
GL[i]=p;
//向序号为j的单链表的表头插入一个节点
p=newEdgeNode;
adjvex=i;
next=GL[j];
GL[j]=p;
//输出邻接表,并保存到adjlist1.txt中
endl<
\n====================="
无向图的邻接表为:
for(i=1;
EdgeNode*p=GL[i];
i-1<
|"
V"
i;
fprintf(out1,"
'
V'
);
i);
for(p=GL[i];
p!
=NULL;
p=p->
next)
|-|->
|"
p->
adjvex;
%s"
p->
adjvex);
|^|"
\r\n"
if(flag)
无向图的邻接表已保存到adjlist1.txt中"
fclose(in1);
fclose(out1);
elseif(m==1)
//建立有向图的邻接表
if((in2=fopen("
graphics2.txt"
打开graphics2.txt失败!
if((out2=fopen("
adjlist2.txt"
打开adjlist2.txt失败!
fscanf(in2,"
//向序列号为i的表头插入一个边节点
//输出图的邻接表
有向图的邻接表为:
fprintf(out2,"
有向图的邻接表已保存到adjlist2.txt"
fclose(in2);
fclose(out2);
}/*EndofCreatAdjList()*/
intmatrix[MAX_SIZE+1][MAX_SIZE+1];
//初始化图的邻接矩阵
=MAX_SIZE;
for(j=1;
j<
j++)
matrix[i][j]=0;
//建立无向图的邻接矩阵
adjlmatrix1.txt"
打开adjmatrix1.txt失败!
matrix[i][j]=matrix[j][i]=1;
=b;
matrix[i][j]<
'
'
;
%d"
matrix[i][j]);
无向图的邻接矩阵已保存到adjmatrix1.txt中!
//建立有向图的邻接矩阵
adjmatrix2.txt"
打开adjmatrix2.txt失败!
for(k=1;
matrix[i][j]=1;
有向图已保存到adjmatrix2.txt中!
}/*EndofCreatAdjMatrix()*/
visited,inti,intn)
//从初始点出发递归深度优先搜索邻接表GL表示的图
flag=0;
\n================================="
\n图的深度优先遍历序列:
i<
visited[i]=true;
while(p!
=NULL)
intj=p->
//j为Vi的一个邻接点的序号
if(!
visited[j])
DFSAdjList(GL,visited,j,n);
next;
}/*EndofDFSAdjList()*/
//从初始点开始广度优先搜索邻接表GL表示的图
constintMaxLength=100;
//定义一个队列q,其元素类型为整型
intq[MaxLength]={0};
//定义队首和对尾指针
intfront=0,rear=0;
\n图的广度优先遍历序列:
visited[j]=false;
//访问Vi
q[++rear]=i;
while(front!
=rear)
//当队列非空时进行循环处理
//删除队首元素,第一次执行时k的值为i
front=(front+1)%MaxLength;
intk=q[front];
//取邻接表的表头指针
EdgeNode*p=GL[k];
//依次搜索Vk的每个节点
//Vj为Vk的一个邻接节点
j<
visited[j]=true;
rear=(rear+1)%MaxLength;
q[rear]=j;
}/*EndofBFSAdjList()*/
j)
//检查输入的边序号是否越界,如越界择重输入
while
(1)
(i>
=0&
&
=n&
j>
=n))
\n输入有误!
break;
}/*EndofCheck()*/
main.cpp源代码如下:
intmain()
intn;
intm;
//是否为有向图
bool*visited=newbool[MAX_SIZE];
ADJLISTgl;
//初始化邻接表
InitialAdjList(gl,MAX_SIZE);
=============================="
请选择图是否有向(0无/1有):
cin>
>
m;
MainMenue();
请输入你的选择:
"
ch;
switch(ch)
case'
1'
:
CreatAdjList(gl,n,m);
2'
CreatAdjMatrix(gl,n,m);
3'
visited[i]=false;
DFSAdjList(gl,visited,1,n);
4'
BFSAdjList(gl,visited,1,n);
5'
default:
输入有误!
return0;
}