数据结构实验四:图的应用
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数据结构实验报告
20 10 ~20 11 学年第一学期2008级计算机专业
班级:学号:姓名:
实验四图的应用
一、实验目的:
1.掌握图的存储结构及其构造方法
2.掌握图的两种遍历算法及其执行过程
二、实验内容:
以邻接矩阵或邻接表为存储结构,以用户指定的顶点为起始点,实现无向连通图的深度优先及广度优先搜索遍历,并输出遍历的结点序列。
提示:首先,根据用户输入的顶点总数和边数,构造无向图,然后以用户输入的顶点为起始点,进行深度优先和广度优先遍历,并输出遍历的结果。
三、实验要求:
1.各班学号为单号的同学采用邻接矩阵实现,学号为双号的同学采用邻接表实现。
2.C/ C++完成算法设计和程序设计并上机调试通过。
3.撰写实验报告,提供实验结果和数据。
4.写出算法设计小结和心得。
四、程序源代码:
#include
typedef char vextype;
const MAXVER=21;
typedef struct listnode {
int adjvex;
listnode* next;
}listnode;//表结点
typedef struct
{
vextype data;
listnode *first;
}headnode;//头结点typedef struct
{
headnode vexs[MAXVER];
int vexnum,arcnum;
} ALgraph;//图
void createALgraph(ALgraph &G)
{
int i, s, d;
listnode *p,*q;
cout<<"输入图的顶点数和边数:"; cin>>G.vexnum>>G.arcnum;
for(i=1;i<=G.vexnum;i++)
{
cout<<"\n输入第"<>G.vexs[i].data;
G.vexs[i].first=NULL;
} //输入第i个结点值并初始化第i个单链表为空
for(i=1; i<=G.arcnum; i++)
{
cout<<"\n输入第"<
cin>>s>>d;//s为始点,d为终点
p=new listnode;
p->adjvex=d;
p->next=G.vexs[s].first;
G.vexs[s].first=p;
//将新建的以d为信息的表结点p插入s 单链表的头结点后
q=new listnode;
q->adjvex=s;
q->next=G.vexs[d].first;
G.vexs[d].first=q;
//将新建的以s为信息的表结点q插入d 单链表的头结点后
}
}
int visited[MAXVER];//定义全局数组遍历visited
void dfs(ALgraph G, int v)//被遍历的图
G采用邻接表作为存储结构,v为出发顶点编号
{
listnode *p;
cout< visited[v]=1; p=G.vexs[v].first; while(p!=NULL) { if(visited[p->adjvex]==0) dfs(G,p->adjvex); //若p所指表结点对应的邻接顶点未访问则递归地从该顶点出发调用dfs p=p->next; } } void dfsTraverse(ALgraph G) { int v; //遍历图之前初始化各未访问的顶点 for(v=1; v<=G.vexnum; v++) visited[v]=0; //从各个未被访问过的顶点开始进行深度遍历 for(v=1;v<=G.vexnum;v++) if(visited[v]==0) dfs(G,v); } void BFS(ALgraph G, int v) //从顶点编号v出发,广度遍历邻接表存储的图G { int queue[MAXVER], front ,rear; listnode* p; front=rear=0; cout< visited[v]=1; queue[++rear]=v; while(front!=rear) { v=queue[++front]; p=G.vexs[v].first; while(p!=NULL) { if(visited[p->adjvex]==0) { v=p->adjvex; cout< visited[v]=1; queue[++rear]=v; } p=p->next; } } } void BFSTraverse(ALgraph G) { int v; //遍历G以前,初始化visited数组为0 for(v=1;v<=G.vexnum;v++) visited[v]=0; for(v=1;v<=G.vexnum;v++) if(visited[v]==0) BFS(G,v); } void main() { ALgraph g; createALgraph(g); cout< dfsTraverse(g); cout< BFSTraverse(g); cout< } 五、程序运行情况(写出输入数据及运行结果)