0% found this document useful (0 votes)
17 views

Data Structure Programs

Uploaded by

Khalid Ahmad
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)
17 views

Data Structure Programs

Uploaded by

Khalid Ahmad
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
You are on page 1/ 40

Program: (Floyd Warshal)

#include <stdio.h>

// Define the number of vertices


#define nV 4

// Define the infinite value for the graph


#define INF 999

// Function to print the matrix


void printMatrix(int matrix[][nV]) {
for (int i = 0; i < nV; i++) {
for (int j = 0; j < nV; j++) {
if (matrix[i][j] == INF)
printf("%4s", "INF");
else
printf("%4d", matrix[i][j]);
}
printf("\n");
}
}

// Floyd Warshall Algorithm


void floydWarshall(int graph[][nV]) {
int matrix[nV][nV], i, j, k;

// Initialize the matrix with the given graph


for (i = 0; i < nV; i++)
for (j = 0; j < nV; j++)
matrix[i][j] = graph[i][j];

// Adding vertices individually


for (k = 0; k < nV; k++) {
for (i = 0; i < nV; i++) {
for (j = 0; j < nV; j++) {
if (matrix[i][k] + matrix[k][j] < matrix[i][j])
matrix[i][j] = matrix[i][k] + matrix[k][j];
}
}
}
printMatrix(matrix);
}

int main() {
int graph[nV][nV] = {
{0, 3, INF, 5},
{2, 0, INF, 4},
{INF, 1, 0, INF},
{INF, INF, 2, 0}
};

floydWarshall(graph);

return 0;
}

Output:

0 3 7 5
2 0 6 4
3 1 0 5
5 3 2 0
Program: (Travelling Salesman Problem)

#include <stdio.h>
#include <stdlib.h>

// Define the number of vertices


#define nV 4

// Define the infinite value for the graph


#define INF 999

// Function to print the matrix


void printMatrix(int matrix[][nV]) {
for (int i = 0; i < nV; i++) {
for (int j = 0; j < nV; j++) {
if (matrix[i][j] == INF)
printf("%4s", "INF");
else
printf("%4d", matrix[i][j]);
}
printf("\n");
}
}

// Function to calculate the minimum cost


int minCost(int cost[][nV], int completed[nV]) {
int i, nc = 999, min = 999, kmin;
for (i = 0; i < nV; i++) {
if ((cost[0][i] != 0) && (completed[i] == 0)) {
if (cost[0][i] < min) {
min = cost[0][i];
kmin = cost[0][i];
nc = i;
}
}
}
if (min != INF)
cost[0][nc] += kmin;
return nc;
}
// Function to solve the TSP using dynamic programming
void tspDynamic(int cost[][nV]) {
int i, j, k, completed[nV];
int matrix[nV][nV], mincost = 0;

// Initialize the matrix with the given graph


for (i = 0; i < nV; i++)
for (j = 0; j < nV; j++)
matrix[i][j] = cost[i][j];

// Calculate the minimum cost for each subset


for (i = 1; i < nV; i++) {
completed[i - 1] = 0;
for (j = 0; j < nV; j++) {
if ((cost[0][j] != 0) && (completed[j] == 0)) {
if (cost[0][j] < matrix[0][j]) {
matrix[0][j] = cost[0][j];
}
}
}
}

// Calculate the minimum cost for the remaining vertices


for (i = 1; i < nV; i++) {
completed[i - 1] = 1;
for (j = 0; j < nV; j++) {
if ((cost[0][j] != 0) && (completed[j] == 0)) {
if (cost[0][j] < matrix[0][j]) {
matrix[0][j] = cost[0][j];
}
}
}
}

// Print the minimum cost matrix


printMatrix(matrix);

// Calculate the total minimum cost


for (i = 0; i < nV; i++) {
mincost += matrix[0][i];
}

printf("\nMinimum cost: %d\n", mincost);


}

int main() {
int cost[nV][nV] = {
{0, 7, 3, 12},
{7, 0, 2, 9},
{3, 2, 0, 5},
{12, 9, 5, 0}
};

tspDynamic(cost);

return 0;
}

Output:

