Data Structures Full Experiments
Data Structures Full Experiments
10. Implementation of Binary Search Tree (Insertion, Deletion, and Search operations).
Linear Search
Python:
for i in range(len(arr)):
if arr[i] == target:
return i
return -1
arr = [10, 20, 30, 40, 50]
target = 30
C:
#include <stdio.h>
if (arr[i] == target)
return i;
return -1;
int main() {
if (result != -1)
else
return 0;
}
Binary Search (works on sorted arrays)
Python:
if arr[mid] == target:
return mid
low = mid + 1
else:
high = mid - 1
return -1
target = 40
C:
#include <stdio.h>
if (arr[mid] == target)
return mid;
low = mid + 1;
else
high = mid - 1;
return -1;
int main() {
if (result != -1)
else
return 0;
1. Selection Sort
Python:
def selection_sort(arr):
for i in range(len(arr)):
min_idx = i
min_idx = j
return arr
C:
#include <stdio.h>
int min_idx = i;
min_idx = j;
arr[i] = arr[min_idx];
arr[min_idx] = temp;
}
int main() {
selection_sort(arr, n);
return 0;
2. Insertion Sort
Python:
def insertion_sort(arr):
key = arr[i]
j=i-1
arr[j + 1] = arr[j]
j -= 1
arr[j + 1] = key
return arr
#include <stdio.h>
int j = i - 1;
arr[j + 1] = arr[j];
j--;
arr[j + 1] = key;
int main() {
insertion_sort(arr, n);
return 0;
3. Merge Sort
Python:
def merge_sort(arr):
if len(arr) > 1:
mid = len(arr)//2
L = arr[:mid]
R = arr[mid:]
merge_sort(L)
merge_sort(R)
i=j=k=0
arr[k] = L[i]
i += 1
else:
arr[k] = R[j]
j += 1
k += 1
arr[k] = L[i]
i += 1
k += 1
j += 1
k += 1
merge_sort(arr)
C:
#include <stdio.h>
int i, j, k;
int n1 = m - l + 1;
int n2 = r - m;
i = 0; j = 0; k = l;
else
arr[k++] = R[j++];
if (l < r) {
int m = l + (r - l) / 2;
merge_sort(arr, l, m);
merge_sort(arr, m + 1, r);
merge(arr, l, m, r);
int main() {
merge_sort(arr, 0, n - 1);
return 0;
}
4. Quick Sort
Python:
def quick_sort(arr):
if len(arr) <= 1:
return arr
pivot = arr[0]
arr = [10, 7, 8, 9, 1, 5]
C:
#include <stdio.h>
int t = *a;
*a = *b;
*b = t;
i++;
swap(&arr[i], &arr[j]);
return (i + 1);
quick_sort(arr, pi + 1, high);
int main() {
quick_sort(arr, 0, n - 1);
Python:
class Stack:
self.stack = []
self.size = size
if len(self.stack) == self.size:
print("Stack Overflow")
else:
self.stack.append(item)
def pop(self):
if not self.stack:
print("Stack Underflow")
else:
print("Popped:", self.stack.pop())
def display(self):
print("Stack:", self.stack)
# Demo
s = Stack(5)
s.push(10)
s.push(20)
s.push(30)
s.display()
s.pop()
s.display()
C:
#include <stdio.h>
#define SIZE 5
int stack[SIZE];
if (top == SIZE - 1)
printf("Stack Overflow\n");
else
stack[++top] = value;
}
void pop() {
if (top == -1)
printf("Stack Underflow\n");
else
void display() {
if (top == -1)
printf("Stack is empty\n");
else {
printf("Stack: ");
printf("\n");
int main() {
push(10);
push(20);
push(30);
display();
pop();
display();
return 0;
}
Python:
class Queue:
self.queue = [None]*size
self.front = self.rear = -1
self.size = size
if self.rear == self.size - 1:
print("Queue Overflow")
else:
if self.front == -1:
self.front = 0
self.rear += 1
self.queue[self.rear] = item
def dequeue(self):
print("Queue Underflow")
else:
print("Dequeued:", self.queue[self.front])
self.front += 1
def display(self):
print("Queue is empty")
else:
# Demo
q = Queue(5)
q.enqueue(10)
q.enqueue(20)
q.enqueue(30)
q.display()
q.dequeue()
q.display()
C:
#include <stdio.h>
#define SIZE 5
int queue[SIZE];
if (rear == SIZE - 1)
printf("Queue Overflow\n");
else {
if (front == -1)
front = 0;
queue[++rear] = value;
void dequeue() {
printf("Queue Underflow\n");
else
void display() {
printf("Queue is empty\n");
else {
printf("Queue: ");
printf("\n");
int main() {
enqueue(10);
enqueue(20);
enqueue(30);
display();
dequeue();
display();
return 0;
Python:
def precedence(op):
if op == '+' or op == '-':
return 1
if op == '*' or op == '/':
return 2
return 0
def infix_to_postfix(expression):
stack = []
postfix = ""
for char in expression:
if char.isalnum(): # operand
postfix += char
stack.append(char)
postfix += stack.pop()
stack.pop()
else: # operator
postfix += stack.pop()
stack.append(char)
while stack:
postfix += stack.pop()
return postfix
exp = "a+b*(c-d)"
C:
#include <stdio.h>
#include <ctype.h>
char stack[SIZE];
int top = -1;
void push(char c) {
stack[++top] = c;
char pop() {
return stack[top--];
return 0;
char ch;
if (isalnum(ch))
printf("%c", ch);
push(ch);
printf("%c", pop());
pop(); // pop '('
} else {
printf("%c", pop());
push(ch);
printf("%c", pop());
int main() {
infix_to_postfix(exp);
return 0;
Python:
def evaluate_postfix(expression):
stack = []
for ch in expression:
if ch.isdigit():
stack.append(int(ch))
else:
b = stack.pop()
a = stack.pop()
if ch == '+':
stack.append(a + b)
elif ch == '-':
stack.append(a - b)
elif ch == '*':
stack.append(a * b)
elif ch == '/':
stack.append(a // b)
return stack[0]
exp = "231*+9-"
C:
#include <stdio.h>
#include <ctype.h>
int stack[SIZE];
stack[++top] = val;
}
int pop() {
return stack[top--];
char ch = exp[i];
if (isdigit(ch)) {
} else {
int b = pop();
int a = pop();
switch (ch) {
return pop();
int main() {
char exp[] = "231*+9-"; // (2 + (3 * 1)) - 9 = -4
return 0;
In a circular queue, the last position is connected back to the first position to make a circle.
It uses modulo arithmetic to wrap around.
Python:
class CircularQueue:
self.queue = [None]*size
self.max_size = size
self.front = -1
self.rear = -1
print("Queue Overflow")
return
if self.front == -1:
self.front = self.rear = 0
else:
self.queue[self.rear] = data
def dequeue(self):
if self.front == -1:
print("Queue Underflow")
return
print("Dequeued:", self.queue[self.front])
if self.front == self.rear:
self.front = self.rear = -1
else:
def display(self):
if self.front == -1:
print("Queue is empty")
return
i = self.front
while True:
if i == self.rear:
break
i = (i + 1) % self.max_size
print()
# Demo
cq = CircularQueue(5)
cq.enqueue(10)
cq.enqueue(20)
cq.enqueue(30)
cq.enqueue(40)
cq.display()
cq.dequeue()
cq.enqueue(50)
cq.display()
C:
#include <stdio.h>
#define SIZE 5
int queue[SIZE];
printf("Queue Overflow\n");
return;
}
if (front == -1)
front = rear = 0;
else
queue[rear] = value;
void dequeue() {
if (front == -1) {
printf("Queue Underflow\n");
return;
if (front == rear)
else
void display() {
if (front == -1) {
printf("Queue is empty\n");
return;
printf("Queue: ");
int i = front;
while (1) {
if (i == rear)
break;
i = (i + 1) % SIZE;
printf("\n");
int main() {
enqueue(10);
enqueue(20);
enqueue(30);
enqueue(40);
display();
dequeue();
enqueue(50);
display();
return 0;
A Singly Linked List is a linear data structure where each node contains:
data
a pointer to the next node
We'll implement:
Display
Python:
class Node:
self.data = data
self.next = None
class SinglyLinkedList:
def __init__(self):
self.head = None
new_node = Node(data)
if not self.head:
self.head = new_node
return
temp = self.head
while temp.next:
temp = temp.next
temp.next = new_node
def insert_beginning(self, data):
new_node = Node(data)
new_node.next = self.head
self.head = new_node
def delete_beginning(self):
if not self.head:
print("List is empty")
else:
print("Deleted:", self.head.data)
self.head = self.head.next
def delete_end(self):
if not self.head:
print("List is empty")
print("Deleted:", self.head.data)
self.head = None
else:
temp = self.head
while temp.next.next:
temp = temp.next
print("Deleted:", temp.next.data)
temp.next = None
def display(self):
temp = self.head
while temp:
temp = temp.next
print("None")
# Demo
ll = SinglyLinkedList()
ll.insert_end(10)
ll.insert_end(20)
ll.insert_beginning(5)
ll.display()
ll.delete_beginning()
ll.delete_end()
ll.display()
C:
#include <stdio.h>
#include <stdlib.h>
struct Node {
int data;
newNode->data = data;
newNode->next = NULL;
if (head == NULL) {
head = newNode;
return;
temp = temp->next;
temp->next = newNode;
newNode->data = data;
newNode->next = head;
head = newNode;
void delete_beginning() {
if (head == NULL)
printf("List is empty\n");
else {
head = head->next;
free(temp);
void delete_end() {
if (head == NULL)
printf("List is empty\n");
free(head);
head = NULL;
} else {
temp = temp->next;
free(temp->next);
temp->next = NULL;
}
void display() {
printf("List: ");
temp = temp->next;
printf("NULL\n");
int main() {
insert_end(10);
insert_end(20);
insert_beginning(5);
display();
delete_beginning();
delete_end();
display();
return 0;
data
prev pointer (to the previous node)
We’ll implement:
Python:
class Node:
self.data = data
self.prev = None
self.next = None
class DoublyLinkedList:
def __init__(self):
self.head = None
new_node = Node(data)
if self.head is None:
self.head = new_node
return
temp = self.head
while temp.next:
temp = temp.next
temp.next = new_node
new_node.prev = temp
new_node = Node(data)
new_node.next = self.head
if self.head:
self.head.prev = new_node
self.head = new_node
def delete_beginning(self):
if not self.head:
print("List is empty")
return
print("Deleted:", self.head.data)
self.head = self.head.next
if self.head:
self.head.prev = None
def delete_end(self):
if not self.head:
print("List is empty")
return
temp = self.head
if not temp.next:
print("Deleted:", temp.data)
self.head = None
return
while temp.next:
temp = temp.next
print("Deleted:", temp.data)
temp.prev.next = None
def display_forward(self):
temp = self.head
while temp:
temp = temp.next
print("None")
def display_reverse(self):
temp = self.head
if not temp:
print("Reverse: None")
return
while temp.next:
temp = temp.next
while temp:
print("None")
# Demo
dll = DoublyLinkedList()
dll.insert_end(10)
dll.insert_end(20)
dll.insert_beginning(5)
dll.display_forward()
dll.display_reverse()
dll.delete_beginning()
dll.delete_end()
dll.display_forward()
C:
#include <stdio.h>
#include <stdlib.h>
struct Node {
int data;
};
newNode->data = data;
if (head == NULL) {
head = newNode;
return;
while (temp->next)
temp = temp->next;
temp->next = newNode;
newNode->prev = temp;
newNode->data = data;
newNode->prev = NULL;
newNode->next = head;
if (head)
head->prev = newNode;
head = newNode;
}
void delete_beginning() {
if (!head) {
printf("List is empty\n");
return;
head = head->next;
if (head)
head->prev = NULL;
free(temp);
void delete_end() {
if (!head) {
printf("List is empty\n");
return;
if (!temp->next) {
head = NULL;
free(temp);
return;
while (temp->next)
temp = temp->next;
temp->prev->next = NULL;
free(temp);
void display_forward() {
printf("Forward: ");
while (temp) {
temp = temp->next;
printf("NULL\n");
void display_reverse() {
if (!temp) {
printf("Reverse: NULL\n");
return;
while (temp->next)
temp = temp->next;
printf("Reverse: ");
while (temp) {
printf("%d <-> ", temp->data);
temp = temp->prev;
printf("NULL\n");
int main() {
insert_end(10);
insert_end(20);
insert_beginning(5);
display_forward();
display_reverse();
delete_beginning();
delete_end();
display_forward();
return 0;
A Circular Linked List is a variation of a singly linked list where the last node points back
to the first node, forming a circle.
We’ll implement:
Insertion at end
Deletion at beginning
Display
Circular Linked List
Python:
class Node:
self.data = data
self.next = None
class CircularLinkedList:
def __init__(self):
self.last = None
new_node = Node(data)
if not self.last:
self.last = new_node
self.last.next = new_node
else:
new_node.next = self.last.next
self.last.next = new_node
self.last = new_node
def delete_beginning(self):
if not self.last:
print("List is empty")
return
first = self.last.next
if self.last == first:
print("Deleted:", first.data)
self.last = None
else:
print("Deleted:", first.data)
self.last.next = first.next
def display(self):
if not self.last:
print("List is empty")
return
temp = self.last.next
while True:
temp = temp.next
if temp == self.last.next:
break
print("(back to start)")
# Demo
cll = CircularLinkedList()
cll.insert_end(10)
cll.insert_end(20)
cll.insert_end(30)
cll.display()
cll.delete_beginning()
cll.display()
C:
#include <stdio.h>
#include <stdlib.h>
struct Node {
int data;
};
newNode->data = data;
if (last == NULL) {
last = newNode;
last->next = last;
} else {
newNode->next = last->next;
last->next = newNode;
last = newNode;
}
void delete_beginning() {
if (last == NULL) {
printf("List is empty\n");
return;
if (last == temp) {
free(temp);
last = NULL;
} else {
last->next = temp->next;
free(temp);
void display() {
if (last == NULL) {
printf("List is empty\n");
return;
}
do {
temp = temp->next;
printf("(back to start)\n");
int main() {
insert_end(10);
insert_end(20);
insert_end(30);
display();
delete_beginning();
display();
return 0;
We’ll implement:
class Node:
self.data = data
self.next = None
class StackLL:
def __init__(self):
self.top = None
new_node = Node(data)
new_node.next = self.top
self.top = new_node
def pop(self):
if not self.top:
print("Stack Underflow")
else:
print("Popped:", self.top.data)
self.top = self.top.next
def display(self):
temp = self.top
temp = temp.next
print("None")
# Demo
s = StackLL()
s.push(10)
s.push(20)
s.push(30)
s.display()
s.pop()
s.display()
C:
#include <stdio.h>
#include <stdlib.h>
struct Node {
int data;
};
newNode->data = value;
newNode->next = top;
top = newNode;
void pop() {
if (top == NULL) {
printf("Stack Underflow\n");
return;
top = top->next;
free(temp);
void display() {
temp = temp->next;
printf("NULL\n");
}
int main() {
push(10);
push(20);
push(30);
display();
pop();
display();
return 0;
Python:
class Node:
self.data = data
self.next = None
class QueueLL:
def __init__(self):
self.front = None
self.rear = None
new_node = Node(data)
if not self.rear:
else:
self.rear.next = new_node
self.rear = new_node
def dequeue(self):
if not self.front:
print("Queue Underflow")
else:
print("Dequeued:", self.front.data)
self.front = self.front.next
if self.front is None:
self.rear = None
def display(self):
temp = self.front
while temp:
temp = temp.next
print("None")
# Demo
q = QueueLL()
q.enqueue(10)
q.enqueue(20)
q.enqueue(30)
q.display()
q.dequeue()
q.display()
C:
#include <stdio.h>
#include <stdlib.h>
struct Node {
int data;
};
newNode->data = value;
newNode->next = NULL;
if (rear == NULL) {
} else {
rear->next = newNode;
rear = newNode;
void dequeue() {
if (front == NULL) {
printf("Queue Underflow\n");
return;
front = front->next;
if (front == NULL)
rear = NULL;
free(temp);
void display() {
temp = temp->next;
printf("NULL\n");
}
int main() {
enqueue(10);
enqueue(20);
enqueue(30);
display();
dequeue();
display();
return 0;
Insertion
Deletion
Search
Python:
class Node:
self.data = data
class BST:
def insert(self, root, data):
if root is None:
return Node(data)
else:
return root
if root:
self.inorder(root.left)
self.inorder(root.right)
return root
else:
if root is None:
return root
if key < root.data:
else:
if root.left is None:
return root.right
return root.left
temp = self.min_value_node(root.right)
root.data = temp.data
return root
current = node
while current.left:
current = current.left
return current
# Demo
bst = BST()
root = None
print("Inorder traversal:")
bst.inorder(root)
bst.inorder(root)
C:
#include <stdio.h>
#include <stdlib.h>
struct Node {
int data;
};
newNode->data = data;
else
return root;
if (root != NULL) {
inorder(root->left);
inorder(root->right);
else
current = current->left;
return current;
else {
if (root->left == NULL) {
free(root);
return temp;
free(root);
return temp;
}
struct Node* temp = minValueNode(root->right);
root->data = temp->data;
return root;
int main() {
insert(root, 30);
insert(root, 70);
insert(root, 20);
insert(root, 40);
insert(root, 60);
insert(root, 80);
printf("Inorder traversal:\n");
inorder(root);
return 0;
Python:
class Node:
self.data = data
class BinaryTree:
if root:
self.inorder(root.left)
self.inorder(root.right)
self.preorder(root.left)
self.preorder(root.right)
if root:
self.postorder(root.left)
self.postorder(root.right)
# Demo
bt = BinaryTree()
root = Node(1)
root.left = Node(2)
root.right = Node(3)
root.left.left = Node(4)
root.left.right = Node(5)
print("Inorder Traversal:")
bt.inorder(root)
print("\nPreorder Traversal:")
bt.preorder(root)
print("\nPostorder Traversal:")
bt.postorder(root)
C:
#include <stdio.h>
#include <stdlib.h>
struct Node {
int data;
};
newNode->data = data;
return newNode;
if (root) {
inorder(root->left);
inorder(root->right);
}
}
if (root) {
preorder(root->left);
preorder(root->right);
if (root) {
postorder(root->left);
postorder(root->right);
int main() {
root->left = create(2);
root->right = create(3);
root->left->left = create(4);
root->left->right = create(5);
printf("Inorder Traversal:\n");
inorder(root);
printf("\nPreorder Traversal:\n");
preorder(root);
printf("\nPostorder Traversal:\n");
postorder(root);
return 0;
An AVL Tree is a self-balancing Binary Search Tree (BST) where the difference in heights
of left and right subtrees (the balance factor) is at most 1 for every node.
We'll implement:
Inorder traversal
AVL Tree
Python:
class Node:
self.data = data
self.height = 1
class AVLTree:
if not root:
return Node(key)
else:
balance = self.get_balance(root)
# Left Left
return self.right_rotate(root)
# Right Right
return self.left_rotate(root)
# Left Right
root.left = self.left_rotate(root.left)
return self.right_rotate(root)
# Right Left
root.right = self.right_rotate(root.right)
return self.left_rotate(root)
return root
y = z.right
T2 = y.left
y.left = z
z.right = T2
return y
y = z.left
T3 = y.right
y.right = z
z.left = T3
return y
if not node:
return 0
return node.height
def get_balance(self, node):
if not node:
return 0
if root:
self.inorder(root.left)
self.inorder(root.right)
# Demo
tree = AVLTree()
root = None
tree.inorder(root)
C:
#include <stdio.h>
#include <stdlib.h>
struct Node {
};
return (a > b) ? a : b;
return N ? N->height : 0;
node->data = data;
node->height = 1;
return node;
}
struct Node* rightRotate(struct Node* y) {
x->right = y;
y->left = T2;
return x;
y->left = x;
x->right = T2;
return y;
return node;
// LL
return rightRotate(node);
// RR
return leftRotate(node);
// LR
node->left = leftRotate(node->left);
return rightRotate(node);
// RL
node->right = rightRotate(node->right);
return leftRotate(node);
return node;
}
void inorder(struct Node* root) {
if (root != NULL) {
inorder(root->left);
inorder(root->right);
int main() {
inorder(root);
return 0;
We'll implement:
Python:
class Graph:
def __init__(self):
self.graph = defaultdict(list)
self.graph[u].append(v)
visited = set()
queue = deque([start])
while queue:
node = queue.popleft()
visited.add(node)
queue.append(neighbor)
print()
def dfs_util(self, node, visited):
visited.add(node)
self.dfs_util(neighbor, visited)
visited = set()
self.dfs_util(start, visited)
print()
# Demo
g = Graph()
g.add_edge(0, 1)
g.add_edge(0, 2)
g.add_edge(1, 3)
g.add_edge(2, 4)
g.add_edge(3, 5)
g.bfs(0)
g.dfs(0)
C:
#include <stdio.h>
#include <stdlib.h>
struct Node {
int vertex;
};
struct Graph {
int numVertices;
int* visited;
};
struct Queue {
int items[MAX];
};
newNode->vertex = v;
newNode->next = NULL;
return newNode;
graph->numVertices = vertices;
graph->adjLists[i] = NULL;
graph->visited[i] = 0;
return graph;
newNode->next = graph->adjLists[src];
graph->adjLists[src] = newNode;
// newNode = createNode(src);
// newNode->next = graph->adjLists[dest];
// graph->adjLists[dest] = newNode;
}
return q;
if (q->rear == MAX - 1)
return;
q->rear++;
q->items[q->rear] = value;
int item;
item = q->items[q->front];
q->front++;
graph->visited[startVertex] = 1;
enqueue(q, startVertex);
printf("BFS: ");
while (!isEmpty(q)) {
while (temp) {
if (!graph->visited[adjVertex]) {
graph->visited[adjVertex] = 1;
enqueue(q, adjVertex);
temp = temp->next;
printf("\n");
}
void dfs(struct Graph* graph, int vertex) {
graph->visited[vertex] = 1;
while (temp) {
if (!graph->visited[adjVertex]) {
dfs(graph, adjVertex);
temp = temp->next;
graph->visited[i] = 0;
int main() {
addEdge(g, 0, 1);
addEdge(g, 0, 2);
addEdge(g, 1, 3);
addEdge(g, 2, 4);
addEdge(g, 3, 5);
bfs(g, 0);
resetVisited(g);
printf("DFS: ");
dfs(g, 0);
printf("\n");
return 0;
These two algorithms are used to find the Minimum Spanning Tree (MST) of a connected,
weighted, undirected graph.
Python:
import sys
class Prims:
self.graph = graph
self.V = len(graph)
min_val = sys.maxsize
min_index = -1
for v in range(self.V):
min_val = key[v]
min_index = v
return min_index
def prim_mst(self):
key[0] = 0
for _ in range(self.V):
u = self.min_key(key, mst_set)
mst_set[u] = True
for v in range(self.V):
key[v] = self.graph[u][v]
parent[v] = u
print("Edge \tWeight")
G = [[0, 2, 0, 6, 0],
[2, 0, 3, 8, 5],
[0, 3, 0, 0, 7],
[6, 8, 0, 0, 9],
[0, 5, 7, 9, 0]]
p = Prims(G)
p.prim_mst()
C (Prim’s Algorithm):
#include <stdio.h>
#include <limits.h>
#define V 5
return min_index;
}
void printMST(int parent[], int graph[V][V]) {
printf("Edge \tWeight\n");
int parent[V];
int key[V];
int mstSet[V];
key[0] = 0;
parent[0] = -1;
mstSet[u] = 1;
printMST(parent, graph);
}
int main() {
int graph[V][V] = {
{0, 2, 0, 6, 0},
{2, 0, 3, 8, 5},
{0, 3, 0, 0, 7},
{6, 8, 0, 0, 9},
{0, 5, 7, 9, 0}
};
primMST(graph);
return 0;
Python:
class Kruskal:
self.V = vertices
self.graph = []
self.graph.append((w, u, v))
return parent[i]
parent[xroot] = yroot
parent[yroot] = xroot
else:
parent[yroot] = xroot
rank[xroot] += 1
def kruskal_mst(self):
self.graph.sort()
mst = []
x = self.find(parent, u)
y = self.find(parent, v)
if x != y:
mst.append((u, v, weight))
self.union(parent, rank, x, y)
print("Edge \tWeight")
for u, v, w in mst:
# Demo
k = Kruskal(5)
k.add_edge(0, 1, 2)
k.add_edge(0, 3, 6)
k.add_edge(1, 2, 3)
k.add_edge(1, 3, 8)
k.add_edge(1, 4, 5)
k.add_edge(2, 4, 7)
k.add_edge(3, 4, 9)
k.kruskal_mst()
Kruskal’s Algorithm in C
#include <stdio.h>
#include <stdlib.h>
struct Edge {
};
struct Graph {
int V, E;
};
struct Subset {
int parent;
int rank;
};
if (subsets[i].parent != i)
return subsets[i].parent;
subsets[xroot].parent = yroot;
subsets[yroot].parent = xroot;
else {
subsets[yroot].parent = xroot;
subsets[xroot].rank++;
int V = graph->V;
int e = 0;
int i = 0;
subsets[v].parent = v;
subsets[v].rank = 0;
if (x != y) {
result[e++] = next_edge;
Union(subsets, x, y);
printf("Edges in MST:\n");
graph->V = V;
graph->E = E;
return graph;
int main() {
int V = 4;
int E = 5;
graph->edge[0].dest = 1;
graph->edge[0].weight = 10;
graph->edge[1].src = 0;
graph->edge[1].dest = 2;
graph->edge[1].weight = 6;
graph->edge[2].src = 0;
graph->edge[2].dest = 3;
graph->edge[2].weight = 5;
graph->edge[3].src = 1;
graph->edge[3].dest = 3;
graph->edge[3].weight = 15;
graph->edge[4].src = 2;
graph->edge[4].dest = 3;
graph->edge[4].weight = 4;
KruskalMST(graph);
return 0;