commit 2b329b403170e547bfc59410fa70394e653b314e Author: Imbus <> Date: Sun May 26 12:30:10 2024 +0200 Initial diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..d28b788 --- /dev/null +++ b/.gitignore @@ -0,0 +1,6 @@ +*.tar.gz +build +release +docs +zig-out +zig-cache diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..91a48c6 --- /dev/null +++ b/Makefile @@ -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 diff --git a/src/main.c b/src/main.c new file mode 100644 index 0000000..cda6155 --- /dev/null +++ b/src/main.c @@ -0,0 +1,104 @@ +// DFS algorithm in C + +#include +#include + +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; +}