0 7 3 12
7 0 2 9
3 2 0 5
12 9 5 0
Program: (Tree Traversals)

#include <stdio.h>

// Define the structure for a node


struct Node {
int data;
struct Node* left;
struct Node* right;
};

// Function to create a new node


struct Node* createNode(int value) {
struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));
newNode->data = value;
newNode->left = NULL;
newNode->right = NULL;
return newNode;
}

// Function to perform inorder traversal


void inorderTraversal(struct Node* root) {
if (root == NULL) return;
inorderTraversal(root->left);
printf("%d ->", root->data);
inorderTraversal(root->right);
}

// Function to perform preorder traversal


void preorderTraversal(struct Node* root) {
if (root == NULL) return;
printf("%d ->", root->data);
preorderTraversal(root->left);
preorderTraversal(root->right);
}

// Function to perform postorder 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 = createNode(1);
root->left = createNode(12);
root->right = createNode(9);
root->left->left = createNode(5);
root->left->right = createNode(6);

printf("Inorder traversal: ");


inorderTraversal(root);
printf("\n");

printf("Preorder traversal: ");


preorderTraversal(root);
printf("\n");

printf("Postorder traversal: ");


postorderTraversal(root);
printf("\n");

return 0;
}

Output:

Inorder traversal: 5 ->12 ->6 ->1 ->9 ->


Preorder traversal: 1 ->12 ->5 ->6 ->9 ->
Postorder traversal: 5 ->6 ->12 ->9 ->1 ->
Program: (Graph Traversals)

#include <stdio.h>
#include <stdlib.h>

// Define the number of vertices


#define nV 7

// Define the structure for a node


struct Node {
int data;
struct Node* next;
};

// Function to create a new node


struct Node* createNode(int value) {
struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));
newNode->data = value;
newNode->next = NULL;
return newNode;
}

// Function to perform BFS traversal


void bfsTraversal(struct Node* root) {
if (root == NULL) return;
struct Node* queue[nV];
int front = 0, rear = 0;
int visited[nV];
for (int i = 0; i < nV; i++) {
visited[i] = 0;
}
queue[rear++] = root;
visited[root->data] = 1;
while (front < rear) {
struct Node* node = queue[front++];
printf("%d ->", node->data);
struct Node* temp = node->next;
while (temp != NULL) {
if (!visited[temp->data]) {
queue[rear++] = temp;
visited[temp->data] = 1;
}
temp = temp->next;
}
}
printf("\n");
}

// Function to perform DFS traversal


void dfsTraversal(struct Node* root) {
if (root == NULL) return;
struct Node* stack[nV];
int top = -1;
int visited[nV];
for (int i = 0; i < nV; i++) {
visited[i] = 0;
}
stack[++top] = root;
visited[root->data] = 1;
while (top >= 0) {
struct Node* node = stack[top--];
printf("%d ->", node->data);
struct Node* temp = node->next;
while (temp != NULL) {
if (!visited[temp->data]) {
stack[++top] = temp;
visited[temp->data] = 1;
}
temp = temp->next;
}
}
printf("\n");
}

int main() {
struct Node* root = createNode(3);
root->next = createNode(0);
root->next->next = createNode(4);
root->next->next->next = createNode(1);
root->next->next->next->next = createNode(2);
root->next->next->next->next->next = createNode(5);
root->next->next->next->next->next->next = createNode(6);

printf("BFS traversal: ");


bfsTraversal(root);

printf("DFS traversal: ");


dfsTraversal(root);

return 0;
}

Output:

BFS traversal: 3 ->0 ->4 ->1 ->2 ->5 ->6 ->


DFS traversal: 3 ->6 ->5 ->2 ->1 ->4 ->0 ->
Program (Multi-Stage Graph):

#include <stdio.h>
#include <limits.h>

#define NUM_STAGES 3
#define NUM_NODES 4

// Function to find the minimum cost path


