实验目标:

(1)在图G的顶点数组中查找顶点V,返回顶点的下标

(2)采用邻接矩阵表示法,构造无向网G

(3)显示图G的邻接矩阵,即按行列输出二维数组

(4)求顶点v在图G中的第一个邻接点

(5)求顶点v在图G中邻接点w的下一个邻接点

(6)对图G进行深度优先遍历

(7)从v顶点出发对图G进行深度优先遍历的递归算法

(8)对图G进行广度优先遍历


实验代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
#include <bits/stdc++.h>
using namespace std;

#define INFINITY 0x7fffffff
#define MAX_VERTEX_NUM 20
#define MAXQSIZE 20
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0

typedef char VertexType;
typedef enum {UDN} GraphKind;
bool visited[MAX_VERTEX_NUM];

typedef struct
{
VertexType vexs[MAX_VERTEX_NUM];
int arcs[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
int vexnum, arcnum;
GraphKind kind;
} MGraph;

typedef struct
{
int *base;
int front, rear;
} SqQueue;

int InitQueue ( SqQueue &Q )
{
//构造一个空队列Q
Q.base = new int[MAXQSIZE];
if ( !Q.base ) exit ( 0 );
Q.front = Q.rear = 0;
return OK;
}

int EnQueue ( SqQueue &Q, int e )
{
//插入元素e为Q的新的队尾元素
if ( ( Q.rear + 1 ) % MAXQSIZE == Q.front )
return 0;
Q.base[Q.rear] = e;
Q.rear = ( Q.rear + 1 ) % MAXQSIZE;
return OK;
}

int DeQueue ( SqQueue &Q, int &e )
{
//删除Q的队头元素,用e返回其值
if ( Q.front == Q.rear ) return 0;
e = Q.base[Q.front];
Q.front = ( Q.front + 1 ) % MAXQSIZE;
return OK;

}

int QueueEmpty ( SqQueue &Q )
{
if ( Q.front == Q.rear ) return true;
else return 0;
}

int LocateVex ( MGraph G, VertexType v )// 在图 G 的顶点数组中查找顶点 V,返回顶点的下标
{
for ( int i = 0; i < G.vexnum; ++i )
if ( G.vexs[i] == v )
return i;
return -1;
}

bool CreateUDN ( MGraph &G )//采用邻接矩阵表示法,构造无向网 G
{
int i, j, k;
cout << "请输入总顶点数,总边数,以空格隔开:";
cin >> G.vexnum >> G.arcnum;
cout << endl;

cout << "输入点的名称,如a" << endl;

for ( i = 0; i < G.vexnum; ++i ){
cout << "请输入第" << ( i + 1 ) << "个点的名称:";
cin >> G.vexs[i];
}

cout << endl;

for ( i = 0; i < G.vexnum; ++i )
for ( j = 0; j < G.vexnum; ++j )
G.arcs[i][j] = INFINITY;

cout << "输入边依附的顶点及权值,如 a b 5" << endl;

for ( k = 0; k < G.arcnum; ++k )
{
VertexType v1, v2;
int w;
cout << "请输入第" << ( k + 1 ) << "条边依附的顶点及权值:";
cin >> v1 >> v2 >> w;
i = LocateVex ( G, v1 );
j = LocateVex ( G, v2 );
G.arcs[i][j] = w;
G.arcs[j][i] = G.arcs[i][j];
}
return OK;
}


void Display ( MGraph G )//显示图 G 的邻接矩阵,即按行列输出二维数组
{
for ( int i = 0; i < G.vexnum; ++i )
{
for ( int j = 0; j < G.vexnum; ++j )
{
if ( G.arcs[i][j] != 0x7fffffff )
cout <<setw(5)<< G.arcs[i][j];
else
cout <<setw(5)<< "0";
}
cout << endl;
}
}


int FirstAdjVex ( MGraph G, int v )//求顶点 v 在图 G 中的第一个邻接点
{
int i;
for ( i = 0; i < G.vexnum; i++ )
{
if ( G.arcs[v][i] && visited[i] == false );
return i;
}

if ( i == G.vexnum )
return -1;
}

int NextAdjVex ( MGraph G, int v, int w )//求顶点 v 在图 G 中邻接点 w 的下一个邻接点
{
int i;
for ( i = w - 1; i < G.vexnum; i++ )
if ( G.arcs[v][i] && visited[i] == false )
return i;
if ( i == G.vexnum )
return -1;

}

void DFS ( MGraph G, int v )//从 v 顶点出发对图 G 进行深度优先遍历的递归算法
{
cout << G.vexs[v] << " ";
visited[v] = 1;
for ( int w = 1; w <= G.vexnum; w++ )
if ( ( G.arcs[v][w] != 0 ) && ( !visited[w] ) )
DFS ( G, w );
}

void DFSTraverse ( MGraph G )// 对图 G 进行深度优先遍历
{
int v;
for ( v = 0; v < G.vexnum; ++v )
visited[v] = 0;
for ( v = 0; v < G.vexnum; ++v )
if ( !visited[v] )
DFS ( G, v );
}

void BFSTraverse ( MGraph G )//对图 G 进行广度优先遍历
{
SqQueue Q;
int v, u, w;
for ( v = 0; v < G.vexnum; ++v )
visited[v] = false;
InitQueue ( Q );

for ( v = 0; v < G.vexnum; ++v )
{
if ( !visited[v] )
{
visited[v] = true;
cout << G.vexs[v] << " ";
EnQueue ( Q, v );
while ( !QueueEmpty ( Q ) )
{
DeQueue ( Q, u );
for ( w = FirstAdjVex ( G, u ); w >= 0; w = NextAdjVex ( G, u, 1 ) )
{
if ( !visited[w] )
{
visited[w] = true;
cout << G.vexs[w] << " ";
EnQueue ( Q, w );
}
}
}
}
}
}
int main ( void )
{
MGraph G;
int c = 0;
while ( c != 5 )
{
cout << endl << "1. 采用邻接矩阵表示法,构造无向网G";
cout << endl << "2. 显示图G的邻接矩阵,即按行列输出二维数组";
cout << endl << "3. 对图G进行深度优先遍历";
cout << endl << "4. 对图G进行广度优先遍历";
cout << endl << "0. 退出";
cout << endl << "请输入您的选择:";
cin >> c;
switch ( c )
{
case 1:
CreateUDN ( G );
break;
case 2:
Display ( G );
break;
case 3:
DFSTraverse ( G );
break;
case 4:
BFSTraverse ( G );
break;
case 0:
exit(0);
}
}
}