-
Notifications
You must be signed in to change notification settings - Fork 0
/
graph.c
218 lines (211 loc) · 5.12 KB
/
graph.c
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
#include "stdio.h"
typedef int datatype; /*假定线性表元素的类型为整型*/
#define maxsize 1024 /*假定线性表的最大长度为1024*/
# define n 100 /* 图的顶点最大个数 */
typedef char VEXTYPE; /* 顶点的数据类型 */
typedef float ADJTYPE; /* 权值类型 */
typedef struct {
VEXTYPE vexs[n] ; /* 顶点信息数组 */
ADJTYPE arcs[n][n] ; /* 边权数组 */
int num ; /* 顶点的实际个数 */
} GRAPH;
/***********************1。置空图**********************/
void GraphInit(GRAPH *L)
{
L->num = 0;
}
/***********************2。求结点数**********************/
int GraphVexs(GRAPH *L)
{
return (L->num);
}
/***********************3。创建图**********************/
void GraphCreate(GRAPH *L)
{
int i, j;
GraphInit(L);
printf("请输入顶点数目:");
scanf("%d", &L->num);
printf("请输入各顶点的信息(单个符号):");
for (i = 0; i < L->num; i++)
{
fflush(stdin);
scanf("%c", &L->vexs[i]);
}
printf("请输入边权矩阵的信息:");
for (i = 0; i < L->num; i++)
{
for (j = 0; j < L->num; j++)
{
scanf("%f", &L->arcs[i][j]);
}
}
printf("图已经创建完毕!");
}
/***********************4。图的输出**********************/
void GraphOut(GRAPH L)
{
int i, j;
printf("\n图的顶点数目为:%d", L.num);
printf("\n图的各顶点的信息为:\n");
for (i = 0; i < L.num; i++)
printf("%c ", L.vexs[i]);
printf("\n图的边权矩阵的信息为:\n");
for (i = 0; i < L.num; i++)
{
for (j = 0; j < L.num; j++)
{
printf("%6.2f ", L.arcs[i][j]);
}
printf("\n");
}
printf("图已经输出完毕!");
}
/***********************5。图的深度周游**********************/
void DFS(GRAPH g, int qidian, int mark[])
//从第qidian个点出发深度优先周游图g中能访问的各个顶点
{
int v1;
mark[qidian] = 1;
printf("%c ", g.vexs[qidian]);
for (v1 = 0; v1 < g.num; v1++)
{
if (g.arcs[qidian][v1] != 0 && mark[v1] == 0)
DFS(g, v1, mark);
}
}
/***********************6。图的深度周游**********************/
void GraphDFS(GRAPH g)
//深度优先周游图g中能访问的各个顶点
{
int qidian, v, v1, mark[maxsize];
printf("\n深度周游:");
printf("\n请输入起点的下标:");
scanf("%d", &qidian);
for (v = 0; v < g.num; v++)
{
mark[v] = 0;
}
for (v = qidian; v < g.num + qidian; v++)
{
//printf("v=%d ",v);
v1 = v % g.num;
if (mark[v1] == 0)
DFS(g, v1, mark);
}
}
typedef int DATATYPE; //队列元素的数据类型
typedef struct
{
DATATYPE data[maxsize]; //队中元素
int front, rear; //队头元素下标、队尾元素后面位置的下标
} SEQQUEUE;
/*****************************************************************************/
void QueueInit(SEQQUEUE *sq)
//将顺序循环队列sq置空(初始化)
{
sq->front = 0;
sq->rear = 0;
}
/*****************************************************************************/
int QueueIsEmpty(SEQQUEUE sq)
//如果顺序循环队列sq为空,成功返回1,否则返回0
{
if (sq.rear == sq.front)
return (1);
else
return (0);
}
/*****************************************************************************/
int QueueFront(SEQQUEUE sq, DATATYPE *e)
//将顺序循环队列sq的队头元素保存到e所指地址,成功返回1,失败返回0
{
if (QueueIsEmpty(sq))
{ printf("queue is empty!\n"); return 0;}
else
{ *e = sq.data[(sq.front)]; return 1;}
}
/*****************************************************************************/
int QueueIn (SEQQUEUE *sq, DATATYPE x)
//将元素x入队列sq的队尾,成功返回1,失败返回0
{
if (sq->front == (sq->rear + 1) % maxsize)
{
printf("queue is full!\n");
return 0;
}
else
{
sq->data[sq->rear] = x;
sq->rear = (sq->rear + 1) % maxsize;
return (1);
}
}
/*****************************************************************************/
int QueueOut(SEQQUEUE *sq)
//将队列sq队首元素出队列,成功返回1,失败返回0
{
if (QueueIsEmpty(*sq))
{
printf("queue is empty!\n");
return 0;
}
else
{
sq->front = (sq->front + 1) % maxsize;
return 1;
}
}
/***********************7。图的广度周游**********************/
void BFS(GRAPH g, int v, int mark[])
//从v出发广度优先周游图g中能访问的各个顶点
{
int v1, v2;
SEQQUEUE q;
QueueInit(&q);
QueueIn(&q, v);
mark[v] = 1;
printf("%c ", g.vexs[v]);
while (QueueIsEmpty(q) == 0)
{
QueueFront(q, &v1);
QueueOut(&q);
for (v2 = 0; v2 < g.num; v2++)
{
if (g.arcs[v1][v2] != 0 && mark[v2] == 0)
{
QueueIn(&q, v2);
mark[v2] = 1;
printf("%c ", g.vexs[v2]);
}
}
}
}
/***********************8。图的广度周游**********************/
void GraphBFS(GRAPH g)
//深度优先周游图g中能访问的各个顶点
{
int qidian, v, v1, mark[maxsize];
printf("\n广度周游:");
printf("\n请输入起点的下标:");
scanf("%d", &qidian);
for (v = 0; v < g.num; v++)
{
mark[v] = 0;
}
for (v = qidian; v < g.num + qidian; v++)
{
v1 = v % g.num;
if (mark[v1] == 0)
BFS(g, v1, mark);
}
}
/***********************主函数**********************/
void main()
{
GRAPH tu;
GraphCreate(&tu);
GraphOut(tu);
GraphDFS(tu);
GraphBFS(tu);
}