int findMinCost(int graph[NUM_STAGES][NUM_NODES][NUM_NODES], int source, int
destination) {
int cost[NUM_STAGES][NUM_NODES];
int prev[NUM_STAGES][NUM_NODES];
int i, j, k;

// Initialize the cost and prev arrays


for (i = 0; i < NUM_STAGES; i++) {
for (j = 0; j < NUM_NODES; j++) {
cost[i][j] = INT_MAX;
prev[i][j] = -1;
}
}

// Set the cost for the source node in the first stage
cost[0][source] = 0;

// Iterate through the stages


for (i = 1; i < NUM_STAGES; i++) {
for (j = 0; j < NUM_NODES; j++) {
for (k = 0; k < NUM_NODES; k++) {
if (cost[i-1][k] != INT_MAX && cost[i-1][k] + graph[i-1][k][j] < cost[i][j]) {
cost[i][j] = cost[i-1][k] + graph[i-1][k][j];
prev[i][j] = k;
}
}
}
}

// Find the minimum cost path


int minCost = cost[NUM_STAGES-1][destination];
int path[NUM_STAGES];
int pathLength = 0;

// Reconstruct the minimum cost path


i = NUM_STAGES - 1;
j = destination;
while (i >= 0) {
path[pathLength++] = j;
j = prev[i][j];
i--;
}

// Print the minimum cost path


printf("Minimum cost path: ");
for (i = pathLength - 1; i >= 0; i--) {
printf("%d ", path[i]);
}
printf("\nMinimum cost: %d\n", minCost);

return minCost;
}

int main() {
int graph[NUM_STAGES-1][NUM_NODES][NUM_NODES] = {
{
{0, 2, 3, 4},
{1, 0, 1, 3},
{2, 1, 0, 2},
{3, 2, 1, 0}
},
{
{0, 1, 2, 3},
{2, 0, 1, 2},
{3, 1, 0, 1},
{4, 2, 1, 0}
}
};

int source = 0;
int destination = 3;
findMinCost(graph, source, destination);

return 0;
}

Output:

Minimum cost path: 0 0 3


Minimum cost: 3
Program: (N – queens)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct {
int col;
char board[4][4];
int leftrow[4];
int upperDiagonal[7];
int lowerDiagonal[7];
int n;
} Solution;

void solve(int col, Solution *s, int n) {


if (col == n) {
printf("Arrangement %d:\n", s->col);
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
printf("%c ", s->board[i][j]);
}
printf("\n");
}
printf("\n");
return;
}
for (int row = 0; row < n; row++) {
if (s->leftrow[row] == 0 && s->lowerDiagonal[row + col] == 0 && s->upperDiagonal[n
- 1 + col - row] == 0) {
s->board[row][col] = 'Q';
s->leftrow[row] = 1;
s->lowerDiagonal[row + col] = 1;
s->upperDiagonal[n - 1 + col - row] = 1;
solve(col + 1, s, n);
s->board[row][col] = '.';
s->leftrow[row] = 0;
s->lowerDiagonal[row + col] = 0;
s->upperDiagonal[n - 1 + col - row] = 0;
}
}
}

void solveNQueens(int n) {
Solution s;
s.n = n;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
s.board[i][j] = '.';
}
}
for (int i = 0; i < n; i++) {
s.leftrow[i] = 0;
}
for (int i = 0; i < 2 * n - 1; i++) {
s.upperDiagonal[i] = 0;
s.lowerDiagonal[i] = 0;
}
s.col = 0;
solve(0, &s, n);
}
int main() {
int n = 4; // we are taking 4*4 grid and 4 queens
solveNQueens(n);
return 0;
}

Output:
Arrangement 0:
..Q.
Q...
...Q
.Q..

Arrangement 0:
.Q..
...Q
Q...
..Q.
Program: (Sum of Subsets)

