codetantra lab program DSA2
codetantra lab program DSA2
IV/2nd YEAR/CSE
Expected Output:
Pre-Order Traversal: 10 5 2 7 15 12 20
Expected Output:
Pre-Order Traversal:
#include <stdio.h>
#include <stdlib.h>
struct Node {
int data;
struct Node* left;
struct Node* right;
};
struct Node* createNode(int data) {
struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));
newNode->data = data;
newNode->left = newNode->right = NULL;
return newNode;
}
struct Node* constructTree() {
int data;
printf("Enter data for node (-1 for no node): ");
scanf("%d", &data);
if (data == -1)
return NULL;
struct Node* newNode = createNode(data);
printf("Enter left child of %d\n", data);
newNode->left = constructTree();
printf("Enter right child of %d\n", data);
newNode->right = constructTree();
return newNode;
}
void preorderTraversal(struct Node* root) {
if (root == NULL)
return;
printf("%d ", root->data);
preorderTraversal(root->left);
preorderTraversal(root->right);
}
int main() {
struct Node* root = NULL;
printf("Construct the binary tree:\n");
root = constructTree();
printf("Pre-Order Traversal: ");
preorderTraversal(root);
printf("\n");
return 0;
}
Test Cases
Output:
Pre-Order Traversal: 1 2 4 5 3 6 7
Input:
Construct the binary tree:
Enter data for node (-1 for no node): 1
Enter left child of 1
Enter data for node (-1 for no node): 2
Enter left child of 2
Enter data for node (-1 for no node): 3
Enter left child of 3
Enter data for node (-1 for no node): 4
Enter left child of 4
Enter data for node (-1 for no node): -1
Enter right child of 4
Enter data for node (-1 for no node): -1
Enter right child of 3
Enter data for node (-1 for no node): -1
Enter right child of 2
Enter data for node (-1 for no node): -1
Enter right child of 1
Enter data for node (-1 for no node): -1
Output:
Pre-Order Traversal: 1 2 3 4
return newNode;
}
// Function for post-order traversal
void postorderTraversal(struct Node* root) {
if (root == NULL)
return;
postorderTraversal(root->left);
postorderTraversal(root->right);
printf("%d ", root->data);
}
int main() {
struct Node* root = NULL;
// Build the tree with user input
printf("Construct the binary tree:\n");
root = constructTree();
// Perform post-order traversal
printf("Post-Order Traversal: ");
postorderTraversal(root);
printf("\n");
return 0;
}
Test Case 1:
Input:
Enter data for node (-1 for no node): 1
Enter left child of 1
Enter data for node (-1 for no node): 2
Enter left child of 2
Enter data for node (-1 for no node): 4
Enter left child of 4
Enter data for node (-1 for no node): -1
Enter right child of 4
Enter data for node (-1 for no node): -1
Enter right child of 2
Enter data for node (-1 for no node): 5
Enter left child of 5
Enter data for node (-1 for no node): -1
Enter right child of 5
Enter data for node (-1 for no node): -1
Enter right child of 1
Enter data for node (-1 for no node): 3
Enter left child of 3
Enter data for node (-1 for no node): -1
Enter right child of 3
Enter data for node (-1 for no node): -1
Output:
Post-Order Traversal: 4 5 2 3 1
Test Case 2
Input:
Enter data for node (-1 for no node): 10
Enter left child of 10
Enter data for node (-1 for no node): 20
Enter left child of 20
Enter data for node (-1 for no node): 40
Enter left child of 40
Enter data for node (-1 for no node): -1
Enter right child of 40
Enter data for node (-1 for no node): -1
Enter right child of 20
Enter data for node (-1 for no node): 50
Enter left child of 50
Enter data for node (-1 for no node): -1
Enter right child of 50
Enter data for node (-1 for no node): -1
Enter right child of 10
Enter data for node (-1 for no node): 30
Enter left child of 30
Enter data for node (-1 for no node): 60
Enter left child of 60
Enter data for node (-1 for no node): -1
Enter right child of 60
Enter data for node (-1 for no node): -1
Enter right child of 30
Enter data for node (-1 for no node): 70
Enter left child of 70
Enter data for node (-1 for no node): -1
Enter right child of 70
Enter data for node (-1 for no node): -1
Output:
Post-Order Traversal: 40 50 20 60 70 30 10
Test Case 3:
Input:
Enter data for node (-1 for no node): 5
Enter left child of 5
Enter data for node (-1 for no node): 3
Enter left child of 3
Enter data for node (-1 for no node): -1
Enter right child of 3
Enter data for node (-1 for no node): 4
Enter left child of 4
Enter data for node (-1 for no node): -1
Enter right child of 4
Enter data for node (-1 for no node): -1
Enter right child of 5
Enter data for node (-1 for no node): 8
Enter left child of 8
Enter data for node (-1 for no node): 6
Enter left child of 6
Enter data for node (-1 for no node): -1
Enter right child of 6
Enter data for node (-1 for no node): 7
Enter left child of 7
Enter data for node (-1 for no node): -1
Enter right child of 7
Enter data for node (-1 for no node): -1
Enter right child of 8
Enter data for node (-1 for no node): 9
Enter left child of 9
Enter data for node (-1 for no node): -1
Enter right child of 9
Enter data for node (-1 for no node): -1
Output:
Post-Order Traversal: 4 3 7 6 9 8 5
#include <stdio.h>
#include <stdlib.h>
// Main function
int main() {
struct Node* root = NULL;
int choice, value, searchValue;
while (1) {
printf("\nEnter your choice: ");
scanf("%d", &choice);
switch (choice) {
case 1:
printf("Enter value to insert: ");
scanf("%d", &value);
root = insertNode(root, value);
break;
case 2:
printf("In-order Traversal: ");
inOrder(root);
printf("\n");
break;
case 3:
printf("Pre-order Traversal: ");
preOrder(root);
printf("\n");
break;
case 4:
printf("Post-order Traversal: ");
postOrder(root);
printf("\n");
break;
case 5:
printf("Enter value to search: ");
scanf("%d", &searchValue);
if (searchNode(root, searchValue)) {
printf("Value %d found in the tree.\n", searchValue);
} else {
printf("Value %d not found in the tree.\n", searchValue);
}
break;
case 6:
printf("Exiting...\n");
exit(0);
default:
printf("Invalid choice! Please try again.\n");
}
}
return 0;
}
Test Case 1:
Binary Tree Menu:
1. Insert Node
2. In-order Traversal
3. Pre-order Traversal
4. Post-order Traversal
5. Search for a Node
6. Exit
Test Case 2:
Binary Tree Menu:
1. Insert Node
2. In-order Traversal
3. Pre-order Traversal
4. Post-order Traversal
5. Search for a Node
6. Exit
#include <stdio.h>
#include <stdlib.h>
struct Node {
int data;
struct Node* left;
struct Node* right;
};
// Function to create a new node
struct Node* createNode(int data) {
struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));
newNode->data = data;
newNode->left = newNode->right = NULL;
return newNode;
}
// Function to construct the tree by taking user input
struct Node* constructTree() {
int data;
printf("Enter data for node (-1 for no node): ");
scanf("%d", &data);
// If the user enters -1, return NULL (no node)
if (data == -1)
return NULL;
struct Node* newNode = createNode(data);
printf("Enter left child of %d\n", data);
newNode->left = constructTree();
printf("Enter right child of %d\n", data);
newNode->right = constructTree();
return newNode;
}
// Function to count the total number of nodes
int countNodes(struct Node* root) {
if (root == NULL)
return 0;
return 1 + countNodes(root->left) + countNodes(root->right);
}
int main() {
struct Node* root = NULL;
// Build the tree with user input
printf("Construct the binary tree:\n");
root = constructTree();
// Count and display the total number of nodes
printf("Total number of nodes: %d\n", countNodes(root));
return 0;
}
Test Case 1:
Input:
Enter data for node (-1 for no node): 1
Enter left child of 1
Enter data for node (-1 for no node): 2
Enter left child of 2
Enter data for node (-1 for no node): 4
Enter left child of 4
Enter data for node (-1 for no node): -1
Enter right child of 4
Enter data for node (-1 for no node): -1
Enter right child of 2
Enter data for node (-1 for no node): 5
Enter left child of 5
Enter data for node (-1 for no node): -1
Enter right child of 5
Enter data for node (-1 for no node): -1
Enter right child of 1
Enter data for node (-1 for no node): 3
Enter left child of 3
Enter data for node (-1 for no node): -1
Enter right child of 3
Enter data for node (-1 for no node): -1
Test Case 3:
Input:
Enter data for node (-1 for no node): 5
Enter left child of 5
Enter data for node (-1 for no node): 8
Enter left child of 8
Enter data for node (-1 for no node): 12
Enter left child of 12
Enter data for node (-1 for no node): -1
Enter right child of 12
Enter data for node (-1 for no node): -1
Enter right child of 8
Enter data for node (-1 for no node): 15
Enter left child of 15
Enter data for node (-1 for no node): -1
Enter right child of 15
Enter data for node (-1 for no node): -1
Enter right child of 5
Enter data for node (-1 for no node): 10
Enter left child of 10
Enter data for node (-1 for no node): -1
Enter right child of 10
Enter data for node (-1 for no node): -1
Total number of nodes: 6
struct Node {
int data;
struct Node* left;
struct Node* right;
};
// Function to insert nodes into the binary tree (creating a simple binary tree)
struct Node* insertNode(struct Node* root, int data) {
if (root == NULL) {
return createNode(data);
}
printf("Do you want to add %d to the left (L) or right (R) of %d? ", data, root->data);
char choice;
scanf(" %c", &choice); // Space before %c to capture any leftover newline character
int main() {
int n, data;
if (n <= 0) {
printf("Invalid number of nodes.\n");
return 0;
}
return 0;
}
Test case 1 :
Enter the number of nodes: 3
Enter the root node value: 1
Enter data for node 2: 2
Do you want to add 2 to the left (L) or right (R) of 1? L
Enter data for node 3: 3
Do you want to add 3 to the left (L) or right (R) of 1? R
Height of the tree: 2
Test Case 2:
Enter the number of nodes: 5
Enter the root node value: 10
Enter data for node 2: 20
Do you want to add 20 to the left (L) or right (R) of 10? L
Enter data for node 3: 30
Do you want to add 30 to the left (L) or right (R) of 20? L
Enter data for node 4: 40
Do you want to add 40 to the left (L) or right (R) of 30? L
Enter data for node 5: 50
Do you want to add 50 to the left (L) or right (R) of 40? L
Height of the tree: 5
Test Case 3:
Enter the number of nodes: 0
Invalid number of nodes.
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <math.h> // Include math.h for abs() function
struct Node {
int data;
struct Node* left;
struct Node* right;
};
char choice;
printf("Do you want to add %d to the left (L) or right (R) of %d? ", data, root->data);
scanf(" %c", &choice); // Space before %c to capture any leftover newline character
int main() {
int i,n, data;
Test Case 1:
Enter the number of nodes: 5
Enter the root node value: 1
Enter data for node 2: 2
Do you want to add 2 to the left (L) or right (R) of 1? L
Enter data for node 3: 3
Do you want to add 3 to the left (L) or right (R) of 2? R
Enter data for node 4: 4
Do you want to add 4 to the left (L) or right (R) of 3? L
Enter data for node 5: 5
Do you want to add 5 to the left (L) or right (R) of 4? R
The tree is balanced.
Test Case 2:
Enter the number of nodes: 4
Enter the root node value: 10
Enter data for node 2: 20
Do you want to add 20 to the left (L) or right (R) of 10? R
Enter data for node 3: 30
Do you want to add 30 to the left (L) or right (R) of 20? R
Enter data for node 4: 40
Do you want to add 40 to the left (L) or right (R) of 30? R
The tree is not balanced.
Test Case 3:
Enter the number of nodes: 3
Enter the root node value: 10
Enter data for node 2: 20
Do you want to add 20 to the left (L) or right (R) of 10? L
Enter data for node 3: 30
Do you want to add 30 to the left (L) or right (R) of 10? R
The tree is balanced.
#include <stdio.h>
#include <stdlib.h>
struct Node {
int data;
struct Node* left;
struct Node* right;
};
int main() {
struct Node* root = NULL;
int n, key;
printf("Enter elements:\n");
for (int i = 0; i < n; i++) {
int x;
scanf("%d", &x); // Input the elements
root = insert(root, x);
}
if (search(root, key))
printf("Number found in BST.\n");
else
printf("Number not found in BST.\n");
return 0;
}
Test Case 1:
Enter number of elements to insert in BST: 5
Enter elements:
20
10
30
5
15
Enter the number to search: 15
Number found in BST.
Test Case 2:
Enter number of elements to insert in BST: 4
Enter elements:
50
30
70
20
Enter the number to search: 60
Number not found in BST.
Test Case 3:
Enter number of elements to insert in BST: 6
Enter elements:
40
20
60
10
30
50
Enter the number to search: 30
Number found in BST.
struct Node {
int data;
struct Node* left;
struct Node* right;
};
int main() {
struct Node* root = NULL;
int i, n;
printf("Enter number of elements to insert in BST: ");
scanf("%d", &n);
printf("Enter elements:");
for (i = 0; i < n; i++) {
int x;
scanf("%d", &x);
root = insert(root, x);
}
printf("In-Order Traversal after insertion: ");
inorderTraversal(root);
return 0;
}
Test case 1:
Enter number of elements to insert in BST: 5
Enter elements:
30
20
40
10
25
In-Order Traversal after insertion: 10 20 25 30 40
Test Case 2:
Enter number of elements to insert in BST: 4
Enter elements:
50
30
70
60
In-Order Traversal after insertion: 30 50 60 70
Test Case 3:
Enter number of elements to insert in BST: 6
Enter elements:
15
10
20
8
12
18
In-Order Traversal after insertion: 8 10 12 15 18 20
struct Node {
int data;
struct Node* left;
struct Node* right;
};
int main() {
struct Node* root = NULL;
int i,n, key;
printf("Enter number of elements to insert in BST: ");
scanf("%d", &n);
printf("Enter elements:");
for (i = 0; i < n; i++) {
int x;
scanf("%d", &x);
root = insert(root, x);
}
printf("Enter the number to delete: ");
scanf("%d", &key);
root = deleteNode(root, key);
printf("In-Order Traversal after deletion: ");
inorderTraversal(root);
return 0;
}
Test case1:
Enter number of elements to insert in BST: 7
Enter elements:
50 30 70 20 40 60 80
Enter the number to delete: 70
In-Order Traversal after deletion: 20 30 40 50 60 80
Test Case 2:
Enter number of elements to insert in BST: 5
Enter elements:
10 5 15 3 7
Enter the number to delete: 3
In-Order Traversal after deletion: 5 7 10 15
Test Case 3:
Enter number of elements to insert in BST: 6
Enter elements:
50 30 70 20 40 60
Enter the number to delete: 50
In-Order Traversal after deletion: 20 30 40 60 70
int main() {
int n,i;
printf("Enter the number of elements: ");
scanf("%d", &n);
int arr[n];
printf("Enter the elements:");
for (i = 0; i < n; i++) {
scanf("%d", &arr[i]);
}
heapSort(arr, n);
printf("Sorted array: ");
printArray(arr, n);
return 0;
}
Test Case 1:
Enter the number of elements: 6
Enter the elements: 12 11 13 5 6 7
Sorted array: 5 6 7 11 12 13
Test Case 2:
Enter the number of elements: 1
Enter the elements: 42
Sorted array: 42
Test Case 3:
Enter the number of elements: 5
Enter the elements: 9 9 9 9 9
Sorted array: 9 9 9 9 9
int main() {
Node* root = NULL;
int choice, value;
while (1) {
printf("\nBinary Search Tree Operations:\n");
printf("1. Insert\n");
printf("2. Search\n");
printf("3. Display (In-order Traversal)\n");
printf("4. Exit\n");
printf("Enter your choice: ");
scanf("%d", &choice);
switch (choice) {
case 1:
printf("Enter value to insert: ");
scanf("%d", &value);
root = insert(root, value);
printf("%d inserted successfully.\n", value);
break;
case 2:
printf("Enter value to search: ");
scanf("%d", &value);
if (search(root, value)) {
printf("%d found in the tree.\n", value);
} else {
printf("%d not found in the tree.\n", value);
}
break;
case 3:
printf("In-order Traversal of the tree: ");
inOrderTraversal(root);
printf("\n");
break;
case 4:
printf("Exiting...\n");
exit(0);
default:
printf("Invalid choice! Please try again.\n");
}
}
return 0;
}
Test Case1:
Binary Search Tree Operations:
1. Insert
2. Search
3. Display (In-order Traversal)
4. Exit
Enter your choice: 1
Enter value to insert: 40
Test Case 2:
#include <stdio.h>
#include <stdlib.h>
// Main function
int main() {
struct Node* root = NULL;
int choice, data;
while (1) {
printf("\nMenu:\n");
printf("1. Insert Node\n");
printf("2. Print Balance Factors\n");
printf("3. Exit\n");
printf("Enter your choice: ");
scanf("%d", &choice);
switch (choice) {
case 1:
printf("Enter the value to insert: ");
scanf("%d", &data);
if (root == NULL) {
root = createNode(data); // Initialize root
} else {
insertNode(root, data);
}
break;
case 2:
if (root == NULL) {
printf("Tree is empty.\n");
} else {
printf("Balance Factors of the Nodes:\n");
printBalanceFactors(root);
}
break;
case 3:
printf("Exiting...\n");
return 0;
default:
printf("Invalid choice. Try again.\n");
}
}
return 0;
}
Test Case1:
Binary Tree Creation:
Menu:
1. Insert Node
2. Print Balance Factors
3. Exit
Enter your choice: 1
Enter the value to insert: 50
Menu:
1. Insert Node
2. Print Balance Factors
3. Exit
Enter your choice: 1
Enter the value to insert: 30
Menu:
1. Insert Node
2. Print Balance Factors
3. Exit
Enter your choice: 1
Enter the value to insert: 70
Menu:
1. Insert Node
2. Print Balance Factors
3. Exit
Enter your choice: 2
Balance Factors of the Nodes:
Node 50: Balance Factor = 0
Node 30: Balance Factor = 0
Node 70: Balance Factor = 0
Test Case 2:
1. Insert Node -> 50
2. Insert Node -> 30
3. Insert Node -> 20
4. Insert Node -> 40
5. Insert Node -> 10
6. Print Balance Factors
Balance Factors of the Nodes:
Node 50: Balance Factor = 2
Node 30: Balance Factor = 1
Node 20: Balance Factor = 1
Node 40: Balance Factor = 0
Node 10: Balance Factor = 0
Lab no. 1/S.NO.14&Implement Priority Queue Using Max
Heap
#include <stdio.h>
#include <stdlib.h>
int heap[MAX];
int heapSize = 0;
int extractMax() {
if (heapSize <= 0)
return -1;
if (heapSize == 1) {
heapSize--;
return heap[0];
}
int root = heap[0];
heap[0] = heap[--heapSize];
int i = 0;
while (1) {
int largest = i;
int left = 2 * i + 1;
int right = 2 * i + 2;
if (left < heapSize && heap[left] > heap[largest])
largest = left;
if (right < heapSize && heap[right] > heap[largest])
largest = right;
if (largest == i)
break;
int temp = heap[i];
heap[i] = heap[largest];
heap[largest] = temp;
i = largest;
}
return root;
}
int main() {
int n, element;
printf("Enter the number of elements to insert: ");
scanf("%d", &n);
Test Case 1:
Enter the number of elements to insert: 5
Enter 5 elements:
10
20
15
30
25
Extracted max: 30
Extracted max: 25
Test case 2:
Enter the number of elements to insert: 3
Enter 3 elements:
5
3
8
Extracted max: 8
Extracted max: 5
Test Case 3:
Enter the number of elements to insert: 7
Enter 7 elements:
1
2
3
4
5
6
7
Extracted max: 7
Extracted max: 6
#include <stdio.h>
#define MAX 10
int main() {
int graph[MAX][MAX];
int vertices;
return 0;
}
Test Case 1 :
Please enter the number of vertices for your graph (max 10): 1
Please enter the adjacency matrix for the graph:
Enter the edge weight between vertex 1 and vertex 1: 0
Adjacency Matrix Representation of the Graph:
V1
V1 0
Test Case 2:
Please enter the number of vertices for your graph (max 10): 3
Please enter the adjacency matrix for the graph:
Enter the edge weight between vertex 1 and vertex 1: 0
Enter the edge weight between vertex 1 and vertex 2: 1
Enter the edge weight between vertex 1 and vertex 3: 0
Enter the edge weight between vertex 2 and vertex 1: 1
Enter the edge weight between vertex 2 and vertex 2: 0
Enter the edge weight between vertex 2 and vertex 3: 1
Enter the edge weight between vertex 3 and vertex 1: 0
Enter the edge weight between vertex 3 and vertex 2: 1
Enter the edge weight between vertex 3 and vertex 3: 0
Test case 3:
Please enter the number of vertices for your graph (max 10): 11
Invalid number of vertices. Please enter a number between 1 and 10.
#define MAX_VERTICES 10
int main() {
struct Graph graph;
int i, vertices, edges, src, dest;
if (src < 0 || src >= vertices || dest < 0 || dest >= vertices) {
printf("Invalid vertices!\n");
i--; // Redo the invalid edge input
} else {
addEdge(&graph, src, dest);
}
}
return 0;
}
Test Case 1:
Enter the number of vertices (Max 10): 3
Enter the number of edges (Max 3): 2
Enter edge 1 (source destination): 0 1
Enter edge 2 (source destination): 1 2
Adjacency Matrix:
V0 V1 V2
V0 0 1 0
V1 1 0 1
V2 0 1 0
Test Case 2:
Enter the number of vertices (Max 10): 12
Invalid number of vertices.
Test Case 3:
Enter the number of vertices (Max 10): 4
Enter the number of edges (Max 6): -2
Invalid number of edges.
int main() {
int vertices, edges;
int v1, v2,i,j;
printf("Enter the number of vertices: ");
scanf("%d", &vertices);
printf("Enter the number of edges: ");
scanf("%d", &edges);
// Initialize the graph and visited arrays
for (i = 0; i < vertices; i++) {
for (j = 0; j < vertices; j++) {
graph[i][j] = 0;
}
visited[i] = 0;
}
printf("Enter the edges (format: v1 v2):\n");
for (i = 0; i < edges; i++) {
scanf("%d %d", &v1, &v2);
graph[v1][v2] = 1; // Mark the edge in the adjacency matrix
graph[v2][v1] = 1; // For undirected graph
}
int start;
printf("Enter the starting vertex for DFS: ");
scanf("%d", &start);
printf("DFS Traversal starting from vertex %d:\n", start);
dfs(start, vertices);
return 0;
}
Test Case 1:
Enter the number of vertices: 4
Enter the number of edges: 4
Enter the edges (format: v1 v2):
01
02
12
23
Enter the starting vertex for DFS: 0
DFS Traversal starting from vertex 0:
0123
Test Case 2
Enter the number of vertices: 6
Enter the number of edges: 4
Enter the edges (format: v1 v2):
01
02
34
45
Enter the starting vertex for DFS: 0
DFS Traversal starting from vertex 0:
012
Test Case 3
Enter the number of vertices: 1
Enter the number of edges: 0
Enter the starting vertex for DFS: 0
DFS Traversal starting from vertex 0:
0
// Enqueue operation
void enqueue(int vertex) {
if (rear == MAX - 1) {
printf("Queue overflow\n");
return;
}
if (front == -1) front = 0;
queue[++rear] = vertex;
}
// Dequeue operation
int dequeue() {
if (front == -1 || front > rear) {
printf("Queue underflow\n");
return -1;
}
return queue[front++];
}
// BFS function
void bfs(int start, int vertices) {
int i;
printf("%d ", start); // Print the starting vertex
visited[start] = 1; // Mark it as visited
enqueue(start); // Enqueue the starting vertex
int main() {
int vertices, edges;
int v1, v2, i, j;
printf("Enter the number of vertices: ");
scanf("%d", &vertices);
printf("Enter the number of edges: ");
scanf("%d", &edges);
// Initialize the graph and visited arrays
for (i = 0; i < vertices; i++) {
for (j = 0; j < vertices; j++) {
graph[i][j] = 0;
}
visited[i] = 0;
}
printf("Enter the edges (format: v1 v2):\n");
for (i = 0; i < edges; i++) {
scanf("%d %d", &v1 &v2);
graph[v1][v2] = 1; // Mark the edge in the adjacency matrix
graph[v2][v1] = 1; // For undirected graph
}
int start;
printf("Enter the starting vertex for BFS: ");
scanf("%d", &start);
printf("BFS Traversal starting from vertex %d:\n", start);
bfs(start, vertices);
return 0;
}
Test Case 1:
Test Case 2:
Enter the number of vertices: 6
Enter the number of edges: 4
Enter the edges (format: v1 v2):
01
02
34
45
Enter the starting vertex for BFS: 0
BFS Traversal starting from vertex 0:
012
Test Case 3:
Enter the number of vertices: 1
Enter the number of edges: 0
Enter the starting vertex for BFS: 0
BFS Traversal starting from vertex 0:
0
#include <stdio.h>
#include <stdbool.h>
#define MAX 100
int graph[MAX][MAX];
int visited[MAX];
int main() {
int vertices, edges, i, j, src, dest, addEdge;
printf("You can add edges between nodes from 0 to %d.\n", vertices - 1);
if (addEdge == 1) {
graph[src][dest] = 1;
graph[dest][src] = 1; // Undirected graph
printf("Edge added between node %d and node %d.\n", src, dest);
}
}
}
printf("Enter source and destination nodes to check for a path (0 to %d): ", vertices - 1);
scanf("%d %d", &src, &dest);
return 0;
}
Test Case 1:
Enter number of vertices (Max 100): 3
You can add edges between nodes from 0 to 2.
Do you want to add an edge between node 0 and node 1? (1 for Yes, 0 for No): 1
Edge added between node 0 and node 1.
Do you want to add an edge between node 0 and node 2? (1 for Yes, 0 for No): 0
Do you want to add an edge between node 1 and node 2? (1 for Yes, 0 for No): 0
Enter source and destination nodes to check for a path (0 to 2): 0 2
No path exists between node 0 and node 2.
Test Case 2:
Enter number of vertices (Max 100): 4
You can add edges between nodes from 0 to 3.
Do you want to add an edge between node 0 and node 1? (1 for Yes, 0 for No): 1
Edge added between node 0 and node 1.
Do you want to add an edge between node 0 and node 2? (1 for Yes, 0 for No): 1
Edge added between node 0 and node 2.
Do you want to add an edge between node 1 and node 2? (1 for Yes, 0 for No): 0
Do you want to add an edge between node 1 and node 3? (1 for Yes, 0 for No): 1
Edge added between node 1 and node 3.
Do you want to add an edge between node 2 and node 3? (1 for Yes, 0 for No): 0
Enter source and destination nodes to check for a path (0 to 3): 0 3
Path exists between node 0 and node 3.
Test Case 3:
Enter number of vertices (Max 100): 5
You can add edges between nodes from 0 to 4.
Do you want to add an edge between node 0 and node 1? (1 for Yes, 0 for No): 1
Edge added between node 0 and node 1.
Do you want to add an edge between node 0 and node 2? (1 for Yes, 0 for No): 1
Edge added between node 0 and node 2.
Do you want to add an edge between node 1 and node 2? (1 for Yes, 0 for No): 0
Do you want to add an edge between node 1 and node 3? (1 for Yes, 0 for No): 1
Edge added between node 1 and node 3.
Do you want to add an edge between node 1 and node 4? (1 for Yes, 0 for No): 0
Do you want to add an edge between node 2 and node 3? (1 for Yes, 0 for No): 1
Edge added between node 2 and node 3.
Do you want to add an edge between node 2 and node 4? (1 for Yes, 0 for No): 1
Edge added between node 2 and node 4.
Do you want to add an edge between node 3 and node 4? (1 for Yes, 0 for No): 0
Enter source and destination nodes to check for a path (0 to 4): 0 4
Path exists between node 0 and node 4.
#include <stdio.h>
#include <stdlib.h>
int graph[MAX][MAX];
int visited[MAX];
int main() {
int vertices, i, j, edges = 0, src, dest, start;
int addEdge;
printf("You can add edges between nodes from 0 to %d.\n", vertices - 1);
if (addEdge == 1) {
// Add the edge to the graph
graph[i][j] = 1;
graph[j][i] = 1; // Undirected graph
printf("Edge added between node %d and node %d.\n", i, j);
edges++;
} else {
printf("No edge added between node %d and node %d.\n", i, j);
}
}
}
return 0;
}
Test Case 1:
Enter number of vertices (Max 100): 3
You can add edges between nodes from 0 to 2.
Do you want to add an edge between node 0 and node 1? (1 for yes, 0 for no): 1
Edge added between node 0 and node 1.
Do you want to add an edge between node 0 and node 2? (1 for yes, 0 for no): 1
Edge added between node 0 and node 2.
Do you want to add an edge between node 1 and node 2? (1 for yes, 0 for no): 1
Edge added between node 1 and node 2.
You have added 3 edges in total.
Enter the starting vertex (0 to 2): 0
Reachable vertices from 0: 0 1 2
Test Case 2:
Enter number of vertices (Max 100): 4
You can add edges between nodes from 0 to 3.
Do you want to add an edge between node 0 and node 1? (1 for yes, 0 for no): 1
Edge added between node 0 and node 1.
Do you want to add an edge between node 0 and node 2? (1 for yes, 0 for no): 0
No edge added between node 0 and node 2.
Do you want to add an edge between node 0 and node 3? (1 for yes, 0 for no): 0
No edge added between node 0 and node 3.
Do you want to add an edge between node 1 and node 2? (1 for yes, 0 for no): 0
No edge added between node 1 and node 2.
Do you want to add an edge between node 1 and node 3? (1 for yes, 0 for no): 0
No edge added between node 1 and node 3.
Do you want to add an edge between node 2 and node 3? (1 for yes, 0 for no): 1
Edge added between node 2 and node 3.
You have added 2 edges in total.
Enter the starting vertex (0 to 3): 0
Reachable vertices from 0: 0 1
Test Case 3:
Enter number of vertices (Max 100): 5
You can add edges between nodes from 0 to 4.
Do you want to add an edge between node 0 and node 1? (1 for yes, 0 for no): 1
Edge added between node 0 and node 1.
Do you want to add an edge between node 0 and node 2? (1 for yes, 0 for no): 0
No edge added between node 0 and node 2.
Do you want to add an edge between node 0 and node 3? (1 for yes, 0 for no): 0
No edge added between node 0 and node 3.
Do you want to add an edge between node 0 and node 4? (1 for yes, 0 for no): 0
No edge added between node 0 and node 4.
Do you want to add an edge between node 1 and node 2? (1 for yes, 0 for no): 1
Edge added between node 1 and node 2.
Do you want to add an edge between node 1 and node 3? (1 for yes, 0 for no): 0
No edge added between node 1 and node 3.
Do you want to add an edge between node 1 and node 4? (1 for yes, 0 for no): 0
No edge added between node 1 and node 4.
Do you want to add an edge between node 2 and node 3? (1 for yes, 0 for no): 1
Edge added between node 2 and node 3.
Do you want to add an edge between node 2 and node 4? (1 for yes, 0 for no): 0
No edge added between node 2 and node 4.
Do you want to add an edge between node 3 and node 4? (1 for yes, 0 for no): 0
No edge added between node 3 and node 4.
You have added 3 edges in total.
Enter the starting vertex (0 to 4): 0
Reachable vertices from 0: 0 1 2
#include <stdio.h>
#include <stdbool.h>
int graph[MAX][MAX];
int visited[MAX];
int main() {
int vertices, edges, src, dest;
printf("Enter number of vertices and edges: ");
scanf("%d %d", &vertices, &edges);
printf("Enter edges (src dest):");
for (int i = 0; i < edges; i++) {
scanf("%d %d", &src, &dest);
graph[src][dest] = 1;
graph[dest][src] = 1; // Undirected graph
}
if (detectCycleDFS(0, -1, vertices))
printf("Cycle detected in the graph.");
else
printf("No cycle detected in the graph.");
return 0;
}
#include <stdio.h>
#include <stdbool.h>
int main() {
int i;
int vertices, edges;
printf("Enter the number of vertices: ");
scanf("%d", &vertices);
if (isCyclic(graph, vertices)) {
printf("The graph contains a cycle.\n");
} else {
printf("The graph does not contain a cycle.\n");
}
return 0;
}
Test Case1:
Test Case 2:
Enter the number of vertices: 4
Enter the number of edges: 3
Enter the edges (start end):
01
12
23
The graph does not contain a cycle.
Lab no. 1/S.NO.23.. Find the Degree of Each Vertex in an
Undirected Graph
Description: This program demonstrates 21. find the degree of each vertex in an undirected
graph. Below is the C implementation.
#include <stdio.h>
int main() {
int graph[MAX][MAX] = {0};
int vertices, edges;
return 0;
}
Test Case1:
Enter the number of vertices: 4
Enter the number of edges: 4
Enter the edges (start end):
01
02
12
23
Degree of each vertex:
Vertex 0: Degree 2
Vertex 1: Degree 2
Vertex 2: Degree 3
Vertex 3: Degree 1
Test Case 2:
Enter the number of vertices: 3
Enter the number of edges: 2
Enter the edges (start end):
01
12
Degree of each vertex:
Vertex 0: Degree 1
Vertex 1: Degree 2
Vertex 2: Degree 1
Lab no. 1/S.NO.24. Count the Number of Connected
Components in an Undirected Graph
#include <stdio.h>
#include <stdbool.h>
#define MAX 100
// Function to perform DFS
void dfs(int graph[MAX][MAX], bool visited[], int vertex, int vertices) {
visited[vertex] = true;
for (int i = 0; i < vertices; i++) {
if (graph[vertex][i] == 1 && !visited[i]) {
dfs(graph, visited, i, vertices);
}
}
}
// Function to count connected components
int countConnectedComponents(int graph[MAX][MAX], int vertices) {
bool visited[MAX] = {false};
int count = 0;
for (int i = 0; i < vertices; i++) {
if (!visited[i]) {
dfs(graph, visited, i, vertices);
count++;
}
}
return count;
}
int main() {
int graph[MAX][MAX] = {0};
int vertices, edges;
// Input the number of vertices
printf("Enter the number of vertices: ");
scanf("%d", &vertices);
// Input the number of edges
printf("Enter the number of edges: ");
scanf("%d", &edges);
// Input the edges
printf("Enter the edges (start end):\n");
for (int i = 0; i < edges; i++) {
int start, end;
scanf("%d %d", &start, &end);
// Since the graph is undirected, mark both directions
graph[start][end] = 1;
graph[end][start] = 1; }
// Count and display the number of connected components
int result = countConnectedComponents(graph, vertices);
printf("The number of connected components in the graph is: %d\n", result);
return 0;
}
Test Case 1:
Enter the number of vertices: 6
Enter the number of edges: 3
Enter the edges (start end):
01
23
45
The number of connected components in the graph is: 3
Test Case2:
Enter the number of vertices: 4
Enter the number of edges: 2
Enter the edges (start end):
01
23
The number of connected components in the graph is: 2
int main() {
int graph[MAX][MAX], vertices, edges;
int i,j;
// Input the number of vertices
printf("Enter the number of vertices: ");
scanf("%d", &vertices);
// Input the number of edges
printf("Enter the number of edges: ");
scanf("%d", &edges);
int startVertex;
printf("Enter the starting vertex: ");
scanf("%d", &startVertex);
return 0;
}
Test Case 1:
Enter the number of vertices: 5
Enter the number of edges: 6
Enter the edges with weights (start end weight):
012
024
121
137
243
341
Enter the starting vertex: 0
Vertex Distance from Source
0 0
1 2
2 3
3 9
4 6
Test Case 2
Enter the number of vertices: 4
Enter the number of edges: 4
Enter the edges with weights (start end weight):
015
0 2 10
122
133
Enter the starting vertex: 0
Vertex Distance from Source
0 0
1 5
2 7
3 8
weight[0] = 0;
parent[0] = -1;
visited[u] = true;
printf("Enter the adjacency matrix of the graph (use 0 for no direct edge):\n");
for (int i = 0; i < V; i++) {
for (int j = 0; j < V; j++) {
printf("Edge weight between vertex %d and %d: ", i, j);
scanf("%d", &graph[i][j]);
}
}
primMST(graph, V);
return 0;
}
Enter the adjacency matrix of the graph (use 0 for no direct edge):
Edge weight between vertex 0 and 0: 0
Edge weight between vertex 0 and 1: 2
Edge weight between vertex 0 and 2: 0
Edge weight between vertex 0 and 3: 6
Edge weight between vertex 0 and 4: 0
Edge weight between vertex 1 and 0: 2
Edge weight between vertex 1 and 1: 0
Edge weight between vertex 1 and 2: 3
Edge weight between vertex 1 and 3: 8
Edge weight between vertex 1 and 4: 5
Edge weight between vertex 2 and 0: 0
Edge weight between vertex 2 and 1: 3
Edge weight between vertex 2 and 2: 0
Edge weight between vertex 2 and 3: 0
Edge weight between vertex 2 and 4: 7
Edge weight between vertex 3 and 0: 6
Edge weight between vertex 3 and 1: 8
Edge weight between vertex 3 and 2: 0
Edge weight between vertex 3 and 3: 0
Edge weight between vertex 3 and 4: 9
Edge weight between vertex 4 and 0: 0
Edge weight between vertex 4 and 1: 5
Edge weight between vertex 4 and 2: 7
Edge weight between vertex 4 and 3: 9
Edge weight between vertex 4 and 4: 0
Test Case 2 :
Enter the adjacency matrix of the graph (use 0 for no direct edge):
Edge weight between vertex 0 and 0: 0
Edge weight between vertex 0 and 1: 10
Edge weight between vertex 0 and 2: 6
Edge weight between vertex 0 and 3: 5
Edge weight between vertex 1 and 0: 10
Edge weight between vertex 1 and 1: 0
Edge weight between vertex 1 and 2: 15
Edge weight between vertex 1 and 3: 0
Edge weight between vertex 2 and 0: 6
Edge weight between vertex 2 and 1: 15
Edge weight between vertex 2 and 2: 0
Edge weight between vertex 2 and 3: 4
Edge weight between vertex 3 and 0: 5
Edge weight between vertex 3 and 1: 0
Edge weight between vertex 3 and 2: 4
Edge weight between vertex 3 and 3: 0
int main() {
Graph graph;
printf("Enter the number of vertices: ");
scanf("%d", &graph.V);
// Solves the all-pairs shortest path problem using Floyd Warshall algorithm
void floydWarshall(int dist[][MAX], int V)
{
int i, j, k;
// Driver code
int main()
{
int V, E;
int graph[MAX][MAX];
return 0;
}
Test Case 1 :
Enter the number of vertices: 4
Enter the number of edges: 4
Enter the edges (source, destination, weight):
Edge 1: 0 1 5
Edge 2: 0 2 10
Edge 3: 1 3 15
Edge 4: 2 3 20
The following matrix shows the shortest distances between every pair of vertices:
0 5 10 20
INF 0 INF 15
INF INF 0 20
INF INF INF 0
Test Case 2
Enter the number of vertices: 5
Enter the number of edges: 6
Enter the edges (source, destination, weight):
Edge 1: 0 1 2
Edge 2: 1 2 3
Edge 3: 0 3 8
Edge 4: 3 4 1
Edge 5: 4 1 7
Edge 6: 2 4 5
The following matrix shows the shortest distances between every pair of vertices:
0 2 5 8 9
INF 0 3 INF 8
INF INF 0 INF 5
INF 9 12 0 1
INF 7 10 INF 0
Lab no. 1/S.NO.29. Implement Bellman-Ford Algorithm
#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
Test case 1:
Test Case 2:
// Function to find the length of the Longest Common Subsequence (LCS) using recursion
int lcsRecursive(char* X, char* Y, int m, int n) {
// Base case: If either string is empty, LCS length is 0
if (m == 0 || n == 0)
return 0;
// If the characters match, include them in LCS and recur for the remaining strings
if (X[m - 1] == Y[n - 1])
return 1 + lcsRecursive(X, Y, m - 1, n - 1);
// If the characters do not match, recursively find LCS by excluding one character at a time
else
return max(lcsRecursive(X, Y, m, n - 1), lcsRecursive(X, Y, m - 1, n));
}
int main() {
// Define variables for input strings
char X[100], Y[100];
return 0;
}
Test Case 1:
Enter the first string: ABCD
Enter the second string: ACBD
Length of LCS is 3
Test Case 2:
Enter the first string: XYZ
Enter the second string: YZXY
Length of LCS is 2
// Driver code
int main() {
int n, sum;
int set[n];
int subset[n],i; // Array to hold the subset
if (!flag) {
printf("There is no such subset\n");
}
return 0;
}
Test Case 1:
Enter the number of elements in the set: 3
Enter the elements of the set: 1 2 1
Enter the target sum: 3
Subsets with sum 3:
[12]
[21]
[111]
Test Case 2:
Enter the number of elements in the set: 6
Enter the elements of the set: 3 34 4 12 5 2
Enter the target sum: 30
Subsets with sum 30:
There is no such subset