《数据结构》实验报告

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验三——图

一、实验目的

1.掌握图的基本概念;

2.掌握图的存储结构及其建立算法;

3.熟练掌握图的两种遍历算法及其应用。

二、实验内容

1.对给定的图G,设计算法输出从V0出发深(广)度遍历图G的深(广)度优先搜索

序列;

2.设计算法输出给定图G的连通分量个数及边(或弧)的数目。

三、实验预习内容

在实验中要用到这几个函数:typedef struct 邻接矩阵的创建,Locate函数去查找,create函数创建图,定义两个指针firstadj,nextadj找寻临接点和下一个临接点,void dfs函数从某一点开始遍历,void dfsgraph进行图的遍历算法,然后就是main 函数。

四、上机实验

1.实验源程序。

#include

#define max 80

int num1=0,num2=0;

bool visited[max]; //标记数组

typedef struct //邻接矩阵

{

char vexs[max];

int arcs[max][max];

int vexnum,arcnum;

} graph;

int locate(graph G,char v) //定位

{

int i;

for(i=0;i

if(G.vexs[i]==v)

return i;

if(i==G.vexnum)

return -1;

}

void creat(graph &G) //创建图

{

int i,j,k;

char v1,v2;

cout<<"Please input the vexnum and the arcnum:";

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

cout<<"Please iput the chars in sequence:";

for(i=0;i

cin>>G.vexs[i];

for(i=0;i

G.arcs[i][j]=0;

cout<<"Create the relationship between chars:\n";

for(k=1;k<=G.arcnum;k++) //创建关系

{

cout<<"input v1 and v2:";

cin>>v1>>v2;

i=locate(G,v1);

j=locate(G,v2);

G.arcs[i][j]=G.arcs[j][i]=1;

}

}

int firstadj(graph G,int v) //第一个邻接点

{

int i;

for(i=0;i

if(G.arcs[v][i])

return i;

if(i==G.vexnum)

return -1;

}

int nextadj(graph G,int v,int w) //下一个邻接点{

int i;

for(i=w+1;i

if(G.arcs[v][i])

return i;

if(i==G.vexnum)

return -1;

}

void dfsv(graph G,int v) //从某一点遍历

{

int w;

cout<

visited[v]=true;

w=firstadj(G,v);

while(w>=0)

{

num2++;

if(!visited[w])

.

dfsv(G,w);

w=nextadj(G,v,w);

}

}

void dfsgraph(graph G) //图的遍历

{

int i;

for(i=0;i

visited[i]=false;

for(i=0;i

if(!visited[i])

{

dfsv(G,i);

num1++;

}

}

int main()

{

graph G;

int choice,flag=1; char ctinue;

for(;flag==1;)

{

cout<<"\t1.creat graph"<<"\n\t2.output graph"<<"\n\t3.the number of..."<<"\n\t4.the number of bian"<

cout<<"Please choose:";

cin>>choice;

switch(choice)

{

case 1:creat(G);break;

case 2:{dfsgraph(G);cout<

case 3:cout<

case 4:cout<

}

cout<<"Continue(Y/N):";

cin>>ctinue;

if(ctinue=='Y'||ctinue=='y')

flag=1;

else flag=0;

}

}

相关文档
最新文档