#include <stdio.h>
#include <stdlib.h>
static int total_nodes;
void printValues(int A[], int size){
for (int i = 0; i < size; i++) {
printf("%*d", 5, A[i]);
}
printf("\n");
}
void subset_sum(int s[], int t[], int s_size, int t_size, int sum, int ite, int const target_sum){
total_nodes++;
if (target_sum == sum) {
printValues(t, t_size);
subset_sum(s, t, s_size, t_size - 1, sum - s[ite], ite + 1, target_sum);
return;
}
else {
for (int i = ite; i < s_size; i++) {
t[t_size] = s[i];
subset_sum(s, t, s_size, t_size + 1, sum + s[i], i + 1, target_sum);
}
}
}
void generateSubsets(int s[], int size, int target_sum){
int* tuplet_vector = (int*)malloc(size * sizeof(int));
subset_sum(s, tuplet_vector, size, 0, 0, 0, target_sum);
free(tuplet_vector);
}
int main(){
int set[] = { 5, 6, 12 , 54, 2 , 20 , 15 };
int size = sizeof(set) / sizeof(set[0]);
printf("The set is ");
printValues(set , size);
generateSubsets(set, size, 25);
printf("Total Nodes generated %d\n", total_nodes);
return 0;
}
Output:

The set is 5 6 12 54 2 20 15
5 6 12 2
5 20
Total Nodes generated 127
Graph Coloring Problem Program:

#include <stdio.h>
#include <stdbool.h>

#define V 4

// Function to check if the colored


// graph is safe or not
bool isSafe(int v, bool graph[V][V],
int color[], int c)
{
for (int i = 0; i < V; i++)
if (graph[v][i] && c == color[i])
return false;
return true;
}

// Function to recursively solve the


// m-coloring problem
bool graphColoringUtil(bool graph[V][V], int m,
int color[], int v)
{
if (v == V)
return true;

for (int c = 1; c <= m; c++)


{
if (isSafe(v, graph, color, c))
{
color[v] = c;
if (graphColoringUtil(graph, m, color, v + 1) == true)
return true;
color[v] = 0;
}
}

return false;
}
// Main function to solve the m-coloring problem
void graphColoring(bool graph[V][V], int m)
{
int color[V];
for (int i = 0; i < V; i++)
color[i] = 0;

if (graphColoringUtil(graph, m, color, 0) == false)


{
printf("Solution does not exist");
return;
}

printf("Solution exists. The coloring of vertices is:\n");


for (int i = 0; i < V; i++)
printf("Vertex %d -> Color %d\n", i, color[i]);
}

// Sample input
int main()
{
// Graph represented as adjacency matrix
bool graph[V][V] = {
{0, 1, 1, 1},
{1, 0, 1, 0},
{1, 1, 0, 1},
{1, 0, 1, 0}};

// Number of colors
int m = 3;

// Call the function to solve the m-coloring problem


graphColoring(graph, m);

return 0;
}
Output:

The coloring of vertices is:


Vertex 0 -> Color 1
Vertex 1 -> Color 2
Vertex 2 -> Color 3
Vertex 3 -> Color 2
Page Replacement Program : (FIFO)

#include <stdio.h>
#include <stdlib.h>

void fcfs(int frames, int pages[], int n) {


int pageFaults = 0;
int frame[frames];
int index = 0; // To keep track of the oldest frame

for (int i = 0; i < frames; i++) {


frame[i] = -1;
}

for (int i = 0; i < n; i++) {


int found = 0;

for (int j = 0; j < frames; j++) {


if (frame[j] == pages[i]) {
found = 1;
break;
}
}

if (!found) {
pageFaults++;
frame[index] = pages[i];
index = (index + 1) % frames; // Move to the next frame in a circular manner
}
}

printf("Page Faults in FCFS: %d\n", pageFaults);


}
int main() {
int frames = 3;
int pages[] = {1, 2, 3, 4, 1, 2, 5, 1, 2, 3, 4, 5};
int n = sizeof(pages) / sizeof(pages[0]);

fcfs(frames, pages, n);


return 0;
}

Output:

Page Faults in FCFS: 9


Program: (Optimal Policy)

#include<stdio.h>

void optimal(int frames, int pages[], int n) {


int pageFaults = 0;
int frame[frames];
for (int i = 0; i < frames; i++) {
frame[i] = -1;
}

for (int i = 0; i < n; i++) {


int found = 0;

for (int j = 0; j < frames; j++) {


if (frame[j] == pages[i]) {
found = 1;
break;
}
}

if (!found) {
pageFaults++;

// Find the frame to be replaced


int replaceIndex = -1;
int farthest = i + 1;

for (int j = 0; j < frames; j++) {


int k;
for (k = i + 1; k < n; k++) {
if (frame[j] == pages[k]) {
if (k > farthest) {
farthest = k;
replaceIndex = j;
}
break;
}
}
if (k == n) {
replaceIndex = j;
break;
}
}

if (replaceIndex == -1) {
for (int j = 0; j < frames; j++) {
if (frame[j] == -1) {
replaceIndex = j;
break;
}
}
}

frame[replaceIndex] = pages[i];
}
}

printf("Page Faults in Optimal: %d\n", pageFaults);


}

int main() {
int frames = 3;
int pages[] = {1, 2, 3, 4, 1, 2, 5, 1, 2, 3, 4, 5};
int n = sizeof(pages) / sizeof(pages[0]);

optimal(frames, pages, n);


return 0;
}

Output:

Page Faults in Optimal: 7


Program: (LRU)

#include<stdio.h>

void lru(int frames, int pages[], int n) {


int pageFaults = 0;
int frame[frames];
int time[frames];

// Initialize frames to -1 and time to 0


for (int i = 0; i < frames; i++) {
frame[i] = -1;
time[i] = 0;
}

for (int i = 0; i < n; i++) {


int found = 0;

// Check if the page is already in one of the frames


for (int j = 0; j < frames; j++) {
if (frame[j] == pages[i]) {
found = 1;
time[j] = i;
break;
}
}

if (!found) {
pageFaults++;

int lruIndex = 0;
int minTime = time[0];

for (int j = 1; j < frames; j++) {


if (time[j] < minTime) {
minTime = time[j];
lruIndex = j;
}
}
frame[lruIndex] = pages[i];
time[lruIndex] = i;
}
}

printf("Page Faults in LRU: %d\n", pageFaults);


}

int main() {
int frames = 3;
int pages[] = {1, 2, 3, 4, 1, 2, 5, 1, 2, 3, 4, 5};
int n = sizeof(pages) / sizeof(pages[0]);

lru(frames, pages, n);


return 0;
}

Output:

Page Faults in LRU: 10


Producer Consumer Program:

#include <pthread.h>
#include <semaphore.h>
#include <stdio.h>
#include <stdlib.h>

#define BUFFER_SIZE 5

sem_t empty;
sem_t full;
pthread_mutex_t mutex;

int buffer[BUFFER_SIZE];
int in = 0;
int out = 0;

void *producer(void *arg) {


int item;
for (int i = 0; i < 10; i++) {
item = rand() % 100; // Produce a random item
sem_wait(&empty);
pthread_mutex_lock(&mutex);

buffer[in] = item;
in = (in + 1) % BUFFER_SIZE;
printf("Produced: %d\n", item);

pthread_mutex_unlock(&mutex);
sem_post(&full);
}
return NULL;
}

void *consumer(void *arg) {


int item;
for (int i = 0; i < 10; i++) {
sem_wait(&full);
pthread_mutex_lock(&mutex);
item = buffer[out];
out = (out + 1) % BUFFER_SIZE;
printf("Consumed: %d\n", item);

pthread_mutex_unlock(&mutex);
sem_post(&empty);
}
return NULL;
}

int main() {
pthread_t prod, cons;
sem_init(&empty, 0, BUFFER_SIZE);
sem_init(&full, 0, 0);
pthread_mutex_init(&mutex, NULL);

pthread_create(&prod, NULL, producer, NULL);


pthread_create(&cons, NULL, consumer, NULL);

pthread_join(prod, NULL);
pthread_join(cons, NULL);

sem_destroy(&empty);
sem_destroy(&full);
pthread_mutex_destroy(&mutex);

return 0;
}
Output:

Produced: 45
Consumed: 45
Produced: 66
Consumed: 66
Produced: 74
Consumed: 74
Produced: 51
Consumed: 51
Produced: 42
Consumed: 42
Produced: 33
Consumed: 33
Produced: 28
Consumed: 28
Produced: 39
Consumed: 39
Produced: 82
Consumed: 82
Produced: 12
Consumed: 12
Reader Writer Program:

#include <pthread.h>
#include <semaphore.h>
#include <stdio.h>
#include <stdlib.h>

