0
点赞
收藏
分享

微信扫一扫

建立图的邻接矩阵存储结构(数组表示),并将邻接矩阵输出并对其进行深度优先遍历和广度优先遍历。

源程序及注释

#include<iostream> 

using namespace std;

#define ERROR 0

#define OK 1

typedef int Status;

#define TRUE 1

#define FALSE 0

//图的邻接矩阵(数组)存储表示

#define MaxINt 32767 //表示极大值,即无穷

#define MVNum 100 //最大顶点数

typedef int ArcType; //假设边的权值类型为整型

typedef char VertexType; //假设顶点的数据类型为字符型

typedef struct {

VertexType vexs[MVNum]; //顶点表

ArcType arcs[MVNum][MVNum]; //邻接矩阵

int vexnum, arcnum; //图的当前点数和弧数

}AMGraph;

//确定顶点在数组中的位置

Status LocateVex(AMGraph G, VertexType u)

{ /* 初始条件: 图G存在,u和G中顶点有相同特征 */

  /* 操作结果: 若G中存在顶点u,则返回该顶点在图中位置;否则返回-1 */

int i;

for (i = 0; i < G.vexnum; ++i)

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

return i;

return -1;

}

//采用邻接矩阵表示法,创建无向网

Status CreateUDN(AMGraph &G)

{

VertexType va, vb;

cout << "请分别输入无向网G的总顶点数(不超过100个),总边数: " << endl;

cin >> G.vexnum >> G.arcnum; //输入总点数,总边数

cout << "请分别输入" << G.vexnum << "个顶点的值(字符型数据不加空格):" << endl;

for (int i = 0; i < G.vexnum; i++)//依次输入点的信息

{

cin >> G.vexs[i];

}

for (int i = 0; i < G.vexnum; i++) // 初始化邻接矩阵

{

for (int j = 0; j < G.vexnum; j++)

{

G.arcs[i][j] = MaxINt; // 边的权值均置为极大值

}

}

cout << "请分别输入每条边的两个端点和这条边的权值(以空格作为间隔):" << endl;

for (int k = 0; k < G.arcnum; k++)

{

ArcType w;

cout << "第" << k + 1 << "条:";

cin >> va >> vb >> w; //输入一条边依附的顶点及权值

int i = LocateVex(G, va);

int j = LocateVex(G, vb);

if (i == -1 || j == -1)return(0);

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

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

}

return OK;

}

//输出邻接矩阵

Status Traverse(AMGraph G)

{

cout << "构造的邻接矩阵为:" << endl;

for (int i = 0; i < G.vexnum; i++)

{

for (int j = 0; j < G.vexnum; j++)

{

cout << G.arcs[i][j] << " ";

}

cout << endl;

}

return OK;

}

//深度优先遍历

bool visited[MVNum];

//访问标志数组,其初值为“false”

Status DFS_AM(AMGraph G, int v) {         //图G为邻接矩阵类型

int w;

cout << G.vexs[v] << "   ";  visited[v] = true;   //访问第v个顶点

for (w = 0; w < G.vexnum; w++)  //依次检查邻接矩阵v所在的行  

if ((G.arcs[v][w] != 0) && (!visited[w]))

DFS_AM(G, w);

//w是v的邻接点,如果w未访问,则递归调用DFS

return OK;

}

Status DFSTraverse(AMGraph G) {

int v;

for (v = 0; v < G.vexnum; ++v)

visited[v] = false;

for (v = 0; v < G.vexnum; ++v)

if (!visited[v]) DFS_AM(G, v);

return OK;

//对尚未访问的顶点调用DFS

}//DFSTraverse

#define QElemType int

//队列的链式存储结构

typedef struct QNode

{

QElemType data;

struct QNode *next;

}QNode, *QueuePtr;

typedef struct

{

QueuePtr front; //队头指针

QueuePtr rear; //队尾指针

}LinkQueue;

//初始化

Status InitQueue(LinkQueue &Q)

{//构造一个空队列Q

Q.front = Q.rear = new QNode; //生成新结点作为头结点,队头和队尾指针指向此结点

Q.front->next = NULL; //头结点的指针域置空

return OK;

}

//入队

Status EnQueue(LinkQueue &Q, QElemType e)

{//插入元素e为Q的新的队尾元素

QueuePtr p = new QNode; //为入队元素分配结点空间,用指针p指向

p->data = e; //将新结点数据域置为e

p->next = NULL; Q.rear->next = p; //将新结点插入到队尾

Q.rear = p; //修改队尾指针

return OK;

}

//判断队列是否为空

Status QueueEmpty(LinkQueue Q) {

//判断队列为空

if (Q.front == Q.rear)

return(true);

else

return(false);

}

//出队

Status DeQueue(LinkQueue &Q, QElemType &e)

{//删除Q的队头元素, 用e返回其值

if (Q.front == Q.rear) return ERROR; //若队列空, 则返回ERROR

QueuePtr p = Q.front->next; //p指向队头元素

e = p->data; //e保存队头元素的值

Q.front->next = p->next; //修改头指针

if (Q.rear == p) //最后一个元素被删, 队尾指针指向头结点

{

Q.rear = Q.front;

}

delete p; //释放原队头元素的空间

return OK;

}

//广度优先遍历

void BFS_AM(AMGraph G, int v)

{

int u, w;

LinkQueue Q;

cout << G.vexs[v] << "   ";  

visited[v] = true;

InitQueue(Q);   

EnQueue(Q, v);

while (!QueueEmpty(Q)) {

DeQueue(Q, u);

for (w = 0; w < G.vexnum; w++)  //依次检查邻接矩阵v所在的行  

if ((G.arcs[v][w] != 0) && (!visited[w])) {

cout << G.vexs[w] << "   ";    visited[w] = true;

EnQueue(Q, w);

}

}//while     

} //BFS

void BFSTraverse(AMGraph G) {

int v;

for (v = 0; v < G.vexnum; ++v)

visited[v] = false;

for (v = 0; v < G.vexnum; ++v)

if (!visited[v]) BFS_AM(G, v);

//对尚未访问的顶点调用BFS

}//BFSTraverse

Status main()

{

AMGraph G;

//采用邻接矩阵表示法,创建无向网

CreateUDN(G);

//输出邻接矩阵

Traverse(G);

//深度优先遍历

cout << "深度优先遍历序列为:" << endl;

DFSTraverse(G);

cout << endl;

//广度优先遍历

cout << "广度优先遍历序列为:" << endl;

BFSTraverse(G);

cout << endl;

system("pause");

return OK;

}

运行结果

 

举报

相关推荐

0 条评论