#include #include typedef struct Node { int vertex; struct Node* next; } Node; typedef struct Graph { int vertices; Node** adjList;//array of ll } Graph; Node* createNode(int vertex) { Node* newNode = (Node*)malloc(sizeof(Node)); newNode->vertex = vertex; newNode->next = NULL; return newNode; } Graph* createGraph(int vertices) //vertices is the number of vertices { Graph* graph = (Graph*)malloc(sizeof(Graph)); graph->vertices = vertices;// no of vertices bataye graph->adjList = (Node**)malloc(vertices * sizeof(Node*));//adjlist ko sahi size diya ie saare vertices for (int i = 0; i < vertices; i++) graph->adjList[i] = NULL;//default setup return graph; } void addEdgeUndirected(Graph* graph, int start, int end)//inset begin of nodes { Node* newNode = createNode(end); newNode->next = graph->adjList[start]; graph->adjList[start] = newNode; newNode = createNode(start); newNode->next = graph->adjList[end]; graph->adjList[end] = newNode; } void addEdgeDirected(Graph* graph, int start, int end) { Node* newNode = createNode(end); newNode->next = graph->adjList[start]; graph->adjList[start] = newNode; } void displayGraph(Graph* graph) { for (int i = 0; i < graph->vertices; i++) { Node* current = graph->adjList[i]; printf("Adjacency list for vertex %d: ", i); while (current != NULL) { printf("%d -> ", current->vertex); current = current->next; } printf("NULL\n"); } } int main() { int vertices, edges, i, start, end, isDirected; printf("Enter the number of vertices: "); scanf("%d", &vertices); Graph* graph = createGraph(vertices); printf("Is the graph directed? (1 for yes, 0 for no): "); scanf("%d", &isDirected); printf("Enter the number of edges: "); scanf("%d", &edges); printf("Enter the edges (start and end vertex) separated by space:\n"); for (i = 0; i < edges; i++) { scanf("%d %d", &start, &end); if (isDirected) addEdgeDirected(graph, start, end); else addEdgeUndirected(graph, start, end); } displayGraph(graph); return 0; }