sem_t rw_mutex;
pthread_mutex_t mutex;
int read_count = 0;

void *reader(void *arg) {


int num = *(int *)arg;
pthread_mutex_lock(&mutex);
read_count++;
if (read_count == 1)
sem_wait(&rw_mutex);
pthread_mutex_unlock(&mutex);

printf("Reader %d is reading\n", num);

pthread_mutex_lock(&mutex);
read_count--;
if (read_count == 0)
sem_post(&rw_mutex);
pthread_mutex_unlock(&mutex);
return NULL;
}

void *writer(void *arg) {


int num = *(int *)arg;
sem_wait(&rw_mutex);
printf("Writer %d is writing\n", num);
sem_post(&rw_mutex);
return NULL;
}

int main() {
pthread_t r[5], w[5];
int ids[5] = {1, 2, 3, 4, 5};
sem_init(&rw_mutex, 0, 1);
pthread_mutex_init(&mutex, NULL);

for (int i = 0; i < 5; i++) {


pthread_create(&r[i], NULL, reader, &ids[i]);
pthread_create(&w[i], NULL, writer, &ids[i]);
}

for (int i = 0; i < 5; i++) {


pthread_join(r[i], NULL);
pthread_join(w[i], NULL);
}

sem_destroy(&rw_mutex);
pthread_mutex_destroy(&mutex);
return 0;
}

Output:

Reader 1 is reading
Reader 2 is reading
Reader 3 is reading
Reader 4 is reading
Reader 5 is reading
Writer 1 is writing
Writer 2 is writing
Writer 3 is writing
Writer 4 is writing
Writer 5 is writing
Dining Philosopher Program:

#include <pthread.h>
#include <semaphore.h>
#include <stdio.h>
#include <stdlib.h>

#define NUM_PHILOSOPHERS 5

sem_t forks[NUM_PHILOSOPHERS];

void *philosopher(void *arg) {


int id = *(int *)arg;
int left = id;
int right = (id + 1) % NUM_PHILOSOPHERS;

for (int i = 0; i < 3; i++) {


printf("Philosopher %d is thinking\n", id);

sem_wait(&forks[left]);
sem_wait(&forks[right]);

printf("Philosopher %d is eating\n", id);

sem_post(&forks[right]);
sem_post(&forks[left]);
}
return NULL;
}

int main() {
pthread_t philosophers[NUM_PHILOSOPHERS];
int ids[NUM_PHILOSOPHERS];

for (int i = 0; i < NUM_PHILOSOPHERS; i++) {


sem_init(&forks[i], 0, 1);
ids[i] = i;
}

for (int i = 0; i < NUM_PHILOSOPHERS; i++) {


pthread_create(&philosophers[i], NULL, philosopher, &ids[i]);
}

for (int i = 0; i < NUM_PHILOSOPHERS; i++) {


pthread_join(philosophers[i], NULL);
}

for (int i = 0; i < NUM_PHILOSOPHERS; i++) {


sem_destroy(&forks[i]);
}

return 0;
}
Output:

Philosopher 0 is thinking
Philosopher 1 is thinking
Philosopher 2 is thinking
Philosopher 3 is thinking
Philosopher 4 is thinking
Philosopher 0 is eating
Philosopher 1 is eating
Philosopher 2 is eating
Philosopher 3 is eating
Philosopher 4 is eating
Philosopher 0 is thinking
Philosopher 1 is thinking
Philosopher 2 is thinking
Philosopher 3 is thinking
Philosopher 4 is thinking
Philosopher 0 is eating
Philosopher 1 is eating
Philosopher 2 is eating
Philosopher 3 is eating
Philosopher 4 is eating
Philosopher 0 is thinking
Philosopher 1 is thinking
Philosopher 2 is thinking
Philosopher 3 is thinking
Philosopher 4 is thinking
Philosopher 0 is eating
Philosopher 1 is eating
Philosopher 2 is eating
Philosopher 3 is eating
Philosopher 4 is eating
Disk Scheduling FCFS Program:

#include <stdio.h>
#include <stdlib.h>

