Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 5ef2cc6

Browse files
Create TopologicalSort.c
1 parent 01e6651 commit 5ef2cc6

File tree

1 file changed

+169
-0
lines changed

1 file changed

+169
-0
lines changed

‎Algorithm/TopologicalSort.c

Lines changed: 169 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,169 @@
1+
#include <stdio.h>
2+
#include <stdlib.h>
3+
4+
#define MAX_VERTICES 50
5+
6+
typedef struct GraphNode {
7+
int vertex;
8+
struct GraphNode* link;
9+
} GraphNode;
10+
11+
typedef struct GraphType {
12+
int n;
13+
GraphNode* adj_list[MAX_VERTICES];
14+
} GraphType;
15+
16+
17+
void graph_init(GraphType* g) {
18+
g->n = 0;
19+
for (int v = 0; v < MAX_VERTICES; v++) {
20+
g->adj_list[v] = NULL;
21+
}
22+
}
23+
24+
25+
void insert_vertext(GraphType* g, int v) {
26+
if ((g->n + 1) > MAX_VERTICES) {
27+
fprintf(stderr, "그래프: 정점의 개수 초과");
28+
return;
29+
}
30+
31+
g->n++;
32+
}
33+
34+
35+
void insert_edge(GraphType* g, int u, int v) {
36+
GraphNode* node;
37+
if (u >= g->n || v >= g->n) {
38+
fprintf(stderr, "그래프: 정점 번호 오류");
39+
return;
40+
}
41+
42+
node = (GraphNode*)malloc(sizeof(GraphNode));
43+
node->vertex = v;
44+
node->link = g->adj_list[u];
45+
g->adj_list[u] = node;
46+
}
47+
48+
49+
#define MAX_STACK_SIZE 100
50+
typedef int element;
51+
typedef struct {
52+
element stack[MAX_STACK_SIZE];
53+
int top;
54+
} StackType;
55+
56+
57+
void stack_init(StackType* s) {
58+
s->top = -1;
59+
}
60+
61+
62+
int is_empty(StackType* s) {
63+
return (s->top == -1);
64+
}
65+
66+
67+
int is_full(StackType* s) {
68+
return (s->top == (MAX_STACK_SIZE - 1));
69+
}
70+
71+
72+
void push(StackType* s, element item) {
73+
if (is_full(s)) {
74+
fprintf(stderr, "스택 포화 에러\n");
75+
return;
76+
}
77+
else{
78+
s->stack[++(s->top)] = item;
79+
}
80+
}
81+
82+
83+
element pop(StackType* s) {
84+
if (is_empty(s)) {
85+
fprintf(stderr, "스택 공백 에러\n");
86+
exit(1);
87+
}
88+
else {
89+
return s->stack[(s->top)--];
90+
}
91+
}
92+
93+
94+
int topo_sort(GraphType* g) {
95+
int i;
96+
StackType s;
97+
GraphNode* node;
98+
99+
int* in_degree = (int*)malloc(g->n * sizeof(int));
100+
for (i = 0; i < g->n; i++) {
101+
in_degree[i] = 0;
102+
}
103+
104+
for (i = 0; i < g->n; i++) {
105+
GraphNode* node = g->adj_list[i];
106+
while (node != NULL) {
107+
in_degree[node->vertex]++;
108+
node = node->link;
109+
}
110+
}
111+
112+
stack_init(&s);
113+
114+
for (i = 0; i < g->n; i++) {
115+
if (in_degree[i] == 0) {
116+
push(&s, i);
117+
}
118+
}
119+
120+
while (!is_empty(&s)) {
121+
int w = pop(&s);
122+
printf("v[%d] -> ", w);
123+
node = g->adj_list[w];
124+
while (node != NULL) {
125+
int u = node->vertex;
126+
in_degree[u]--;
127+
128+
if (in_degree[u] == 0) {
129+
push(&s, u);
130+
}
131+
132+
node = node->link;
133+
}
134+
}
135+
136+
free(in_degree);
137+
printf("X\n");
138+
139+
return (i == g->n);
140+
}
141+
142+
int main(void) {
143+
GraphType g;
144+
145+
graph_init(&g);
146+
insert_vertext(&g, 0);
147+
insert_vertext(&g, 1);
148+
insert_vertext(&g, 2);
149+
insert_vertext(&g, 3);
150+
insert_vertext(&g, 4);
151+
insert_vertext(&g, 5);
152+
153+
insert_edge(&g, 0, 2);
154+
insert_edge(&g, 0, 3);
155+
156+
insert_edge(&g, 1, 3);
157+
insert_edge(&g, 1, 4);
158+
159+
insert_edge(&g, 2, 3);
160+
insert_edge(&g, 2, 5);
161+
162+
insert_edge(&g, 3, 5);
163+
164+
insert_edge(&g, 4, 5);
165+
166+
topo_sort(&g);
167+
168+
return 0;
169+
}

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /