0% found this document useful (0 votes)
30 views23 pages

C Programming: Data Structures & Algorithms

The document contains multiple experiments demonstrating various programming concepts in C, including dynamic memory allocation with structures, linear arrays, singly linked lists, stacks, postfix evaluation, binary search trees, and graph traversals. Each experiment includes objectives, code implementations, and user interaction for operations like insertion, deletion, and traversal. The author is Rajvardhan Mahajan, and the enrollment number is 0108EC241044.

Uploaded by

Raj Mahajan
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
30 views23 pages

C Programming: Data Structures & Algorithms

The document contains multiple experiments demonstrating various programming concepts in C, including dynamic memory allocation with structures, linear arrays, singly linked lists, stacks, postfix evaluation, binary search trees, and graph traversals. Each experiment includes objectives, code implementations, and user interaction for operations like insertion, deletion, and traversal. The author is Rajvardhan Mahajan, and the enrollment number is 0108EC241044.

Uploaded by

Raj Mahajan
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd

Experiment:-01

Objective: Write program to implement pointers and structure in C


to understand the concepts of Dynamic memory allocation.
Code:
#include <stdio.h>
#include <stdlib.h>
struct Student {
int roll;
char name[50];
float marks;
};
int main() {
struct Student *ptr;
int n, i;
printf("==========================================\n");
printf("Name = Rajvardhan Mahajan\n");
printf("Enrollment No = 0108EC241044\n");
printf("==========================================\n");
printf("\nEnter number of students: ");
scanf("%d", &n);
ptr = (struct Student *)malloc(n * sizeof(struct Student));
if (ptr == NULL) {
printf("Memory allocation failed.\n");
return 1;
}
for (i = 0; i < n; i++) {
printf("\nEnter details for student %d:\n", i + 1);
printf("Roll number: ");
scanf("%d", &(ptr + i)->roll);
printf("Name: ");
scanf(" %[^\n]%*c", (ptr + i)->name); // Reads string with spaces
printf("Marks: ");
scanf("%f", &(ptr + i)->marks);

1
}
printf("\n--- Student Records ---\n");
for (i = 0; i < n; i++) {
printf("\nStudent %d\n", i + 1);
printf("Roll number: %d\n", (ptr + i)->roll);
printf("Name: %s\n", (ptr + i)->name);
printf("Marks: %.2f\n", (ptr + i)->marks);
}
free(ptr);
return 0;
}
Output:

2
Experiment:-02
Objective: Write a program to implement concept of linear array
with following operations:
i. Traverse an array.
ii. Find minimum item, maximum item, and average of an array items.
iii. Insert a new item at beginning, end and middle position within an
array.
iv. Delete an item from an array.
Code:
#include <stdio.h>
#define MAX 100

void traverse(int a[], int n) {


for (int i = 0; i < n; i++) printf("%d ", a[i]);
printf("\n");
}
void minMaxAvg(int a[], int n) {
int min = a[0], max = a[0], sum = 0;
for (int i = 0; i < n; i++) {
if (a[i] < min) min = a[i];
if (a[i] > max) max = a[i];
sum += a[i];
}
printf("Min: %d\nMax: %d\nAvg: %.2f\n", min, max, (float)sum /
n);
}
int insert(int a[], int *n, int val, int pos) {
if (*n >= MAX || pos < 0 || pos > *n) return 0;
for (int i = *n; i > pos; i--) a[i] = a[i - 1];
a[pos] = val; (*n)++;
return 1;
}
int delete(int a[], int *n, int val) {
for (int i = 0; i < *n; i++) {
3
if (a[i] == val) {
for (int j = i; j < *n - 1; j++) a[j] = a[j + 1];
(*n)--; return 1;
}
}
return 0;
}
int main() {
int a[MAX], n, ch, val;
printf("==========================================\n");
printf("Name = Rajvardhan Mahajan\n");
printf("Enrollment No = 0108EC241044\n");
printf("==========================================\n");
printf("Enter no. of elements: ");
scanf("%d", &n);
printf("Enter elements:\n");
for (int i = 0; i < n; i++) scanf("%d", &a[i]);
while (1) {
printf("\[Link] [Link]/Max/Avg [Link] [Link] [Link]
[Link] [Link]\nChoice: ");
scanf("%d", &ch);
switch (ch) {
case 1: traverse(a, n); break;
case 2: minMaxAvg(a, n); break;
case 3: printf("Item: "); scanf("%d", &val);
insert(a, &n, val, 0) ? printf("Inserted.\n") :
printf("Fail.\n"); break;
case 4: printf("Item: "); scanf("%d", &val);
insert(a, &n, val, n) ? printf("Inserted.\n") :
printf("Fail.\n"); break;
case 5: printf("Item: "); scanf("%d", &val);
insert(a, &n, val, n/2) ? printf("Inserted.\n") :
printf("Fail.\n"); break;
case 6: printf("Item: "); scanf("%d", &val);

4
delete(a, &n, val) ? printf("Deleted.\n") : printf("Not
found.\n"); break;
case 7: return 0;
default: printf("Invalid!\n");
}
}
}
Output:

5
Experiment:-03
Objective: Write a program to implement singly linked list with
following operations
i. Insert a new item at beginning, end and middle position within a
single linked list.
ii. Delete an item from single linked list.
iii. Traverse a single linked list.
Code:
#include <stdio.h>
#include <stdlib.h>
struct Node { int data; struct Node* next; };
struct Node* head = NULL;
void traverse() {
struct Node* t = head;
printf("Linked List: ");
while (t) { printf("%d -> ", t->data); t = t->next; }
printf("NULL\n");
}
void insert(int val, int pos) {
struct Node* n = malloc(sizeof(struct Node)); n->data = val;
if (pos <= 1 || !head) { n->next = head; head = n; return; }
struct Node* t = head;
for (int i = 1; i < pos - 1 && t->next; i++) t = t->next;
n->next = t->next; t->next = n;
}
void insertEnd(int val) {
struct Node* n = malloc(sizeof(struct Node)); n->data = val; n->next = NULL;
if (!head) head = n;
else { struct Node* t = head; while (t->next) t = t->next; t->next = n; }
}
void delete(int val) {
struct Node *t = head, *p = NULL;
while (t && t->data != val) p = t, t = t->next;
if (!t) { printf("Item not found.\n"); return; }
if (!p) head = t->next; else p->next = t->next;

6
free(t); printf("Item deleted.\n");
}
int main() {
int ch, val, pos;
printf("====================================\n");
printf("Name = Rajvardhan Mahajan\n");
printf("Enrollment No = 0108EC241044\n");
printf("====================================\n");
while (1) {
printf("\n1. Traverse\n2. Insert at Beginning\n3. Insert at End\n");
printf("4. Insert at Middle\n5. Delete\n6. Exit\nChoice: ");
scanf("%d", &ch);

switch (ch) {
case 1: traverse(); break;
case 2: printf("Enter value: "); scanf("%d", &val); insert(val, 1); break;
case 3: printf("Enter value: "); scanf("%d", &val); insertEnd(val); break;
case 4: printf("Enter value and position: "); scanf("%d %d", &val, &pos);
insert(val, pos); break;
case 5: printf("Enter value to delete: "); scanf("%d", &val); delete(val);
break;
case 6: return 0;
default: printf("Invalid choice.\n");
}
}
}
Output:

7
Experiment:-04
Objective: Write a program to implement Stack with its operations
(Push, Pop, Peek, Is Empty) using:
i. Using array
ii. Using linked list
Code:
i. Stack Using Array =

#include <stdio.h>
#define MAX 100

int stack[MAX], top = -1;

void push(int val) {


if (top == MAX - 1) printf("Stack Overflow\n");
else stack[++top] = val;
}
void pop() {
if (top == -1) printf("Stack Underflow\n");
else printf("Popped: %d\n", stack[top--]);
}
void peek() {
if (top == -1) printf("Stack is Empty\n");
else printf("Top element: %d\n", stack[top]);
}
void isEmpty() {
if (top == -1) printf("Stack is Empty\n");
else printf("Stack is Not Empty\n");
}
int main() {
int ch, val;
printf("====================================\n");
printf("Name = Rajvardhan Mahajan\n");

8
printf("Enrollment No = 0108EC241044\n");
printf("====================================\n");
while (1) {
printf("\[Link] [Link] [Link] [Link] [Link]\nChoose: ");
scanf("%d", &ch);
switch (ch) {
case 1: printf("Enter value: "); scanf("%d", &val); push(val);
break;
case 2: pop(); break;
case 3: peek(); break;
case 4: isEmpty(); break;
case 5: return 0;
default: printf("Invalid choice\n");
}
}
}
Output:

9
ii. Stack Using Linked List =

#include <stdio.h>
#include <stdlib.h>
struct Node {
int data;
struct Node* next;
};
struct Node* top = NULL;
void push(int val) {
struct Node* n = malloc(sizeof(struct Node));
n->data = val;
n->next = top;
top = n;
}
void pop() {
if (!top) printf("Stack Underflow\n");
else {
printf("Popped: %d\n", top->data);
struct Node* t = top;
top = top->next;
free(t);
}
}
void peek() {
if (!top) printf("Stack is Empty\n");
else printf("Top element: %d\n", top->data);
}
void isEmpty() {
if (!top) printf("Stack is Empty\n");
else printf("Stack is Not Empty\n");
}
int main() {
int ch, val;
printf("====================================\n");

10
printf("Name = Rajvardhan Mahajan\n");
printf("Enrollment No = 0108EC241044\n");
printf("====================================\n");
while (1) {
printf("\[Link] [Link] [Link] [Link] [Link]\nChoose: ");
scanf("%d", &ch);
switch (ch) {
case 1: printf("Enter value: "); scanf("%d", &val); push(val);
break;
case 2: pop(); break;
case 3: peek(); break;
case 4: isEmpty(); break;
case 5: return 0;
default: printf("Invalid choice\n");
}
}
}
Output:

11
Experiment:-05
Objective: Write a program to evaluate postfix notation using stack.

Code:
#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>
#define MAX 100
int stack[MAX];
int top = -1;
void push(int val) {
if (top >= MAX - 1) {
printf("Stack Overflow\n");
return;
}
stack[++top] = val;
}
int pop() {
if (top == -1) {
printf("Stack Underflow\n");
exit(1); // Terminate on error
}
return stack[top--];
}
int evaluatePostfix(char* exp) {
int i = 0;
while (exp[i] != '\0') {
char ch = exp[i];
if (isdigit(ch)) {
push(ch - '0'); // convert char to int
} else if (ch == '+' || ch == '-' || ch == '*' || ch == '/') {
int val2 = pop();
int val1 = pop();
switch (ch) {
12
case '+': push(val1 + val2); break;
case '-': push(val1 - val2); break;
case '*': push(val1 * val2); break;
case '/': push(val1 / val2); break;
}
}
i++;
}
return pop();
}
int main() {
char postfix[MAX];
printf("====================================\n");
printf("Name = Rajvardhan Mahajan\n");
printf("Enrollment No = 0108EC241044\n");
printf("====================================\n");
printf("Enter postfix expression (single-digit operands only): ");
scanf("%s", postfix);
int result = evaluatePostfix(postfix);
printf("Result: %d\n", result);
return 0;
}

Output:

13
Experiment:-06
Objective: Write a program to implement binary search tree with
insert and delete operations.
Code:
#include <stdio.h>
#include <stdlib.h>
struct Node {
int d;
struct Node *l, *r;
};
struct Node* newNode(int val) {
struct Node* n = (struct Node*)malloc(sizeof(struct Node));
n->d = val; n->l = n->r = NULL;
return n;
}
struct Node* insert(struct Node* root, int val) {
if (!root) return newNode(val);
if (val < root->d) root->l = insert(root->l, val);
else root->r = insert(root->r, val);
return root;
}
struct Node* minNode(struct Node* n) {
while (n && n->l) n = n->l;
return n;
}
struct Node* del(struct Node* root, int val) {
if (!root) return root;
if (val < root->d) root->l = del(root->l, val);
else if (val > root->d) root->r = del(root->r, val);
else {
if (!root->l) { struct Node* t = root->r; free(root); return t; }
if (!root->r) { struct Node* t = root->l; free(root); return t; }
struct Node* t = minNode(root->r);
root->d = t->d;
root->r = del(root->r, t->d);
}
return root;

14
}
void in(struct Node* r) {
if (r) { in(r->l); printf("%d ", r->d); in(r->r); }
}
int main() {
struct Node* root = NULL;
int ch, v;
printf("\n=============================\n");
printf("Name = Rajvardhan Mahajan\n");
printf("Enroll= 0108EC241044\n");
printf("=============================\n");
while (1) {
printf("\[Link] [Link] [Link] [Link]\nChoice: ");
scanf("%d", &ch);
if (ch == 1) {
printf("Val: "); scanf("%d", &v);
root = insert(root, v);
} else if (ch == 2) {
printf("Val: "); scanf("%d", &v);
root = del(root, v);
} else if (ch == 3) {
in(root); printf("\n");
} else break;
}
return 0;
}
Output:

15
Experiment:-07
Objective: Write a program to implement depth first traverse and
breadth first traverse on a graph.

Code:
#include <stdio.h>
#include <stdlib.h>
#define MAX 100
int adj[MAX][MAX], visited[MAX], n;
void dfs(int v) {
printf("%d ", v);
visited[v] = 1;
for (int i = 0; i < n; i++)
if (adj[v][i] && !visited[i])
dfs(i);
}
void bfs(int start) {
int q[MAX], front = 0, rear = 0;
visited[start] = 1;
q[rear++] = start;
while (front < rear) {
int v = q[front++];
printf("%d ", v);
for (int i = 0; i < n; i++)
if (adj[v][i] && !visited[i]) {
visited[i] = 1;

16
q[rear++] = i;
}
}
}
int main() {
int e, u, v, start;
printf("====================================\n");
printf("Name = Rajvardhan Mahajan\n");
printf("Enrollment No = 0108EC241044\n");
printf("====================================\n");
printf("Enter number of vertices: ");
scanf("%d", &n);
printf("Enter number of edges: ");
scanf("%d", &e);
for (int i = 0; i < e; i++) {
printf("Edge %d (u v): ", i + 1);
scanf("%d%d", &u, &v);
adj[u][v] = adj[v][u] = 1;
}
printf("\nStart vertex for DFS: ");
scanf("%d", &start);
for (int i = 0; i < n; i++) visited[i] = 0;
printf("DFS Traversal: ");
dfs(start);
printf("\n\nStart vertex for BFS: ");

17
scanf("%d", &start);
for (int i = 0; i < n; i++) visited[i] = 0;
printf("BFS Traversal: ");
bfs(start);
return 0;
}
Output:

18
Experiment:-08
Objective: Write program to implement linear search and binary
search on a given array.

Code:
#include <stdio.h>
void linearSearch(int a[], int n, int x) {
for (int i = 0; i < n; i++)
if (a[i] == x) { printf("Found at %d (Linear)\n", i); return; }
printf("Not found (Linear)\n");
}
void binarySearch(int a[], int n, int x) {
int l = 0, r = n - 1, m;
while (l <= r) {
m = (l + r) / 2;
if (a[m] == x) { printf("Found at %d (Binary)\n", m); return; }
else if (a[m] < x) l = m + 1;
else r = m - 1;
}
printf("Not found (Binary)\n");
}
int main() {
int a[100], n, x;
printf("====================================\n");
printf("Name = Rajvardhan Mahajan\n");
printf("Enrollment No = 0108EC241044\n");
printf("====================================\n");
printf("Enter size: "); scanf("%d", &n);
printf("Enter sorted array: ");

19
for (int i = 0; i < n; i++) scanf("%d", &a[i]);
printf("Search item: "); scanf("%d", &x);
linearSearch(a, n, x);
binarySearch(a, n, x);
}
Output:

20
Experiment:-09

Objective: Write a program to sort a given list of 10000 random


integers and compare their execution time using:
i. Bubble sort
ii. Insertion sort
iii. Merge sort
iv. Quick sort
v. Radix sort
Code:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define N 10000
void copy(int *a, int *b) { for (int i = 0; i < N; i++) b[i] = a[i]; }
void bubble(int *a) {
for (int i = 0; i < N-1; i++) for (int j = 0; j < N-i-1; j++)
if (a[j] > a[j+1]) { int t = a[j]; a[j] = a[j+1]; a[j+1] = t; }
}
void insertion(int *a) {
for (int i = 1; i < N; i++) {
int key = a[i], j = i-1;
while (j >= 0 && a[j] > key) a[j+1] = a[j--];
a[j+1] = key;
}
}
void merge(int *a, int l, int m, int r) {
int i=l, j=m+1, k=0, t[r-l+1];

21
while(i<=m && j<=r) t[k++] = a[i]<a[j] ? a[i++] : a[j++];
while(i<=m) t[k++] = a[i++]; while(j<=r) t[k++] = a[j++];
for(i=l,k=0; i<=r; i++) a[i]=t[k++];
}
void msort(int *a, int l, int r) {
if (l<r) { int m=(l+r)/2; msort(a,l,m); msort(a,m+1,r); merge(a,l,m,r);
}
}
int part(int *a, int l, int r) {
int p=a[r], i=l-1;
for (int j=l; j<r; j++) if (a[j]<p) { int t=a[++i]; a[i]=a[j]; a[j]=t; }
int t=a[i+1]; a[i+1]=a[r]; a[r]=t;
return i+1;
}
void qsort_(int *a, int l, int r) {
if (l<r) { int p=part(a,l,r); qsort_(a,l,p-1); qsort_(a,p+1,r); }
}
void radix(int *a) {
int max = a[0]; for (int i = 1; i < N; i++) if (a[i] > max) max = a[i];
for (int exp=1; max/exp>0; exp*=10) {
int out[N]={0}, cnt[10]={0};
for (int i=0;i<N;i++) cnt[(a[i]/exp)%10]++;
for (int i=1;i<10;i++) cnt[i]+=cnt[i-1];
for (int i=N-1;i>=0;i--) out[--cnt[(a[i]/exp)%10]] = a[i];
for (int i=0;i<N;i++) a[i]=out[i];
}
}
void timer(void (*sort)(int*), int *base, char *name) {
int a[N]; copy(base,a);

22
clock_t s=clock(); sort(a); printf("%s Sort: %.3f sec\n", name,
(double)(clock()-s)/CLOCKS_PER_SEC);
}
int main() {
int base[N];
for (int i = 0; i < N; i++) base[i] = rand() % 10000;
printf("====================================\n");
printf("Name = Rajvardhan Mahajan\n");
printf("Enrollment No = 0108EC241044\n");
printf("====================================\n");
timer(bubble, base, "Bubble");
timer(insertion, base, "Insertion");
int a1[N]; copy(base,a1);
clock_t s1 = clock(); msort(a1, 0, N-1);
printf("Merge Sort: %.3f sec\n", (double)(clock()-
s1)/CLOCKS_PER_SEC);
int a2[N]; copy(base,a2);
clock_t s2 = clock(); qsort_(a2, 0, N-1);
printf("Quick Sort: %.3f sec\n", (double)(clock()-
s2)/CLOCKS_PER_SEC);
timer(radix, base, "Radix");
return 0;
}
Output:

23

You might also like