#include "graph.h" #include "linked_list.h" #include #include #include // Need to declare 'graph_delete' for use in 'graph_new' void graph_delete(Graph *g); Graph *graph_new(int n) { Graph *graph = (Graph *)malloc(sizeof(Graph)); if (!graph) return NULL; graph->vertices = (Vertex *)malloc(sizeof(Vertex) * n); if (!graph->vertices) { free(graph); return NULL; } graph->num_edges = 0; graph->num_vertices = n; for (int i = 0; i < n; i++) { graph->vertices[i].id = i; graph->vertices[i].out_neighbours = linked_list_new(); graph->vertices[i].in_neighbours = linked_list_new(); // if allocation for the linked lists failed if (!graph->vertices[i].out_neighbours || !graph->vertices[i].in_neighbours) { graph_delete(graph); return NULL; } } return graph; } void graph_add_edge(Graph *g, int i, int j) { linked_list_append(g->vertices[i].out_neighbours, &g->vertices[j]); linked_list_append(g->vertices[j].in_neighbours, &g->vertices[i]); g->num_edges++; } void graph_remove_edge(Graph *g, int i, int j) { LinkedListNode *in_node = linked_list_find( g->vertices[i].out_neighbours, &g->vertices[j]); LinkedListNode *out_node = linked_list_find( g->vertices[j].in_neighbours, &g->vertices[j]); linked_list_remove(g->vertices[i].out_neighbours, in_node); linked_list_remove(g->vertices[j].in_neighbours, out_node); g->num_edges--; } Graph *graph_read(const char *filename) { FILE *file = fopen(filename, "r"); if (!file) return NULL; char line[1024]; if (!fgets(line, sizeof(line), file)) { fclose(file); return NULL; } int n = atoi(line); if (n <= 0) { fclose(file); return NULL; } Graph *g = graph_new(n); if (!g) { fclose(file); return NULL; } for (int i = 0; i < n; i++) { if (!fgets(line, sizeof(line), file)) { fprintf(stderr, "Error: Could not read row %d\n", i); fclose(file); return g; } int j = 0; int col = 0; while (col < n && line[j] != '\0' && line[j] != '\n') { if (line[j] == '1') { graph_add_edge(g, i, col); col++; } else if (line[j] == '0') { col++; } // skip any other characters j++; } } fclose(file); return g; } void graph_print(Graph *g) { fprintf(stdout, "Number of vertices: %d\n", g->num_vertices); fprintf(stdout, "Number of edges: %d\n", g->num_edges); } void graph_delete(Graph *g) { for (int i = 0; i < g->num_vertices; i++) { linked_list_delete(g->vertices[i].in_neighbours); linked_list_delete(g->vertices[i].out_neighbours); } free(g->vertices); free(g); }