数据结构第六次实验报告.docx

上传人:b****1 文档编号:13878380 上传时间:2023-06-18 格式:DOCX 页数:19 大小:230.09KB
下载 相关 举报
数据结构第六次实验报告.docx_第1页
第1页 / 共19页
数据结构第六次实验报告.docx_第2页
第2页 / 共19页
数据结构第六次实验报告.docx_第3页
第3页 / 共19页
数据结构第六次实验报告.docx_第4页
第4页 / 共19页
数据结构第六次实验报告.docx_第5页
第5页 / 共19页
数据结构第六次实验报告.docx_第6页
第6页 / 共19页
数据结构第六次实验报告.docx_第7页
第7页 / 共19页
数据结构第六次实验报告.docx_第8页
第8页 / 共19页
数据结构第六次实验报告.docx_第9页
第9页 / 共19页
数据结构第六次实验报告.docx_第10页
第10页 / 共19页
数据结构第六次实验报告.docx_第11页
第11页 / 共19页
数据结构第六次实验报告.docx_第12页
第12页 / 共19页
数据结构第六次实验报告.docx_第13页
第13页 / 共19页
数据结构第六次实验报告.docx_第14页
第14页 / 共19页
数据结构第六次实验报告.docx_第15页
第15页 / 共19页
数据结构第六次实验报告.docx_第16页
第16页 / 共19页
数据结构第六次实验报告.docx_第17页
第17页 / 共19页
数据结构第六次实验报告.docx_第18页
第18页 / 共19页
数据结构第六次实验报告.docx_第19页
第19页 / 共19页
亲,该文档总共19页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

数据结构第六次实验报告.docx

《数据结构第六次实验报告.docx》由会员分享,可在线阅读,更多相关《数据结构第六次实验报告.docx(19页珍藏版)》请在冰点文库上搜索。

数据结构第六次实验报告.docx

数据结构第六次实验报告

数据结构试验报告

 

实验名称:

学生姓名:

  王勇 

学号:

E01014367

专业:

10级网络工程一班

完成时间:

 2012年5月31日

 

一、实验目的

1.熟练掌握图的邻接矩阵与邻接表的存储方式。

2.实现图的一些基本运算,特别是深度遍历和广度遍历。

3.掌握以图为基础的一些常用算法,如最小生成树、拓扑排序、最短路径等。

二、实验内容与要求

1.从键盘上输入图的顶点数、边数以及边的信息,建立图的邻接矩阵。

请将使用的图画在实验报告上。

有向图(g1)和无向图(g2)各创建一个。

2.参照要求1,创建图g1,g2的邻接表。

3.在要求2完成后,对邻接表表示的图g1和g2进行深度优先遍历和广度优先遍历,并输出遍历结果。

请以不同的起始点测试遍历运行结果。

程序;

#include"stdafx.h"

 

#include

#include

usingnamespacestd;

#defineint_max0

#defineinf9999

#definemax20

//…………………………………………邻接矩阵定义……………………

typedefstructArcCell

{

intadj;

char*info;

}ArcCell,AdjMatrix[20][20];

typedefstruct

{

charvexs[20];

AdjMatrixarcs;

intvexnum,arcnum;

}MGraph_L;

//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

intlocalvex(MGraph_LG,charv)//返回V的位置

{

inti=0;

while(G.vexs[i]!

=v)

{

++i;

}

returni;

}

//创建无向图邻接矩阵

intcreatUDG(MGraph_L&G)

{

charv1,v2;

inti,j,w;

cout<<"…………创建无向图…………"<

(46)不包括“()”"<

cin>>G.vexnum>>G.arcnum;

for(i=0;i!

=G.vexnum;++i)

{

cout<<"输入顶点"<

cin>>G.vexs[i];

}

for(i=0;i!

=G.vexnum;++i)

for(j=0;j!

=G.vexnum;++j)

{

G.arcs[i][j].adj=int_max;

G.arcs[i][j].info=NULL;

}

for(intk=0;k!

=G.arcnum;++k)

{

cout<<"输入一条边依附的顶点和权:

(ab3)不包括“()”"<

cin>>v1>>v2>>w;//输入一条边依附的两点及权值

i=localvex(G,v1);//确定顶点V1和V2在图中的位置

j=localvex(G,v2);

G.arcs[i][j].adj=w;

G.arcs[j][i].adj=w;

}

cout<<"图G邻接矩阵创建成功!

"<

returnG.vexnum;

}

