DS Practicals
DS Practicals
int main() {
int arr[] = {1, 2, 3, 4, 2, 5, 2, 6};
int size = sizeof(arr) / sizeof(arr[0]);
searchElementAndCount(arr, size, 2);
searchElementAndCount(arr, size, 7);
return 0;
}
1
int insertElement(int arr[], int size, int capacity, int element, int position) {
if (size >= capacity || position < 0 || position > size) {
printf("Cannot insert.\n");
return size;
}
for (int i = size - 1; i >= position; i--) {
arr[i + 1] = arr[i];
}
arr[position] = element;
return size + 1;
}
int main() {
int arr[10] = {10, 20, 30, 40, 50};
int size = 5;
printf("Original: "); displayArray(arr, size);
size = insertElement(arr, size, 10, 25, 2);
printf("After insert: "); displayArray(arr, size);
size = deleteElement(arr, size, 1);
printf("After delete: "); displayArray(arr, size);
return 0;
}
3. Binary Search
Performs binary search on a sorted array.
#include <stdio.h>
2
}
if (arr[mid] < element) {
low = mid + 1;
} else {
high = mid - 1;
}
}
return -1;
}
int main() {
int arr[] = {10, 20, 30, 40, 50, 60};
int size = sizeof(arr) / sizeof(arr[0]);
int element = 30;
int result = binarySearch(arr, size, element);
if (result != -1) {
printf("Element %d found at index %d.\n", element, result);
} else {
printf("Element %d not found.\n", element);
}
return 0;
}
4. Bubble Sort
Sorts an array using Bubble Sort.
#include <stdio.h>
3
int main() {
int arr[] = {64, 34, 25, 12, 22, 11, 90};
int n = sizeof(arr) / sizeof(arr[0]);
bubbleSort(arr, n);
printf("Sorted array: "); printArray(arr, n);
return 0;
}
5. Selection Sort
Sorts an array using Selection Sort.
#include <stdio.h>
int main() {
int arr[] = {64, 25, 12, 22, 11, 90};
int n = sizeof(arr) / sizeof(arr[0]);
selectionSort(arr, n);
printf("Sorted array: "); printArray(arr, n);
return 0;
}
4
#include <stdio.h>
#include <stdlib.h>
5
struct Node *prev = NULL, *current = head, *nextNode = NULL;
while (current != NULL) {
nextNode = current->next; current->next = prev;
prev = current; current = nextNode;
}
return prev;
}
int main() {
struct Node* head = NULL;
head = insertAtBeginning(head, 30);
head = insertAtBeginning(head, 20);
head = insertAtBeginning(head, 10);
printf("List: "); traverseList(head);
searchElement(head, 20);
head = deleteByValue(head, 20);
printf("After deleting 20: "); traverseList(head);
head = reverseList(head);
printf("Reversed list: "); traverseList(head);
while(head != NULL){
struct Node* temp = head;
head = head->next;
free(temp);
}
return 0;
}
6
}
int main() {
struct NodeCLL* last = NULL;
last = insertAtEndCLL(last, 10);
last = insertAtEndCLL(last, 20);
last = insertAtEndCLL(last, 30);
printf("CLL: "); displayCLL(last);
last = deleteFromBeginningCLL(last);
printf("After delete: "); displayCLL(last);
if (last) {
struct NodeCLL* curr = last->next;
struct NodeCLL* next_node;
if (curr == last) { // Single node case after deletion
free(curr);
last = NULL;
} else {
do {
next_node = curr->next;
free(curr);
curr = next_node;
} while (curr != last); // Free until last node
free(last); // Free the last node itself
last = NULL;
}
}
return 0;
}
7
#include <stdio.h>
#include <stdlib.h>
int main() {
struct NodeDLL* head = NULL;
head = insertAtEndDLL(head, 10);
head = insertAtEndDLL(head, 20);
head = insertAtEndDLL(head, 30);
printf("DLL: "); displayDLL(head);
head = deleteFromEndDLL(head);
printf("After delete: "); displayDLL(head);
while(head != NULL){
struct NodeDLL* temp = head;
head = head->next;
free(temp);
}
return 0;
8
}
9
}
}
printf("\n");
}
}
int main() {
struct SparseNode* sm_head = NULL;
int mat[3][4] = {{0,5,0,0},{0,0,1,0},{2,0,0,8}};
int R=3, C=4;
for(int i=0; i<R; i++) {
for(int j=0; j<C; j++) {
sm_head = addNonZero(sm_head,i,j,mat[i][j]);
}
}
displaySparse(sm_head, R, C);
while(sm_head){
struct SparseNode* temp_free = sm_head;
sm_head = sm_head->next;
free(temp_free);
}
return 0;
}
10
curr->coeff += c;
free(nt);
if (curr->coeff == 0) {
if (prev) prev->next = curr->next; else poly = curr->next;
free(curr);
}
} else {
if (prev) prev->next = nt; else poly = nt;
nt->next = curr;
}
return poly;
}
int main() {
struct Term* p = NULL;
p = addTerm(p, 5, 3);
p = addTerm(p, -2, 2);
p = addTerm(p, 7, 1);
printf("Poly: "); displayPoly(p);
p = addTerm(p, 2, 2);
printf("Poly: "); displayPoly(p);
while(p){
struct Term* temp = p;
p = p->next;
free(temp);
}
return 0;
}
11
11. Stack Implementations (Array and Linked List)
11.1 Stack using Array
#include <stdio.h>
#define MAX_STACK 10
int main() {
ArrayStack s; initArrStack(&s);
pushArr(&s, 10); pushArr(&s, 20); pushArr(&s, 30);
displayArrStack(&s);
printf("Popped: %d\n", popArr(&s));
displayArrStack(&s);
return 0;
}
12
void initLLStack(LLStack* s) { s->top = NULL; }
int isLLEmpty(LLStack* s) { return s->top == NULL; }
int main() {
LLStack s; initLLStack(&s);
pushLL(&s, 100); pushLL(&s, 200); pushLL(&s, 300);
displayLLStack(&s);
printf("Popped: %d\n", popLL(&s));
displayLLStack(&s);
while(!isLLEmpty(&s)) popLL(&s);
return 0;
}
Queue* createQueue() {
Queue* q = (Queue*)malloc(sizeof(Queue));
q->front = q->rear = NULL; return q;
}
int isQEmpty(Queue* q) { return q->front == NULL; }
13
void enqueue(Queue* q, int val) {
QNode* nn = (QNode*)malloc(sizeof(QNode));
nn->data = val; nn->next = NULL;
if (q->rear == NULL) { q->front = q->rear = nn; return; }
q->rear->next = nn; q->rear = nn;
}
int dequeue(Queue* q) {
if (isQEmpty(q)) { printf("Queue empty.\n"); return -1; }
QNode* temp = q->front; int val = temp->data;
q->front = q->front->next;
if (q->front == NULL) q->rear = NULL;
free(temp); return val;
}
void displayQ(Queue* q) {
if(isQEmpty(q)) {
printf("Queue is empty.\n");
return;
}
QNode* temp = q->front; printf("Queue (front to rear): ");
while(temp) { printf("%d ", temp->data); temp = temp->next; }
printf("\n");
}
int main() {
Queue* q = createQueue();
enqueue(q, 1); enqueue(q, 2); enqueue(q, 3);
displayQ(q);
printf("Dequeued: %d\n", dequeue(q));
displayQ(q);
while(!isQEmpty(q)) {
dequeue(q);
}
free(q);
return 0;
}
CQueue* createCQueue() {
14
CQueue* cq = (CQueue*)malloc(sizeof(CQueue));
cq->rear = NULL; return cq;
}
int isCQEmpty(CQueue* cq) { return cq->rear == NULL; }
int main() {
CQueue* cq = createCQueue();
cqEnqueue(cq, 10); cqEnqueue(cq, 20); cqEnqueue(cq, 30);
displayCQ(cq);
printf("Dequeued: %d\n", cqDequeue(cq));
displayCQ(cq);
while(!isCQEmpty(cq)) {
cqDequeue(cq);
}
free(cq);
return 0;
}
typedef struct TreeNode { int data; struct TreeNode *left, *right; } TreeNode;
15
t->data = item; t->left = t->right = NULL; return t;
}
TreeNode* insertBST(TreeNode* node, int data) {
if (node == NULL) return newTNode(data);
if (data < node->data) {
node->left = insertBST(node->left, data);
} else if (data > node->data) {
node->right = insertBST(node->right, data);
}
return node;
}
void inorder(TreeNode* root) {
if (root) {
inorder(root->left);
printf("%d ", root->data);
inorder(root->right);
}
}
void freeBST(TreeNode* root) {
if (!root) return;
freeBST(root->left);
freeBST(root->right);
free(root);
}
int main() {
TreeNode* root = NULL;
root = insertBST(root, 50);
insertBST(root, 30);
insertBST(root, 20);
insertBST(root, 40);
insertBST(root, 70);
insertBST(root, 60);
insertBST(root, 80);
printf("Inorder of BST: "); inorder(root); printf("\n");
freeBST(root);
return 0;
}
16
typedef struct TreeNodeTrav {
int data;
struct TreeNodeTrav *left, *right;
} TreeNodeTrav;
17
}
}
int main() {
TreeNodeTrav* root = NULL;
root = insertBSTTrav(root, 50);
insertBSTTrav(root, 30);
insertBSTTrav(root, 70);
insertBSTTrav(root, 20);
insertBSTTrav(root, 40);
insertBSTTrav(root, 60);
insertBSTTrav(root, 80);
printf("Inorder: ");
inorderTrav(root);
printf("\n");
printf("Preorder: ");
preorderTrav(root);
printf("\n");
printf("Postorder: ");
postorderTrav(root);
printf("\n");
freeBSTTrav(root);
return 0;
}
int adjMat[MAX_V][MAX_V];
int numV;
void initAdjMat(int n) {
18
numV = n;
for (int i = 0; i < numV; i++) {
for (int j = 0; j < numV; j++) {
adjMat[i][j] = 0;
}
}
}
void addEdgeMat(int u, int v) {
if (u<numV && v<numV) {
adjMat[u][v] = 1;
adjMat[v][u] = 1;
}
}
void displayAdjMat() {
printf("Adj Matrix:\n ");
for(int i=0; i<numV; i++) printf("%d ", i);
printf("\n");
for (int i = 0; i < numV; i++) {
printf("%d ", i);
for (int j = 0; j < numV; j++) {
printf("%d ", adjMat[i][j]);
}
printf("\n");
}
}
int main() {
initAdjMat(4);
addEdgeMat(0, 1);
addEdgeMat(0, 2);
addEdgeMat(1, 2);
addEdgeMat(2, 3);
displayAdjMat();
return 0;
}
int adjM[MAX_VT][MAX_VT];
int nV;
int visited[MAX_VT];
19
int bfs_q[MAX_VT], front_q = -1, rear_q = -1;
void enq(int item) {
if(rear_q == MAX_VT-1) return;
if(front_q == -1) front_q=0;
rear_q++;
bfs_q[rear_q]=item;
}
int deq() {
if(front_q == -1 || front_q > rear_q) return -1;
int item = bfs_q[front_q++];
if(front_q > rear_q) front_q=rear_q=-1;
return item;
}
int is_q_empty() { return front_q == -1; }
void initGraphTrav(int n) {
nV = n;
for(int i=0; i<nV; i++) {
visited[i]=0;
for(int j=0; j<nV; j++) adjM[i][j]=0;
}
front_q = rear_q = -1;
}
void addEdgeTrav(int u, int v) {
if(u<nV && v<nV) {
adjM[u][v]=1;
adjM[v][u]=1;
}
}
void DFS(int v) {
printf("%d ", v);
visited[v] = 1;
for (int i = 0; i < nV; i++) {
if (adjM[v][i] && !visited[i]) {
DFS(i);
}
}
}
20
while(!is_q_empty()) {
int curr = deq();
printf("%d ", curr);
for(int i=0; i<nV; i++) {
if(adjM[curr][i] && !visited[i]) {
visited[i]=1;
enq(i);
}
}
}
}
int main() {
initGraphTrav(5);
addEdgeTrav(0,1);
addEdgeTrav(0,2);
addEdgeTrav(1,3);
addEdgeTrav(1,4);
addEdgeTrav(2,4);
21