Data Structure
 Networking
 RDBMS
 Operating System
 Java
 MS Excel
 iOS
 HTML
 CSS
 Android
 Python
 C Programming
 C++
 C#
 MongoDB
 MySQL
 Javascript
 PHP
- Selected Reading
 - UPSC IAS Exams Notes
 - Developer's Best Practices
 - Questions and Answers
 - Effective Resume Writing
 - HR Interview Questions
 - Computer Glossary
 - Who is Who
 
Implementation of DFS using C language
Depth First Search (DFS) is an algorithm that traverses a graph, visiting all nodes before backtracking. It can also determine whether a path exists between two nodes. DFS begins at the root node and explores as far as possible along each branch before backtracking. DFS searches a graph or tree in a depth-wise manner.
Algorithm
Given below is an algorithm for the implementation of the Depth First Search (DFS) ?
- 
        
Step 1 ? Initially stack is empty.
 - 
        
Step 2 ? If a node to be visited is not already in the stack, we push it onto the stack and mark it as visited.
 - 
        
Step 3 ? Next, check whether the current node matches our search criteria.
 - 
        
Step 3.1 ? If it is present, then our task is done.
 - 
        
Step 4 ? Otherwise, we need to visit all the adjacent nodes of the current node.
 - 
        
Step 4.1 ? Then visit all such nodes in any random order and continue searching.
 - 
        
Step 5 ? If all adjacent nodes have been visited, it becomes a dead end.
 - 
        
Step 6 ? We return to the previously visited node and pop the most recent node from the stack.
 - 
        
Step 7 ? The algorithm will terminate when all nodes have been searched or the desired result is found.
 
Depth First Search (DFS)
Here is a C program for implementing Depth First Search(DFS). This program uses a stack to traverse a graph, adding edges and vertices, marking the nodes and displaying them.
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#define MAX 5
void addVertex(char);
void addEdge(int, int);
void displayVertex(int);
void depthFirstSearch();
int getAdjUnvisitedVertex(int);
struct Vertex {
   char label;
   bool visited;
};
// stack variables
int stack[MAX];
int top = -1;
// graph variables
// array of vertices
struct Vertex* lstVertices[MAX];
// adjacency matrix
int adjMatrix[MAX][MAX];
// vertex count
int vertexCount = 0;
// stack functions
void push(int item) { stack[++top] = item; }
int pop() { return stack[top--]; }
int peek() { return stack[top]; }
bool isStackEmpty() { return top == -1; }
// graph functions
// add vertex to the vertex list
void addVertex(char label) {
   struct Vertex* vertex = (struct Vertex*)malloc(sizeof(struct Vertex));
   vertex->label = label;
   vertex->visited = false;
   lstVertices[vertexCount++] = vertex;
}
// add edge to edge array
void addEdge(int start, int end) {
   adjMatrix[start][end] = 1;
   adjMatrix[end][start] = 1;
}
// display the vertex
void displayVertex(int vertexIndex) {
   printf("%c ", lstVertices[vertexIndex]->label);
}
// get the adjacent unvisited vertex
int getAdjUnvisitedVertex(int vertexIndex) {
   int i;
   for (i = 0; i < vertexCount; i++) {
      if (adjMatrix[vertexIndex][i] == 1 && lstVertices[i]->visited == false) {
         return i;
      }
   }
   return -1;
}
void depthFirstSearch() {
   int i;
   // mark first node as visited
   lstVertices[0]->visited = true;
   // display the vertex
   displayVertex(0);
   // push vertex index in stack
   push(0);
   while (!isStackEmpty()) {
      // get the unvisited vertex of vertex which is at top of the stack
      int unvisitedVertex = getAdjUnvisitedVertex(peek());
      // no adjacent vertex found
      if (unvisitedVertex == -1) {
         pop();
      } else {
         lstVertices[unvisitedVertex]->visited = true;
         displayVertex(unvisitedVertex);
         push(unvisitedVertex);
      }
   }
   // stack is empty, search is complete, reset the visited flag
   for (i = 0; i < vertexCount; i++) {
      lstVertices[i]->visited = false;
   }
}
int main() {
   int i, j;
   for (i = 0; i < MAX; i++)     // set adjacency {
      for (j = 0; j < MAX; j++)  // matrix to 0
         adjMatrix[i][j] = 0;
   addVertex('S');  // 0
   addVertex('A');  // 1
   addVertex('B');  // 2
   addVertex('C');  // 3
   addVertex('D');  // 4
   addEdge(0, 1);  // S - A
   addEdge(0, 2);  // S - B
   addEdge(0, 3);  // S - C
   addEdge(1, 4);  // A - D
   addEdge(2, 4);  // B - D
   addEdge(3, 4);  // C - D
   printf("Depth First Search: ");
   depthFirstSearch();
   return 0;
}
Output
When the above program is executed, it produces the following result ?
Depth First Search: S A D B C