#include <stdio.h>
#include <stdlib.h>
#define MAX_NODES 100
// Graph represented as adjacency list
typedef struct Node {
int vertex;
struct Node* next;
} Node;
Node* graph[MAX_NODES];
int visited[MAX_NODES];
// Queue for BFS
typedef struct Queue {
int items[MAX_NODES];
int front;
int rear;
} Queue;
void enqueue(Queue* q, int value) {
q->items[++q->rear] = value; // add to rear
}
int dequeue(Queue* q) {
return q->items[++q->front]; // remove from front
}
int isEmpty(Queue* q) {
return q->front == q->rear;
}
Node* createNode(int v) {
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->vertex = v;
newNode->next = NULL;
return newNode;
}
void addEdge(int src, int dest) {
Node* newNode = createNode(dest);
newNode->next = graph[src];
graph[src] = newNode;
}
void bfs(int start, int n) {
Queue q;
q.front = -1;
q.rear = -1;
visited[start] = 1; // mark start visited
enqueue(&q, start); // enqueue start
while (!isEmpty(&q)) {
int current = dequeue(&q); // dequeue front
printf("%d -> ", current); // print current node
Node* temp = graph[current];
while (temp) {
if (!visited[temp->vertex]) {
visited[temp->vertex] = 1; // mark visited
enqueue(&q, temp->vertex); // enqueue neighbor
}
temp = temp->next; // move to next neighbor
}
}
printf("null\n");
}
int main() {
int n = 5; // number of nodes
// Initialize graph
for (int i = 0; i <= n; i++) {
graph[i] = NULL;
visited[i] = 0;
}
// Add edges
addEdge(1, 3);
addEdge(1, 2);
addEdge(2, 4);
addEdge(3, 5);
// Run BFS from node 1
bfs(1, n);
return 0;
}
visited[start] = 1; // mark start visited
enqueue(&q, start); // enqueue start
mark start node visited and add it to queue to begin BFS
continue until all reachable nodes are visited
int current = dequeue(&q);
remove front node from queue to process it
printf("%d -> ", current);
print current node in BFS order
while (temp) { if (!visited[temp->vertex]) { visited[temp->vertex] = 1; enqueue(&q, temp->vertex); } temp = temp->next; }
visit all unvisited neighbors, mark visited, enqueue for later processing
1 -> 2 -> 3 -> 4 -> 5 -> null