//创建有向图邻接矩阵

intcreatDG(MGraph_L&G)

{

charv1,v2;

inti,j,w;

cout<<"…………创建有向图…………"<

(46)不包括“()”"<

cin>>G.vexnum>>G.arcnum;

for(i=0;i!

=G.vexnum;++i)

{

cout<<"输入顶点"<

cin>>G.vexs[i];

}

for(i=0;i!

=G.vexnum;++i)

for(j=0;j!

=G.vexnum;++j)

{

G.arcs[i][j].adj=int_max;

G.arcs[i][j].info=NULL;

}

for(intk=0;k!

=G.arcnum;++k)

{

cout<<"输入一条边依附的顶点和权:

(ab3)不包括“()”"<

cin>>v1>>v2>>w;//输入一条边依附的两点及权值

i=localvex(G,v1);//确定顶点V1和V2在图中的位置

j=localvex(G,v2);

G.arcs[i][j].adj=w;

}

cout<<"图G邻接矩阵创建成功!

"<

returnG.vexnum;

}

//邻接矩阵输出

voidljjzprint(MGraph_LG)

{

inti,j;

for(i=0;i!

=G.vexnum;++i)

{

for(j=0;j!

=G.vexnum;++j)

cout<

cout<

}

}

 

intvisited[max];//访问标记

intwe;

//邻接表相关定义

typedefstructarcnode//弧结点

{

intadjvex;//该弧指向的顶点的位置

structarcnode*nextarc;//弧尾相同的下一条弧

char*info;//该弧信息

}arcnode;

typedefstructvnode//邻接链表顶点头接点

{

chardata;//结点信息

arcnode*firstarc;//指向第一条依附该结点的弧的指针

}vnode,adjlist;

typedefstruct//图的定义

{

adjlistvertices[max];

intvexnum,arcnum;

intkind;

}algraph;

 

//…………………………………………队列定义……………………

typedefstructqnode

{

intdata;

structqnode*next;

}qnode,*queueptr;

typedefstruct

{

queueptrfront;

queueptrrear;

}linkqueue;

typedefstructacr

{

intpre;//弧的一结点

intbak;//弧另一结点

intweight;//弧的权

}edg;

//创建无向图邻接表

intcreatadj(algraph&gra,MGraph_LG)

{

inti=0,j=0;

arcnode*arc,*tem,*p;

for(i=0;i!

=G.vexnum;++i)

{

gra.vertices[i].data=G.vexs[i];

gra.vertices[i].firstarc=NULL;

}

for(i=0;i!

=G.vexnum;++i)

{

for(j=0;j!

=G.vexnum;++j)

{

if(gra.vertices[i].firstarc==NULL)

{

if(G.arcs[i][j].adj!

=int_max&&j!

=G.vexnum)

{

arc=(arcnode*)malloc(sizeof(arcnode));

arc->adjvex=j;

gra.vertices[i].firstarc=arc;

arc->nextarc=NULL;

p=arc;

++j;

while(G.arcs[i][j].adj!

=int_max&&j!

=G.vexnum)

{

tem=(arcnode*)malloc(sizeof(arcnode));

tem->adjvex=j;

gra.vertices[i].firstarc=tem;

tem->nextarc=arc;

arc=tem;

++j;

}

--j;

}

}

else

{

if(G.arcs[i][j].adj!

=int_max&&j!

=G.vexnum)

{

arc=(arcnode*)malloc(sizeof(arcnode));

arc->adjvex=j;

p->nextarc=arc;

arc->nextarc=NULL;

p=arc;

}

}

}

}

gra.vexnum=G.vexnum;

gra.arcnum=G.arcnum;

cout<<"图G邻接表创建成功!

"<

return1;

}

 

//邻接表输出

voidadjprint(algraphgra)

{

inti;

for(i=0;i!

=gra.vexnum;++i)

{

arcnode*p;

cout<

p=gra.vertices[i].firstarc;

while(p!

=NULL)

{

cout<adjvex;

p=p->nextarc;

}

cout<

}

}

 

intfirstadjvex(algraphgra,vnodev)//返回依附顶点V的第一个点

//即以V为尾的第一个结点

{

if(v.firstarc!

=NULL)

returnv.firstarc->adjvex;

}

intnextadjvex(algraphgra,vnodev,intw)//返回依附顶点V的相对于W的下一个顶点

