그래프 탐색 및 순회 중에서 깊이 우선 탐색에 대해 알아보자.
void DFS(int v)
{
node_pointer w;
visited[v] = TURE;
printf("%d", v);
for (w = graph[v]; w; w = w->link)
{
if (!visited[w->vertex])
DFS(w->vertex);
}
}
🤷♂️ 전역 변수 visited[]를 false로 초기화한다. 해더 노드 배열은 graph[]이며, 각 노드에는 vertex 필드와 link 필드가 있다.
#include <stdio.h>
#include <memory.h>
#include <stdlib.h>
#include <stdbool.h>
#define MAX_VERTEX 10
#define FALSE 0
#define TURE 1
typedef struct GraphNode
{
int vertex;
struct GraphNode* link;
}GraphNode;
typedef struct GraphType
{
int n;
GraphNode* adjust_H[MAX_VERTEX];
int visted[MAX_VERTEX];
}GraphType;
typedef struct StackNode
{
int data;
struct StackNode* link;
}StackNode;
StackNode* top;
void push(int item)
{
StackNode* temp = (StackNode*)malloc(sizeof(StackNode));
temp->data = item;
temp->link = top;
top = temp;
}
int pop()
{
int item;
StackNode* temp = top;
if (top == NULL)
{
printf("\n\n Stack is empty ! \n");
return 0;
}
else
{
item = temp->data;
top = temp->link;
free(temp);
return item;
}
}
void createGraph(GraphType* g)
{
int v;
g->n = 0;
for (v = 0; v < MAX_VERTEX; v++)
{
g->visted[v] = FALSE;
g->adjust_H[v] = NULL;
}
}
void insertVertex(GraphType* g, int v)
{
if ((g->n) + 1 > MAX_VERTEX)
{
printf("\n 그래프 정점의 개수를 초과하였습니다!");
return;
}
g->n++;
}
void insertEdge(GraphType* g, int u, int v)
{
GraphNode* node;
if (u >= g->n || v >= g->n)
{
printf("\n 그래프에 없는 정점입니다.");
return;
}
node = (GraphNode*)malloc(sizeof(GraphNode));
node->vertex = v;
node->link = g->adjust_H[u];
}
void printAdjList(GraphType* g)
{
int i;
GraphNode* p;
for (i = 0; i < g->n; i++)
{
printf("\n\t\t정점%c의 인접리스트 ", i + 65);
p = g->adjust_H[i];
}
while (p)
{
printf(" -> %c", p->vertex + 65);
p = p->link;
}
}
void dfsAdjList(GraphType* g, int v)
{
GraphNode* w;
top = NULL;
push(v);
g->visted[v] = TURE;
printf("%c", v + 65);
while (top != NULL)
{
w = g->adjust_H[v];
while (w)
{
if (!g->visted[w->vertex])
{
push(w->vertex);
g->visted[w->vertex] = TURE;
printf("%c", w->vertex + 65);
v = w->vertex;
w = g->adjust_H[v];
}
else
{
w = w->link;
}
v = pop();
}
}
}
int main()
{
int i;
GraphType* G;
G = (GraphType*)malloc(sizeof(GraphType));
createGraph(G);
for (i = 0; i < 6; i++)
{
insertVertex(G, i);
}
insertEdge(G, 0, 4);
insertEdge(G, 0, 1);
insertEdge(G, 1, 3);
insertEdge(G, 1, 2);
insertEdge(G, 1, 0);
insertEdge(G, 2, 4);
insertEdge(G, 2, 3);
insertEdge(G, 2, 1);
insertEdge(G, 3, 2);
insertEdge(G, 3, 1);
insertEdge(G, 4, 5);
insertEdge(G, 4, 2);
insertEdge(G, 4, 0);
insertEdge(G, 5, 4);
printf("%n G의 인접리스트 ");
printAdjList(G);
printf("\n\n 깊이우선탐색 >> ");
dfsAdjList(G, 0);
getchar();
}
https://currygamedev.tistory.com/10
https://wookkingkim.tistory.com/32