一、建立队列
#define TRUE 1
#define FALSE 0
#define bool int
bool visited[MAX];
typedef struct QNode {
char data[MAX];
int front, rear;
}Queue;
void Initialize(Queue *q)
{
q->front = q->front = 0;
}
int is_empty(Queue q)
{
return q.front == q.rear ;
}
int is_full(Queue q)
{
return q.front == (q.rear+1)%MAX;
}
void Enqueue(int x, Queue *q)
{
if(!is_full(*q)){
q->data[q->rear] = x;
q->rear = (q->rear+1)%MAX;
}
}
void Dequeue(Queue *q)
{
if(!is_empty(*q)){
q->front = (q->front+1)%MAX;
}
}
int q_front(Queue q)
{
if(!is_empty(q)){
return q.data[q.front];
}
}
二、 DFS(深度优先搜索
void DFS(LGraph g, int i)
{
visited[i] = TRUE;
printf("%c ", g.vex[i].data);
ENode* p;
p = g.vex[i].first_edge;
while (p != NULL) {
if (!visited[p->ivex])
DFS(g, p->ivex);
p = p->next_edge;
}
}
void DFSTrv(LGraph g)
{
int i;
for (i = 0; i < g.vexnum; i++) {
visited[i] = FALSE;
}
for (i = 0; i < g.vexnum; i++) {
if (!visited[i]) {
DFS(g, i);
}
}
}
三、BFS(广度优先搜索)
void BFS(LGraph g, int k)
{
Queue q;
int i;
ENode* p;
Initialize(&q);
visited[k] = TRUE;
printf("%c", g.vex[k].data);
Enqueue(k, &q);
while(!is_empty(q)){
i = q_front(q);
Dequeue(&q);
p = g.vex[i].first_edge;
while(p != NULL){
if(!visited[p->ivex]){
Enqueue(p->ivex, &q);
printf("%c",g.vex[p->ivex].data);
visited[p->ivex] = TRUE;
}
p = p->next_edge;
}
}
}
void BFSTrv(LGraph g)
{
int i;
for (i = 0; i < g.vexnum; i++) {
visited[i] = FALSE;
}
//BFS(g, 0); 如果图连通则从任意顶点都可以 访问所有的顶点
//下面是不连通时候的 搜索
for (i = 0; i < g.vexnum; i++) {
if (!visited[i])
BFS(g, i);
}
}
邻接表 的 DFS 与 BFS
最新推荐文章于 2022-06-06 20:40:21 发布