{

arcnode*p;

p=v.firstarc;

while(p!

=NULL&&p->adjvex!

=w)

{

p=p->nextarc;

}

if(p->adjvex==w&&p->nextarc!

=NULL)

{

p=p->nextarc;

returnp->adjvex;

}

if(p->adjvex==w&&p->nextarc==NULL)

return-10;

}

intinitqueue(linkqueue&q)//初始化队列

{

q.rear=(queueptr)malloc(sizeof(qnode));

q.front=q.rear;

if(!

q.front)

return0;

q.front->next=NULL;

return1;

}

intenqueue(linkqueue&q,inte)//入队

{

queueptrp;

p=(queueptr)malloc(sizeof(qnode));

if(!

p)

return0;

p->data=e;

p->next=NULL;

q.rear->next=p;

q.rear=p;

return1;

}

intdequeue(linkqueue&q,int&e)//出队

{

queueptrp;

if(q.front==q.rear)

return0;

p=q.front->next;

e=p->data;

q.front->next=p->next;

if(q.rear==p)

q.rear=q.front;

free(p);

return1;

}

intqueueempty(linkqueueq)//判断队为空

{

if(q.front==q.rear)

return1;

return0;

}

voidbfstra(algraphgra)//广度优先遍历

{

inti,e;

linkqueueq;

for(i=0;i!

=gra.vexnum;++i)

visited[i]=0;

initqueue(q);

for(i=0;i!

=gra.vexnum;++i)

if(!

visited[i])

{visited[i]=1;

cout<

enqueue(q,i);

while(!

queueempty(q))

{

dequeue(q,e);

//cout<<""<

for(we=firstadjvex(gra,gra.vertices[e]);we>=0;we=nextadjvex(gra,gra.vertices[e],we))

{

if(!

visited[we])

{

visited[we]=1;

cout<

enqueue(q,we);

}

}

}

}

}

intdfs(algraphgra,inti);//声明DFS

intdfstra(algraphgra)

{

inti,j;

for(i=0;i!

=gra.vexnum;++i)

{

visited[i]=0;

}

for(j=0;j!

=gra.vexnum;++j)

{

if(visited[j]==0)

dfs(gra,j);

}

return0;

}

intdfs(algraphgra,inti)

{

visited[i]=1;

intwe1;

cout<

for(we=firstadjvex(gra,gra.vertices[i]);we>=0;we=nextadjvex(gra,gra.vertices[i],we))

{

we1=we;

if(visited[we]==0)

dfs(gra,we);

}

return12;

}

intbfstra_fen(algraphgra)//求连通分量

{

inti,j;

for(i=0;i!

=gra.vexnum;++i)

{

visited[i]=0;

}

for(j=0;j!

=gra.vexnum;++j)

{

if(visited[j]==0)

{

dfs(gra,j);

cout<

}

}

return0;

}

 

voidmain()

{

algraphgra;

MGraph_LG;

inti,d,g[20][20],k;

chara='a';

cout<<"构建邻接矩阵\n"<

cout<<"***************菜单**********"<

cout<<"0:

构建有向图(同时构建邻接矩阵和邻接表)1:

构建无向图(同时构建邻接矩阵和邻接表)"<

scanf("%d",&k);

switch(k){

case0:

{

d=creatDG(G);

creatadj(gra,G);

break;}

case1:

{

d=creatUDG(G);

creatadj(gra,G);

break;}

default:

exit(0);

}

vnodev;

cout<<"…………………菜单……………………"<

cout<<"0、显示该图的邻接矩阵……………………"<

cout<<"1、显示该图的邻接表……………………"<

cout<<"2、深度优先遍历…………………………"<

cout<<"3、广度优先遍历…………………………"<

ints;

chary='y';

while(y='y')

{

cout<<"请选择菜单:

"<

cin>>s;

switch(s)

{

case0:

cout<<"邻接矩阵显示如下:

"<

ljjzprint(G);

break;

case1:

cout<<"邻接表显示如下:

"<

adjprint(gra);

break;

case2:

cout<<"广度优先遍历:

";

bfstra(gra);

cout<

break;

case3:

for(i=0;i!

=gra.vexnum;++i)

{

visited[i]=0;

}

cout<<"深度优先遍历:

";

dfstra(gra);

cout<

break;

}

cout<

y/n:

";

cin>>y;

if(y=='n')

break;

}

}

运行结果

1调试时的问题

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > PPT模板 > 中国风

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2