Initial
This commit is contained in:
commit
2b329b4031
3 changed files with 169 additions and 0 deletions
6
.gitignore
vendored
Normal file
6
.gitignore
vendored
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
*.tar.gz
|
||||||
|
build
|
||||||
|
release
|
||||||
|
docs
|
||||||
|
zig-out
|
||||||
|
zig-cache
|
59
Makefile
Normal file
59
Makefile
Normal file
|
@ -0,0 +1,59 @@
|
||||||
|
BIN := graphs
|
||||||
|
# Compiler
|
||||||
|
CC := gcc
|
||||||
|
|
||||||
|
GITHASH := $(shell git rev-parse --short HEAD)
|
||||||
|
|
||||||
|
# Compiler flags
|
||||||
|
CFLAGS := -Wall -Wextra -Wpedantic -std=c2x
|
||||||
|
|
||||||
|
# Directories
|
||||||
|
SRC_DIR := src
|
||||||
|
BUILD_DIR := build
|
||||||
|
|
||||||
|
# Source files
|
||||||
|
SRCS := $(wildcard $(SRC_DIR)/*.c)
|
||||||
|
|
||||||
|
# Header files (used for formatting)
|
||||||
|
HEADERS := $(wildcard $(SRC_DIR)/*.h)
|
||||||
|
|
||||||
|
# Object files
|
||||||
|
OBJS := $(patsubst $(SRC_DIR)/%.c,$(BUILD_DIR)/%.o,$(SRCS))
|
||||||
|
|
||||||
|
# Target executable
|
||||||
|
TARGET := $(BUILD_DIR)/$(BIN)
|
||||||
|
|
||||||
|
# Default target
|
||||||
|
all: $(TARGET)
|
||||||
|
|
||||||
|
# Rule to build the target executable
|
||||||
|
$(TARGET): $(OBJS)
|
||||||
|
$(CC) $(CFLAGS) $^ -o $@
|
||||||
|
|
||||||
|
# Rule to build object files
|
||||||
|
$(BUILD_DIR)/%.o: $(SRC_DIR)/%.c
|
||||||
|
@mkdir -p $(BUILD_DIR)
|
||||||
|
$(CC) $(CFLAGS) -c $< -o $@
|
||||||
|
|
||||||
|
# Run rule
|
||||||
|
run: $(TARGET)
|
||||||
|
./$(TARGET)
|
||||||
|
|
||||||
|
fmt:
|
||||||
|
clang-format -i $(SRCS) $(HEADERS)
|
||||||
|
|
||||||
|
# Clean rule
|
||||||
|
clean:
|
||||||
|
rm -rf $(BUILD_DIR) $(TARGET)
|
||||||
|
|
||||||
|
docs:
|
||||||
|
PROJECT_NUMBER=git-$(GITHASH) doxygen Doxyfile
|
||||||
|
|
||||||
|
cppcheck:
|
||||||
|
cppcheck --enable=all --inconclusive --std=c11 --language=c --platform=unix64 --suppress=missingIncludeSystem $(SRCS)
|
||||||
|
|
||||||
|
valgrind: $(TARGET)
|
||||||
|
valgrind --leak-check=full --show-leak-kinds=all --track-origins=yes ./$(TARGET)
|
||||||
|
|
||||||
|
# Mark rules as phony
|
||||||
|
.PHONY: all run clean docs docs
|
104
src/main.c
Normal file
104
src/main.c
Normal file
|
@ -0,0 +1,104 @@
|
||||||
|
// DFS algorithm in C
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
struct node {
|
||||||
|
int vertex;
|
||||||
|
struct node* next;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct node* createNode(int v);
|
||||||
|
|
||||||
|
struct Graph {
|
||||||
|
int numVertices;
|
||||||
|
int* visited;
|
||||||
|
|
||||||
|
// We need int** to store a two dimensional array.
|
||||||
|
// Similary, we need struct node** to store an array of Linked lists
|
||||||
|
struct node** adjLists;
|
||||||
|
};
|
||||||
|
|
||||||
|
// DFS algo
|
||||||
|
void DFS(struct Graph* graph, int vertex) {
|
||||||
|
struct node* adjList = graph->adjLists[vertex];
|
||||||
|
struct node* temp = adjList;
|
||||||
|
|
||||||
|
graph->visited[vertex] = 1;
|
||||||
|
printf("Visited %d \n", vertex);
|
||||||
|
|
||||||
|
while (temp != NULL) {
|
||||||
|
int connectedVertex = temp->vertex;
|
||||||
|
|
||||||
|
if (graph->visited[connectedVertex] == 0) {
|
||||||
|
DFS(graph, connectedVertex);
|
||||||
|
}
|
||||||
|
temp = temp->next;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create a node
|
||||||
|
struct node* createNode(int v) {
|
||||||
|
struct node* newNode = malloc(sizeof(struct node));
|
||||||
|
newNode->vertex = v;
|
||||||
|
newNode->next = NULL;
|
||||||
|
return newNode;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create graph
|
||||||
|
struct Graph* createGraph(int vertices) {
|
||||||
|
struct Graph* graph = malloc(sizeof(struct Graph));
|
||||||
|
graph->numVertices = vertices;
|
||||||
|
|
||||||
|
graph->adjLists = malloc(vertices * sizeof(struct node*));
|
||||||
|
|
||||||
|
graph->visited = malloc(vertices * sizeof(int));
|
||||||
|
|
||||||
|
int i;
|
||||||
|
for (i = 0; i < vertices; i++) {
|
||||||
|
graph->adjLists[i] = NULL;
|
||||||
|
graph->visited[i] = 0;
|
||||||
|
}
|
||||||
|
return graph;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add edge
|
||||||
|
void addEdge(struct Graph* graph, int src, int dest) {
|
||||||
|
// Add edge from src to dest
|
||||||
|
struct node* newNode = createNode(dest);
|
||||||
|
newNode->next = graph->adjLists[src];
|
||||||
|
graph->adjLists[src] = newNode;
|
||||||
|
|
||||||
|
// Add edge from dest to src
|
||||||
|
newNode = createNode(src);
|
||||||
|
newNode->next = graph->adjLists[dest];
|
||||||
|
graph->adjLists[dest] = newNode;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Print the graph
|
||||||
|
void printGraph(struct Graph* graph) {
|
||||||
|
int v;
|
||||||
|
for (v = 0; v < graph->numVertices; v++) {
|
||||||
|
struct node* temp = graph->adjLists[v];
|
||||||
|
printf("\n Adjacency list of vertex %d\n ", v);
|
||||||
|
while (temp) {
|
||||||
|
printf("%d -> ", temp->vertex);
|
||||||
|
temp = temp->next;
|
||||||
|
}
|
||||||
|
printf("\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
struct Graph* graph = createGraph(4);
|
||||||
|
addEdge(graph, 0, 1);
|
||||||
|
addEdge(graph, 0, 2);
|
||||||
|
addEdge(graph, 1, 2);
|
||||||
|
addEdge(graph, 2, 3);
|
||||||
|
|
||||||
|
printGraph(graph);
|
||||||
|
|
||||||
|
DFS(graph, 2);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
Loading…
Reference in a new issue