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
|
// 간선의 소멸
void RemoveEdge(ALGraph * pg, int fromV, int toV)
{
RemoveWayEdge(pg, fromV, toV);
RemoveWayEdge(pg, toV, fromV);
(pg->numE)--;
} // 인접 리스트 기반 무방향 그래프인 관계로 하나의 간선을 완전히 소멸하기 위해서는 두 개의 간선 정보를 소멸시켜야 한다.
void RecoverEdge(ALGraph * pg, int fromV, int toV, int weight)
{
LInsert(&(pg->adjList[fromV]), toV);
LInsert(&(pg->adjList[toV]), fromV);
(pg->numE)++;
} // AddEdge 함수와 달리 간선의 가중치 정보를 별도로 저장하지 않는다.
// 한쪽 방향 간선의 소멸
void RemoveWayEdge(ALGraph * pg, int fromV, int toV)
{
int edge;
// 지워질 때까지 찾아가서 삭제
if(LFirst(&(pg->adjList[fromV]), &edge))
{
if(edge == toV)
{
LRemove(&(pg->adjList[fromV]));
return;
}
while(LNext(&(pg->adjList[fromV]), &edge))
{
if(edge == toV)
{
LRemove(&(pg->adjList[fromV]));
return;
}
}
}
}
// 인자로 전달된 두 정점이 연결되어 있다면 TRUE, 그렇지 않다면 FALSE
int IsConnVertex(ALGraph * pg, int v1, int v2)
{
Stack stack;
int visitV = v1;
int nextV;
StackInit(&stack);
VisitVertex(pg, visitV);
SPush(&stack, visitV);
while(LFirst(&(pg->adjList[visitV]), &nextV) == TRUE)
{
int visitFlag = FALSE;
// 정점을 돌아다니는 도중 목표를 찾는다면 TRUE 반환
if(next == v2)
{
// 함수가 반환하기 전 초기화 진행
memset(pg->visitInfo, 0, sizeof(int)*pg->numV);
return TRUE; // 목표를 찾음
}
if(VisitVertex(pg, nextV) == TRUE)
{
SPush(&stack, visitV);
visitV = nextV;
visitFlag = TRUE;
}
else
{
while(LNext(&(pg->adjList[visitV]), &nextV) == TRUE)
{
// 정점을 돌아다니는 도중 목표를 찾는다면 TRUE 반환
if(nextV == v2)
{
// 함수가 반환하기 전 초기화 진행
memset(pf->visitInfo, 0, sizeof(int)*pg->numV);
return TRUE; // 목표 찾음
}
if(VisitVertex(pg, nextV) == TRUE)
{
SPush(&stack, visitV);
visitV = nextV;
visitFlag = TRUE;
break;
}
}
}
if(visitFlag == FALSE)
{
if(SIsEmpty(&stack) == TRUE)
break;
else
visitV = SPop(&stack);
}
}
memset(pg->visitInfo, 0, sizeof(int)*pg->numV);
return FALSE;
}
|