OneCompiler

look

111

#include <stdio.h>
#include <stdlib.h>
#define DIRECTION_LEFT 0
#define DIRECTION_RIGHT 1
int abs(int x) {
return x >= 0 ? x : -x;
}
int compare(const void *a, const void *b) {
return *(int *) a - *(int *) b;
}
void print_request_order(int request_order, int n) {
/

  • Prints the order in which the disk requests are served.
    /
    int i;
    printf("Order of requests served: ");
    for (i = 0; i < n; i++) {
    printf("%d ", request_order[i]);
    }
    printf("\n");
    }
    void print_head_movements(int head_movements) {
    /
  • Prints the total number of head movements.
    */
    printf("Total number of head movements: %d\n", head_movements);
    }
    int main() {
    int n_blocks, head_pos, direction, n_requests, i, j, k, head_movements = 0, min_request,
    max_request, *requests, *request_order;
    printf("Enter the total number of disk blocks: ");
    scanf("%d", &n_blocks);
    printf("Enter the current head position: ");
    scanf("%d", &head_pos);
    printf("Enter the disk request string (separated by spaces): ");
    scanf("%d", &n_requests);
    requests = (int *) malloc(n_requests * sizeof(int));
    request_order = (int *) malloc(n_requests * sizeof(int));
    for (i = 0; i < n_requests; i++) {
    scanf("%d", &requests[i]);
    }
    printf("Enter the direction (0 for left, 1 for right): ");
    scanf("%d", &direction);
    qsort(requests, n_requests, sizeof(int), compare);
    for (i = 0; i < n_requests; i++) {
    if (requests[i] >= head_pos) {
    break;
    }
    }
    k = i;
    if (direction == DIRECTION_LEFT) {
    min_request = 0;
    max_request = k - 1;
    for (i = k - 1; i >= 0; i--) {
    request_order[max_request - i] = requests[i];
    }
    for (i = k; i < n_requests; i++) {
    request_order[i] = requests[i];
    }
    } else {
    min_request = k;
    max_request = n_requests - 1;
    for (i = k; i < n_requests; i++) {
    request_order[i - k] = requests[i];
    }
    for (i = k - 1; i >= 0; i--) {
    request_order[n_requests - 1 - i] = requests[i];
    }
    }
    for (i = 0; i < n_requests; i++) {
    head_movements += abs(request_order[i] - head_pos);
    head_pos = request_order[i];
    }
    print_request_order(request_order, n_requests);
    print_head_movements(head_movements);
    return 0;
    }