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