void FCFS(int requests[], int n, int head) {


int seek_count = 0;
int distance, cur_track;
printf("Seek Sequence is:\n");
for (int i = 0; i < n; i++) {
cur_track = requests[i];
distance = abs(cur_track - head);
printf("Dis: %d\n", distance);
seek_count += distance;
head = cur_track;
printf("%d ", cur_track);
}
printf("\nTotal number of seek operations = %d\n", seek_count);
}

int main() {
int requests[] = { 72, 160 , 33, 130, 14, 6, 180};
int n = sizeof(requests) / sizeof(requests[0]);
int head = 50;
FCFS(requests, n, head);
return 0;
}

Output:
Seek Sequence is:
72 160 33 130 14 6 180
Total number of seek operations = 632
Shortest Seek Time First Program:

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include<limits.h>

int findClosest(int requests[], int n, int head, bool processed[]) {


int min_distance = INT_MAX;
int index = -1;

for (int i = 0; i < n; i++) {


if (!processed[i]) {
int distance = abs(requests[i] - head);
if (distance < min_distance) {
min_distance = distance;
index = i;
}
}
}
return index;
}

void SSTF(int requests[], int n, int head) {


int seek_count = 0;
int distance, cur_track;
bool processed[n];

for (int i = 0; i < n; i++) {


processed[i] = false;
}

printf("Seek Sequence is:\n");

for (int i = 0; i < n; i++) {


int index = findClosest(requests, n, head, processed);
processed[index] = true;
cur_track = requests[index];
distance = abs(cur_track - head);
seek_count += distance;
head = cur_track;
printf("%d ", cur_track);
}

printf("\nTotal number of seek operations = %d\n", seek_count);


}

int main() {
int requests[] = { 72, 160 , 33, 130, 14, 6, 180};
int n = sizeof(requests) / sizeof(requests[0]);
int head = 50;

SSTF(requests, n, head);

return 0;
}

Output:

Seek Sequence is:


33 14 6 72 130 160 180
Total number of seek operations = 218
Scan Program:

#include <stdio.h>
#include <stdlib.h>

void SCAN(int requests[], int n, int head, int direction, int disk_size) {
int seek_count = 0;
int distance, cur_track;
int size = n + 2;
int seek_sequence[size];
int index = 0;

if (direction == 1) { // move towards the larger end first


seek_sequence[index++] = disk_size - 1;
} else { // move towards the smaller end first
seek_sequence[index++] = 0;
}

for (int i = 0; i < n - 1; i++) {


for (int j = 0; j < n - i - 1; j++) {
if (requests[j] > requests[j + 1]) {
int temp = requests[j];
requests[j] = requests[j + 1];
requests[j + 1] = temp;
}
}
}

for (int i = 0; i < n; i++) {


if ((direction == 1 && requests[i] >= head) || (direction == 0 && requests[i] <= head)) {
seek_sequence[index++] = requests[i];
}
}

seek_sequence[index++] = head;

if (direction == 1) {
for (int i = 0; i < n; i++) {
if (requests[i] < head) {
seek_sequence[index++] = requests[i];
}
}
} else {
for (int i = n - 1; i >= 0; i--) {
if (requests[i] > head) {
seek_sequence[index++] = requests[i];
}
}
}

if (direction == 0) { // add the other end if necessary


seek_sequence[index++] = disk_size - 1;
} else {
seek_sequence[index++] = 0;
}

printf("Seek Sequence is:\n");


for (int i = 0; i < index; i++) {
cur_track = seek_sequence[i];
distance = abs(cur_track - head);
seek_count += distance;
head = cur_track;
printf("%d ", cur_track);
}

printf("\nTotal number of seek operations = %d\n", seek_count);


}

int main() {
int requests[] = { 72, 160 , 33, 130, 14, 6, 180};
int n = sizeof(requests) / sizeof(requests[0]);
int head = 50;
int disk_size = 200;
int direction = 1; // 1 for high, 0 for low

SCAN(requests, n, head, direction, disk_size);

return 0;
}
Output:

Seek Sequence is:


199 72 130 160 180 50 6 14 33 0
Total number of seek operations = 618

You might also like