数据结构与算法实验报告图.docx
《数据结构与算法实验报告图.docx》由会员分享,可在线阅读,更多相关《数据结构与算法实验报告图.docx(9页珍藏版)》请在冰豆网上搜索。
数据结构与算法实验报告图
沈阳工程学院
学生实验报告
(课程名称:
数据结构与算法)
实验题目:
图
班级网本111学号16姓名邹壮壮
地点F606指导教师吕海华
实验日期:
2011年月日
一、实验目的
1.掌握图的基本存储方法。
2.掌握有关图的操作算法并用高级语言实现。
3.熟练掌握图的两种搜索路径的遍历方法。
4.掌握图的有关应用。
二、实验环境
TurboC或是VisualC++
三、实验内容与要求
实验1建立无向图的邻接矩阵或邻接表存储并输出
本题给出了一个无向图的邻接矩阵存储表示,在此基础上稍加改动就可以实现有向图、无向图和有向网的邻接矩阵表示。
实验2建立图的邻接矩阵或邻接表存储并在此基础上实现图的深度优先遍历和广度优先遍历
图的广度优先遍历用非递归方法很容易理解,非递归方法需要辅助队列Q以及出队、入队函数。
四、实验过程及结果分析
1.广度优先
(1)邻接表表示图的广度优先搜索算法
voidBFS(ALGraph*G,intk)
{//以vk为源点对用邻接表表示的图G进行广度优先搜索
inti;
CirQueueQ;//须将队列定义中DataType改为int
EdgeNode*p;
InitQueue(&Q);//队列初始化
//访问源点vk
printf("visitvertex:
%e",G->adjlist[k].vertex);
visited[k]=TRUE;
EnQueue(&Q,k);//vk已访问,将其人队。
(实际上是将其序号人队)
while(!
QueueEmpty(&Q)){//队非空则执行
i=DeQueue(&Q);//相当于vi出队
p=G->adjlist[i].firstedge;//取vi的边表头指针
while(p){//依次搜索vi的邻接点vj(令p->adjvex=j)
if(!
visited[p->adivex]){//若vj未访问过
printf("visitvertex:
%c",C->adjlistlp->adjvex].vertex); //访问vj
visited[p->adjvex]=TRUE;
EnQueue(&Q,p->adjvex);//访问过的vj人队
}//endif
p=p->next;//找vi的下一邻接点
}//endwhile
}//endwhile
}//endofBFS
(2)邻接矩阵表示的图的广度优先搜索算法
voidBFSM(MGraph*G,intk)
{以vk为源点对用邻接矩阵表示的图G进行广度优先搜索
inti,j;
CirQueueQ;
InitQueue(&Q);
printf("visitvertex:
%c",G->vexs[k]);//访问源点vk
visited[k]=TRUE;
EnQueue(&Q,k);
while(!
QueueEmpty(&Q)){
i=DeQueue(&Q);//vi出队
for(j=0;jn;j++)//依次搜索vi的邻接点vj
if(G->edges[i][j]==1&&!
visited[j]){//vi未访问
printf("visitvertex:
%c",G->vexs[j]);//访问vi
visited[j]=TRUE;
EnQueue(&Q,j);//访问过的vi人队
}
}//endwhile
}//BFSM
2.邻接表
#include
#include
#defineMAX_NUM20
#defineOK1
#defineERROR-1
typedefintElemType;
typedefcharVertexType;
typedefstructArcNode
{//定义弧结点
ElemTypedata;
ArcNode*nextarc;
}ArcNode,*ArcLink;
typedefstructVNode
{//定义顶点结点
VertexTypedata;
ArcLinkfirstarc;
}VNode,AdjList[MAX_NUM];
typedefstruct
{
AdjListvdata;
intvexnum,arcnum;
}ALGraph;
//构建图的邻接表
intCreategraph(ALGraph&G,intn){
ArcLinkp;
inte,i;
charv,w;
for(i=0;iG.vdata[i].data='A'+i;
G.vdata[i].firstarc=NULL;
}
printf("输入边的个数:
\n");
scanf("%d",&e);
for(i=0;i{
getchar();//接收scanf的回车符
printf("请输入某边所依附的两个顶点用A--%C表示\n",'A'+n-1);
scanf("%c%c",&v,&w);//fflush(stdin);
printf("V=%c,W=%c,I=%d\n",v,w,i);
p=(ArcLink)malloc(sizeof(ArcNode));
p->data=(int)(w-'A'+1);printf("%d\n",p->data);
p->nextarc=G.vdata[(int)(v-'A')].firstarc;
G.vdata[(int)(v-'A')].firstarc=p;
p=(ArcLink)malloc(sizeof(ArcNode));
p->data=(int)(v-'A'+1);
p->nextarc=G.vdata[(int)(w-'A')].firstarc;
G.vdata[(int)(w-'A')].firstarc=p;
}
G.vexnum=n;G.arcnum=e;
returnOK;
}
//输出邻接表
intprintGraph(ALGraphG){
ArcLinkp;
inti;
for(i=0;iprintf("%2d%c",i,G.vdata[i]);
for(p=G.vdata[i].firstarc;p!
=NULL;p=p->nextarc){
printf("-->");
printf("%d",p->data);
}
printf("\n");
}
returnOK;
}
intmain()
{
ALGraphG;
intn;
printf("请输入你要构建的无向图的顶点个数:
\n");
scanf("%d",&n);
Creategraph(G,n);
printf("你所构建的无向图的邻接表如下所示:
\n");
printGraph(G);
returnOK;
}
#defineMaxVertexNum20//最大顶点数,应由用户定义
#defineOK1
#defineERROR-1
typedefcharVertexType;//顶点类型应由用户定义
typedefintEdgeType;//边上的权值类型应由用户定义
//定义图的种类类型,yxt有向图,yxw有向网,wxt无向图,wxw无向网
typedefenum{yxt,yxw,wxt,wxw}GraphKind;
typedefstruct
{
VertexTypevexs[MaxVertexNum];//顶点表
//邻接矩阵,可看作边表,如果是无权图,1:
相邻,0:
不相邻
EdgeTypeedges[MaxVertexNum][MaxVertexNum];
intn;
inte;//图中当前的顶点数和边数
GraphKindgkind;//图的种类标示
}MGraph;
//函数声明
intcreatWxw(MGraph*G);
intcreatYxt(MGraph*G);
intcreatYxw(MGraph*G);
intcreatWxt(MGraph*G);
voidprintGraph(MGraph*G)
{
inti,j;
for(i=0;in;i++)
{
for(j=0;jn;j++)
printf("%d",G->edges[i][j]);printf("\n");
}
}
//根据不同的种类构建不同的图
intcreatGraph(MGraph*G)
{
printf("输入图的种类,0:
有向图,1:
有向网,2:
无向图,3:
无向网:
");
printf("\n");
scanf("%d",&(G->gkind));
switch(G->gkind)
{
case0:
returncreatYxt(G);break;
case1:
returncreatYxw(G);break;
case2:
returncreatWxt(G);break;
case3:
returncreatWxw(G);break;
default:
returnERROR;
}
}
//创建无向网,网指的是具有权值的图
intcreatWxw(MGraph*G)
{
inti=0,j=0,k=0;
charv1,v2;//弧的两个结点
intw;//权值
printf("输入图的结点数:
\n");
scanf("%d",&G->n);
printf("输入图的边数:
\n");
scanf("%d",&G->e);
getchar();//接收scanf的回车符
//输入结点
printf("输入结点,用大写字母标示(要求第一个顶点是A),如:
A:
\n");
for(i=0;in;i++)
{
scanf("%c",&G->vexs[i]);
}
getchar();//接收scanf的回车符
//初始化邻接矩阵
for(i=0;in;i++)
for(j=0;jn;j++)
G->edges[i][j]=-1;
//输入边连接的两个结点
for(k=0;ke;k++)
{
//i,j作为矩阵的行和列
printf("输入弧和权值:
\n");
scanf("%c%c%d",&v1,&v2,&w);
getchar();
i=v1-'A';
j=v2-'A';
G->edges[i][j]=w;
G->edges[j][i]=w;
}
returnOK;
}
intmain()
{
MGraphG;
creatGraph(&G);
printGraph(&G);
return0;
}
五、成绩评定
优
良
中
及格
不及格
出勤
内容
格式
创新
效果
总评
指导教师:
年月日