exp 13: init

Signed-off-by: Amneesh Singh <natto@weirdnatto.in>
This commit is contained in:
2022-12-29 18:15:25 +05:30
parent 6e31a2402f
commit 158a5eeadb
2 changed files with 136 additions and 0 deletions

136
13.c Normal file
View File

@@ -0,0 +1,136 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct Node node;
struct Node {
int vertex;
struct Node *next;
};
typedef struct List list;
struct List {
node *head;
node *tail;
};
typedef struct Graph graph;
struct Graph {
int nvertices;
int *visited;
list *vertices;
};
graph *init_graph(int n) {
graph *graph = malloc(sizeof(struct Graph));
graph->nvertices = n;
graph->vertices = malloc(n * sizeof(struct List));
graph->visited = malloc(n * sizeof(int));
memset(graph->visited, 0, sizeof(int) * n);
return graph;
}
void insert(list *list, int vertex) {
node *new = malloc(sizeof(struct Node));
new->next = NULL;
new->vertex = vertex;
if (!list->head)
list->head = list->tail = new;
else
list->tail->next = new, list->tail = new;
}
void pop(list *list) {
if (!list->head)
return;
node *next = list->head->next;
free(list->head);
if (!next)
list->tail = next;
list->head = next;
}
void add_edge(graph *graph, int src, int dst) {
insert(&graph->vertices[src], dst);
insert(&graph->vertices[dst], src);
}
void dfs(struct Graph *graph, int vertex) {
list list = graph->vertices[vertex];
printf("%d ", vertex);
graph->visited[vertex] = 1;
node *cur = list.head;
while (cur) {
if (!graph->visited[cur->vertex])
dfs(graph, cur->vertex);
cur = cur->next;
}
}
void bfs(struct Graph *graph, int _vertex) {
list next;
next.head = next.tail = NULL;
graph->visited[_vertex] = 1;
insert(&next, _vertex);
while (next.head) {
int vertex = next.head->vertex;
list list = graph->vertices[vertex];
node *cur = list.head;
printf("%d ", vertex);
pop(&next);
while (cur) {
if (!graph->visited[cur->vertex]) {
graph->visited[cur->vertex] = 1;
insert(&next, cur->vertex);
}
cur = cur->next;
}
}
}
int main() {
const int ROOT = 0;
const int SIZE = 5;
struct Graph *graph = init_graph(SIZE);
add_edge(graph, 0, 1);
add_edge(graph, 0, 3);
add_edge(graph, 0, 4);
add_edge(graph, 2, 3);
add_edge(graph, 1, 3);
printf("DFS: ");
dfs(graph, ROOT);
printf("\n");
memset(graph->visited, 0, sizeof(int) * graph->nvertices);
printf("BFS: ");
bfs(graph, ROOT);
printf("\n");
// free
for (int i = 0; i < graph->nvertices; i++)
while(graph->vertices[i].head)
pop(&graph->vertices[i]);
free(graph->visited);
free(graph->vertices);
free(graph);
return 0;
}

BIN
13.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.4 KiB