资源简介
很多涉及图上操作的算法都是以图的遍历操作为基础的。试写一个程序,演示无向图的遍历操作。
以邻接表为存储结构,实现连通无向图的深度优先和广度优先遍历。以用户指定的结点为起点,分别输出每种遍历下的结点访问序列和相应生成树的边集。
[测试数据]
由学生依据软件工程的测试技术自己确定。注意测试边界数据,如单个结点。
[实现提示]
设图的结点不超过30个,每个结点用一个编号表示(如果一个图有n个结点,则它们的编号分别为1,2,…,n)。通过输入图的全部边输入一个图,每个边为一个数对,可以对边的输入顺序作出某种限制。注意,生成树的边是有向边,端点顺序不能颠倒。
代码片段和文件信息
/*题目:
以邻接表为存储结构,实现连通无向图的深度优先和广度优先遍历。以用户指定的结点为起点,
分别输出每种遍历下的结点访问序列和相应生成树的边集。
*/
#include
#include
#include
#include
using namespace std;
int visited[30]; //全局数组记录图中节点访问状态
int kvivj;
//=======================================邻接表
#define MAX_N 30
typedef struct ArcNode //边结点
{
int adjvex; //该邻接点在顶点数组中的下标
struct ArcNode *nextarc; //链域指向下一个邻接点
}ArcNode;
typedef struct VNode //顶点结点
{
int data; //顶点信息
ArcNode *firstarc; //边链头指针
}VNode AdjList[MAX_N]; //顶点数组(结构体数组)
typedef struct
{
AdjList vertices; //邻接表
int vexnumarcnum; //顶点数和边数
}ALGraph;
/****************************************************************************************
*函数名 :CreateGraph
*函数功能描述 :通过输入边的数对生成图
*函数参数 :ALGraph &G
*函数返回值 :空
*****************************************************************************************/
void CreateGraph(ALGraph &G) {
// 图G用邻接表表示创建图
cout<<“请输入顶点数和边数“< cin>>G.vexnum>>G.arcnum;
cout<<“输入顶点序列“< for(k = 1; k <= G.vexnum; k++)
{
cin>>G.vertices[k].data; //输入顶点序列
G.vertices[k].firstarc = NULL; // 初始化头指针
}
printf(“===========================\n“);
for (k = 1; k <= G.arcnum; ++k)
{
printf(“输入每条边上的顶点序号: “);
scanf(“%d%d“&vi&vj);
ArcNode *pArcNode = (ArcNode*)malloc(sizeof(ArcNode));
pArcNode->adjvex = vj;
pArcNode->nextarc = G.vertices[vi].firstarc;
G.vertices[vi].firstarc = pArcNode;
pArcNode = (ArcNode*)malloc(sizeof(ArcNode));
pArcNode->adjvex = vi;
pArcNode->nextarc = G.vertices[vj].firstarc;
G.vertices[vj].firstarc = pArcNode;
} //让vi,vj顶点都指向对方
}
/****************************************************************************************
*函数名 :DFS
*函数功能描述 :深度优先搜索遍历图G
*函数参数 :G-遍历的图 v-出发顶点
*函数返回值 :空
*****************************************************************************************/
void DFS(ALGraph G int v) {
visited[v] = 1; //访问后置为1
cout< ArcNode *x = (ArcNode*)malloc(sizeof(ArcNode));
if(!x) exit(-1); //没生成成功退出
x = G.vertices[v].firstarc;
int w;
for (; x; x = x->nextarc) //将x的邻接点访问
{
w = x->adjvex;
if(!visited[w])
DFS(Gw); //递归调用DFS
}
}
void DFSB (ALGraph Gint v)//深度搜索的边集
{
visited[v]=1;
ArcNode *y;
y=(ArcNode*)malloc(sizeof(ArcNode));
if(!y) exit(-1);
y=G.vertices[v].firstarc;
int u=G.vertices[v].data;
int w;
for(;y;y=y->nextarc)
{
w=y->adjvex;
if(visited[w]==0)
{
cout<“< DFSB(Gw);
}
}
}
typedef struct QNode
{
int data;
QNode *next;
}QNode*QueuePtr;
typedef struct
{
QueuePtr front;
QueuePtr rear;
}linkQueue;
void InitQueue (linkQueue &Q)//建立一个空队列
{
Q.front=Q.rear=(QueuePtr)malloc(sizeof(QNode
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
目录 0 2017-01-14 21:19 课程设计之图的遍历\
文件 6002 2017-01-06 11:15 课程设计之图的遍历\图的遍历.cpp
文件 130922 2017-01-14 21:18 课程设计之图的遍历\图的遍历报告.docx
评论
共有 条评论