SAIF DSA Lab Experiment
SAIF DSA Lab Experiment
#include <iostream>
int main() {
cout << "Element at index 0: " << array[0] << endl; // Accessing first element
cout << "Element at index 3: " << array[3] << endl; // Accessing fourth element
int newArray[6] = {10, 20, 30, 40, 50, 60}; // Adding an element (we increase the array size
manually)
tempArray[i] = newArray[i];
tempArray[insertIndex] = insertValue;
tempArray[i + 1] = newArray[i];
int removeIndex = 2;
int newSize = 6;
removedArray[i] = tempArray[i];
removedArray[i - 1] = tempArray[i];
}
cout << "Array after removing the element at index 2: ";
cout << "Length of the array: " << 6 << endl; // The size of the array is fixed here (6
elements)
return 0;
OUTPUT
Q 2. MATRIX ADDITION
#include <iostream>
int main() {
int m, n
cout << "Enter the number of rows (m): ";
cin >> m;
cin >> n;
cout << "Enter element (" << i + 1 << "," << j + 1 << "): ";
cout << "Enter element (" << i + 1 << "," << j + 1 << "): ";
return 0;
OUTPUT
Q 3. Matrix multiplication
#include <iostream>
int m, n, p, q;
cout << "Enter the number of rows and columns for the first matrix (m x n): ";
cout << "Enter the number of rows and columns for the second matrix (p x q): ";
if (n != p) {
cout << "Matrix multiplication not possible. Columns of the first matrix must be equal
to rows of the second matrix.";
return 0;
cout << "The resulting matrix after multiplication is:" << endl;
return 0;
Output
Q 4 . Linked list (insertion –beg,middle,end)
#include <iostream>
struct Node {
int data;
Node* next;
Node(int val) {
data = val;
next = nullptr;
};
class LinkedList {
private:
Node* head;
public
LinkedList() {
head = nullptr;
newNode->next = head;
head = newNode;
cout << "Inserted " << val << " at the beginning.\n";
if (head == nullptr) {
head = newNode;
} else {
temp = temp->next;
temp->next = newNode;
cout << "Inserted " << val << " at the end.\n";
if (position <= 0) {
cout << "Position must be greater than 0.\n";
return;
if (position == 1) {
newNode->next = head;
head = newNode;
cout << "Inserted " << val << " at position " << position << ".\n";
return;
int count = 1;
temp = temp->next;
count++;
if (temp == nullptr) {
return;
newNode->next = temp->next;
temp->next = newNode;
cout << "Inserted " << val << " at position " << position << ".\n";
void printList() {
if (head == nullptr) {
cout << "List is empty.\n";
return;
temp = temp->next;
};
int main() {
LinkedList list;
list.insertAtBeginning(10);
list.insertAtEnd(20);
list.insertAtEnd(30);
list.printList();
return 0;
Output
Q 5. Linked list (Deletion –Beg,Middle,End)
#include <iostream>
struct Node {
int data;
Node* next;
Node(int val) {
data = val;
next = nullptr;
};
if (!head) {
head = newNode;
return;
while (temp->next) {
temp = temp->next;
temp->next = newNode;
if (head == nullptr) {
return;
head = head->next;
delete temp;
if (head == nullptr) {
return;
delete head;
head = nullptr;
return;
temp = temp->next;
}
if (head == nullptr) {
return;
if (temp->next->data == value) {
temp->next = temp->next->next;
delete toDelete;
cout << "Deleted " << value << " from the list." << endl;
return;
temp = temp->next;
if (head == nullptr) {
return;
}
while (temp) {
temp = temp->next;
int main() {
insertEnd(head, 10);
insertEnd(head, 20);
insertEnd(head, 30);
insertEnd(head, 40);
insertEnd(head, 50);
display(head);
deleteBegin(head);
display(head);
deleteEnd(head);
display(head
deleteMiddle(head, 30);
cout << "After deleting the middle node with value 30: ";
display(head);
return 0;
Output
#include <stdio.h>
#include <stdlib.h>
struct Node {
int data;
};
newNode->data = data;
newNode->prev = NULL;
newNode->next = NULL;
return newNode;
newNode->next = *head;
if (*head != NULL) {
(*head)->prev = newNode;
*head = newNode;
if (*head == NULL) {
*head = newNode;
return;
temp = temp->next;
temp->next = newNode;
newNode->prev = temp;
if (temp == NULL) {
return;
if (*head == temp) {
*head = temp->next;
if (temp->next != NULL) {
temp->next->prev = temp->prev;
if (temp->prev != NULL) {
temp->prev->next = temp->next;
free(temp);
temp = temp->next;
printf("NULL\n")
temp = temp->next;
temp = temp->prev;
printf("NULL\n");
int main() {
insertAtBeginning(&head, 10);
insertAtBeginning(&head, 20);
insertAtBeginning(&head, 30);
printListForward(head);
insertAtEnd(&head, 40);
insertAtEnd(&head, 50);
printListForward(head);
deleteNode(&head, 20);
printListForward(head);
printListBackward(head);
return 0;
}
Output
#include <iostream>
class Node {
public:
int data;
Node* next;
};
class StackLinkedList {
private:
Node* top;
public:
StackLinkedList() {
top = nullptr;
~StackLinkedList() {
while (!isEmpty()) {
pop();
bool isEmpty() {
newNode->data = value;
newNode->next = top;
top = newNode;
cout << value << " pushed into stack" << endl;
int pop() {
if (isEmpty()) {
top = top->next;
delete temp;
return poppedValue;
int peek() {
if (isEmpty()) {
return -1;
return top->data;
};
int main() {
StackLinkedList stack;
stack.push(10);
stack.push(20);
stack.push(30);
stack.push(40);
stack.push(50);
cout << "Top element is: " << stack.peek() << endl;
cout << stack.pop() << " popped from stack" << endl;
cout << stack.pop() << " popped from stack" << endl;
return 0;
OUTPUT
Q 8.Stack(Infix to postfix )
#include <iostream>
#include <stack>
#include <string>
return 0;
bool isOperator(char c) {
stack<char> s;
if (isalnum(c)) {
postfix += c;
else if (c == '(') {
s.push(c);
else if (c == ')') {
postfix += s.top();
s.pop();
else if (isOperator(c)) {
postfix += s.top();
s.pop();
s.push(c);
while (!s.empty()) {
postfix += s.top();
s.pop();
}
return postfix;
int main() {
string infix;
return 0;
Output
#include <iostream>
#include <stack>
#include <string>
stack<int> stack;
if (isdigit(ch)) {
else {
if (stack.size() < 2) {
return -1;
stack.pop();
stack.pop();
switch (ch) {
case '+':
stack.push(operand1 + operand2);
break;
case '-':
stack.push(operand1 - operand2);
break;
case '*':
stack.push(operand1 * operand2);
break;
case '/':
if (operand2 == 0) {
stack.push(operand1 / operand2);
break;
default:
return -1;
if (stack.size() == 1) {
return stack.top();
} else {
return -1;
int main() {
string postfixExpression;
if (result != -1) {
return 0;
}
Output
Q 10. Queue
#include <stdio.h>
#include <stdlib.h>
struct Queue {
int items[MAX];
int front;
int rear;
};
q->front = -1;
q->rear = -1;
}
void enqueue(struct Queue* q, int value) {
if (isFull(q)) {
return;
if (q->front == -1) {
q->rear++;
q->items[q->rear] = value;
if (isEmpty(q)) {
return -1;
if (q->front == q->rear) {
} else {
q->front++;
return value;
}
void display(struct Queue* q) {
if (isEmpty(q)) {
printf("Queue is empty.\n");
return;
printf("Queue: ");
printf("\n");
// Main function
int main() {
struct Queue q;
initializeQueue(&q);
enqueue(&q, 10);
enqueue(&q, 20);
enqueue(&q, 30);
enqueue(&q, 40);
enqueue(&q, 50);
display(&q);
if (dequeuedValue != -1) {
display(&q);
enqueue(&q, 60);
display(&q);
return 0;
OUTPUT
Q 11 . Circular Queue
#include <iostream>
class CircularQueue {
private:
int *queue;
public:
CircularQueue(int cap) {
capacity = cap;
rear = -1;
size = 0;
~CircularQueue() {
delete[] queue;
bool isEmpty() {
return size == 0;
bool isFull() {
if (isFull()) {
cout << "Queue is full! Cannot enqueue " << value << endl;
return;
if (isEmpty()) {
front = rear = 0;
} else {
queue[rear] = value;
size++;
cout << "Enqueued: " << value << endl;
int dequeue() {
if (isEmpty()) {
return -1;
} else {
size--;
return value;
int peek() {
if (isEmpty()) {
return -1;
return queue[front];
}
// Display the elements in the queue
void display() {
if (isEmpty()) {
return;
int i = front;
do {
i = (i + 1) % capacity;
};
int main() {
int capacity;
CircularQueue cq(capacity);
cq.enqueue(10);
cq.enqueue(20);
cq.enqueue(30);
cq.display();
cq.dequeue();
cq.display();
cq.enqueue(40);
cq.enqueue(50);
cq.display();
cq.dequeue();
cq.enqueue(60);
cq.display();
return 0;
Output
#include <iostream>
if (arr[i] == key) {
if (arr[mid] == key) {
low = mid + 1;
} else {
high = mid - 1;
int main() {
int n, key;
cout << "Enter the number of elements in the array: ";
cin >> n;
int arr[n];
// Linear Search
if (linResult != -1) {
cout << "Linear Search: Key found at index " << linResult << endl;
} else {
// Binary Search
if (binResult != -1) {
cout << "Binary Search: Key found at index " << binResult << " (after sorting)" << endl;
} else {
return 0;
}
OUTPUT
#include <iostream>
#include <vector>
// Bubble Sort
int n = arr.size();
// Selection Sort
int n = arr.size();
int minIndex = i;
minIndex = j;
swap(arr[i], arr[minIndex]);
// Insertion Sort
int n = arr.size();
arr[j + 1] = arr[j];
j--;
arr[j + 1] = key;
int i = 0, j = 0, k = left;
arr[k] = L[i];
i++;
} else {
arr[k] = R[j];
j++;
}
k++;
arr[k] = L[i];
i++;
k++;
arr[k] = R[j];
j++;
k++;
// Merge Sort
int main() {
printArray(arr);
// Bubble Sort
bubbleSort(bubbleArr);
printArray(bubbleArr)
// Selection Sort
selectionSort(selectionArr);
printArray(selectionArr);
insertionSort(insertionArr);
printArray(insertionArr);
printArray(mergeArr);
return 0;
OUTPUT
Q 14. Binary Tree(Implementation )
#include <iostream>
struct Node {
int data;
Node* left;
Node* right;
Node(int value) {
data = value;
left = nullptr;
right = nullptr;
};
class BinaryTree {
public:
BinaryTree() {
root = nullptr;
void inorderTraversal() {
inorderHelper(root);
void preorderTraversal() {
preorderHelper(root);
void postorderTraversal() {
postorderHelper(root);
private:
if (node == nullptr) {
return new Node(value); // Create a new node if the current one is null
} else {
return node;
if (node != nullptr) {
if (node != nullptr) {
if (node != nullptr) {
};
int main() {
BinaryTree tree;
tree.insert(10);
tree.insert(5);
tree.insert(15);
tree.insert(3);
tree.insert(7);
tree.inorderTraversal();
tree.preorderTraversal();
tree.postorderTraversal();
return 0;
OUTPUT
#include <iostream>
struct Node {
int data;
Node* left;
Node* right;
Node(int val) {
data = val;
left = nullptr;
right = nullptr;
};
class BST {
public:
Node* root;
if (node == nullptr) {
return node;
node = node->left;
return node;
if (node == nullptr) {
return node;
} else {
if (node->left == nullptr) {
delete node;
return temp;
delete node;
return temp;
return node;
if (node != nullptr) {
inOrder(node->left);
inOrder(node->right);
void inOrder() {
inOrder(root);
};
int main() {
BST tree;
tree.insert(50);
tree.insert(30);
tree.insert(70);
tree.insert(20);
tree.insert(40);
tree.insert(60);
tree.insert(80);
tree.inOrder();
tree.deleteNode(20);
tree.inOrder();
tree.deleteNode(30);
tree.inOrder();
tree.deleteNode(50);
tree.inOrder()
return 0;
OUTPUT
Q 16. Binary Search Tree (Inorder,Preorder,Postorder,Traversal)
#include <iostream>
struct Node {
int data;
Node* left;
Node* right;
Node(int value) {
data = value;
left = nullptr;
right = nullptr;
};
class BST {
private:
Node* root
if (node == nullptr) {
return node;
inorderTraversal(node->left);
inorderTraversal(node->right);
preorderTraversal(node->left);
preorderTraversal(node->right);
}
postorderTraversal(node->left);
postorderTraversal(node->right);
public:
BST() {
root = nullptr;
void inorder() {
inorderTraversal(root);
void preorder() {
preorderTraversal(root);
void postorder() {
cout << "Postorder Traversal: ";
postorderTraversal(root);
};
int main() {
BST bst;
bst.insert(50);
bst.insert(30);
bst.insert(70);
bst.insert(20);
bst.insert(40);
bst.insert(60);
bst.insert(80);
return 0;
OUTPUT
Q 17. A V L Tree (Insertion,Deletion)
#include <iostream>
struct Node {
int key;
Node* left;
Node* right;
int height;
node->key = key;
node->left = nullptr;
node->right = nullptr;
node->height = 1;
return node;
}
int getBalance(Node* node) {
Node* rightRotate(Node* y) {
Node* x = y->left;
Node* T2 = x->right;
x->right = y;
y->left = T2;
return x;
Node* leftRotate(Node* x) {
Node* y = x->right;
Node* T2 = y->left;
y->left = x;
x->right = T
return y;
if (node == nullptr)
return createNode(key);
return node;
return rightRotate(node);
return leftRotate(node);
node->left = leftRotate(node->left);
return rightRotate(node);
node->right = rightRotate(node->right);
return leftRotate(node);
return node;
current = current->left;
return current;
}
if (root == nullptr)
return root
else {
if (temp == nullptr) {
temp = root;
root = nullptr;
} else
*root = *temp;
delete temp;
} else {
root->key = temp->key;
if (root == nullptr)
return root;
return rightRotate(root);
root->left = leftRotate(root->left);
return rightRotate(root);
return leftRotate(root);
root->right = rightRotate(root->right);
return leftRotate(root);
return root;
if (root != nullptr) {
inOrder(root->left);
inOrder(root->right);
int main() {
cout << "Inorder traversal of the constructed AVL tree is: ";
inOrder(root);
inOrder(root);
return 0;
OUTPUT
Q 18. B – Tree
#include <iostream>
#include <vector>
#include <algorithm>
class BTreeNode {
public:
vector<int> keys;
vector<BTreeNode*> children;
bool isLeaf;
};
class BTree {
public:
BTreeNode* root;
BTree() {
};
int i = keys.size() - 1;
if (isLeaf) {
i--;
keys.insert(keys.begin() + i + 1, key);
} else {
i--;
i++;
if (children[i]->keys.size() == 2 * T - 1) {
splitChild(i, children[i]);
i++;
children[i]->insertNonFull(key);
}
void BTreeNode::splitChild(int i, BTreeNode* y) {
z->keys.resize(T - 1);
if (!y->isLeaf) {
z->children.resize(T);
}
y->keys.resize(T - 1);
children.insert(children.begin() + i + 1, z);
if (root->keys.size() == 2 * T - 1) {
newNode->children.push_back(root);
newNode->splitChild(0, root);
int i = 0;
i++;
newNode->children[i]->insertNonFull(key);
root = newNode;
} else {
root->insertNonFull(key);
if (node == nullptr) {
return;
if (!node->isLeaf) {
traverse(node->children[i]);
}
if (!node->isLeaf) {
traverse(node->children[node->keys.size()]);
int main() {
BTree tree;
tree.insert(10);
tree.insert(20);
tree.insert(5);
tree.insert(6);
tree.insert(12);
tree.insert(30);
tree.insert(7);
tree.insert(17);
tree.traverse(tree.root);
return 0;
OUTPUT
Q 19.B+ Tree
#include <iostream>
#include <vector>
#include <algorithm>
class BPlusNode {
public:
bool isLeaf;
vector<int> keys;
vector<BPlusNode*> children;
vector<int> values;
isLeaf = leaf;
};
class BPlusTree {
private:
node->keys.resize(mid);
if (node->isLeaf) {
node->values.resize(mid);
} else {
node->children.resize(mid + 1);
if (parent == nullptr) {
parent = root;
parent->keys.push_back(newNode->keys[0]);
parent->children.push_back(node);
parent->children.push_back(newNode);
} else {
leaf->keys.insert(it, key);
leaf->values.insert(leaf->values.begin() + distance(leaf->keys.begin(), it), value);
if (node->isLeaf) {
} else {
if (node->isLeaf) {
} else {
return -1;
} else {
int index = lower_bound(node->keys.begin(), node->keys.end(), key) - node-
>keys.begin();
public:
BPlusTree(int order) {
this->order = order;
if (root->keys.size() == order - 1) {
newRoot->children.push_back(root);
root = newRoot;
cout << string(level, ' ') << "Level " << level << ": ";
if (!node->isLeaf) {
void print() {
printTree(root);
};
int main() {
tree.insert(10, 100);
tree.insert(20, 200);
tree.insert(5, 50);
tree.insert(6, 60);
tree.insert(30, 300);
tree.insert(40, 400);
tree.print();
cout << "\nSearching for key 10: " << tree.search(10) << endl; // Should return 100
cout << "Searching for key 20: " << tree.search(20) << endl; // Should return 200
cout << "Searching for key 50: " << tree.search(50) << endl; // Should return -1 (not found)
return 0;
}
OUTPUT
#include <iostream>
#include <climits>
#include <vector>
min = dist[v];
min_index = v;
return min_index;
dist[src] = 0;
sptSet[u] = true;
// and the total weight of path from source to v through u is less than the current
distance of v
if (!sptSet[v] && graph[u][v] != 0 && dist[u] != INT_MAX && dist[u] + graph[u][v] <
dist[v]) {
cout << "Vertex\tDistance from Source " << src << endl;
if (dist[i] == INT_MAX)
else
int main() {
{0, 4, 0, 0, 0, 0, 0, 8, 0},
{0, 8, 0, 7, 0, 4, 0, 0, 2},
{0, 0, 0, 0, 0, 2, 0, 1, 6},
{0, 0, 2, 0, 0, 0, 6, 7, 0}
};
return 0;
OUTPUT