数据结构演示程序(邻接矩阵)

/*此程序仅完成三个功能:建立无向图的邻接矩阵,输出邻接矩阵,深度优先遍历*/
#include <iostream.h>
const int MaxSize=10; //图中最多顶点个数

//-----------------------------------------------------------------------
class MGraph
{
public:
MGraph(char a[ ], int n, int e ); //构造函数,初始化具有n个顶点e条边的图
~MGraph( ) { }; //析构函数
void MGraphOut(); //输出邻接矩阵
void DFSTraverse(int v); //深度优先遍历图
private:
char vertex[MaxSize]; //存放图中顶点的数组
int arc[MaxSize][MaxSize]; //存放图中边的数组
int vertexNum, arcNum; //图的顶点数和边数
int visited[MaxSize]; //深度优先遍历时访问标记
};
//-------------------------------------------------------------------------
/*
邻接矩阵构造函数设计说明
1. 确定图的顶点个数和边的个数;
2. 输入顶点信息存储在一维数组vertex中;
3. 初始化邻接矩阵;
4. 依次输入每条边存储在邻接矩阵arc中;
(1) 输入边依附的两个顶点的序号i, j;
(2) 将邻接矩阵的第i行第j列的元素值置为1;
(3) 将邻接矩阵的第j行第i列的元素值置为1;
*/

MGraph::MGraph(char a[ ], int n, int e)
{
int i,j,k;
vertexNum=n; arcNum=e;
for (i=0; i<vertexNum; i++)
{
vertex[i]=a[i];
visited[i]=0; //访问标记为0:未访问
}
for (i=0; i<vertexNum; i++) //初始化邻接矩阵
for (j=0; j<vertexNum; j++)
arc[i][j]=0;
for (k=0; k<arcNum; k++) //依次输入每一条边,并修改邻接矩阵的相应元素
{
cin>>i>>j; //边依附的两个顶点的序号
arc[i][j]=1; //置有边标志
arc[j][i]=1;
}
}
//--------------------------输出邻接表矩阵--------------------------------
void MGraph::MGraphOut()
{
int i,j;
for (i=0; i<vertexNum; i++)
{
for (j=0; j<vertexNum; j++)
cout<<arc[i][j]<<' ';
cout<<'\n';
}
}
//-----------------------------------------------------------------------
/* 深度优先遍历算法设计说明
1. 访问顶点v; visited[v]=1;
2. w=顶点v的第一个邻接点;
3. while (w存在)
(1) if (w未被访问) 从顶点w出发递归执行该算法;
(2) w=顶点v的下一个邻接点;
*/

void MGraph::DFSTraverse(int v) //v是遍历起始点的编号
{
int j;
cout<<vertex[v]; visited[v]=1;
for (j=0; j<vertexNum; j++)
if (arc[v][j]==1 && visited[j]==0) DFSTraverse( j );
}
//----------------------------------------------------------------------

void main()
{
/*这是5个顶点,7条边的无向图.顶点集:{a,b,c,d,e},
边集:{(a,b),(a,c),(a,d),(b,d),(c,d),(c,e),(d,e)}
也可以自己输
入其他图

注意:输入边时,是边的编号,如输入边(a,b)时应输入:
0 1 回车 */
char a[10]="abcde";
cout<<"输入边两端顶点编号(如输入边(a,b)时应输入: 0 1 回车):"<<'\n';
MGraph g(a,5,7);
cout<<"你输入的图的邻接表是:"<<'\n';
g.MGraphOut();
cout<<"深度优先遍历顺序:";
g.DFSTraverse(2);//2是遍历起始点的编号,也可以从其他点遍历
cout<<'\n';
}

相关文档
最新文档