Menu Driver Program

To test out our functions, we can make a menu like this:


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

struct Array {
  int *A;
  int size;
  int length;
};

void Display(struct Array arr) {
  int i;
  printf("\nElements are\n");
  for (i = 0; i < arr.length; i++)
    printf("%d ", arr.A[i]);
  printf("\n");
}

void Append(struct Array *arr, int x) {
  if (arr->length < arr->size) {
    arr->A[arr->length++] = x;
  }
}

void Insert(struct Array *arr, int index, int x) {
  int i;
  if (index >= 0 && index <= arr->length) {
    for (i = arr->length; i > index; i--) {
      arr->A[i] = arr->A[i - 1];
    }
    arr->A[index] = x;
    arr->length++;
  }
}

int Delete(struct Array *arr, int index) {
  int x = 0;
  int i;

  if (index >= 0 && index < arr->length) {
    x = arr->A[index];
    for (i = index; i < arr->length - 1; i++) {
      arr->A[i] = arr->A[i + 1];
    }
    arr->length--;
    return x;
  }

  return 0;
}

void swap(int *x, int *y) {
  int temp;
  temp = *x;
  *x = *y;
  *y = temp;
}

int LinearSearch(struct Array *arr, int key) {
  int i;
  for (i = 0; i < arr->length; i++) {
    if (key == arr->A[i]) {
      swap(&arr->A[i], &arr->A[0]);
      return i;
    }
  }

  return -1;
}

int BinarySearch(struct Array arr, int key) {
  int l, mid, h;
  l = 0;
  h = arr.length - 1;

  while (l <= h) {
    mid = (l + h) / 2;

    if (key == arr.A[mid])
      return mid;
    else if (key < arr.A[mid])
      h = mid - 1;
    else
      l = mid + 1;
  }

  return -1;
}

int RBinSearch(int a[], int l, int h, int key) {
  int mid;

  if (l <= h) {
    mid = (l + h) / 2;
    if (key == a[mid])
      return mid;
    else if (key < a[mid])
      return RBinSearch(a, l, mid - 1, key);
    else
      return RBinSearch(a, mid + 1, h, key);
  }

  return -1;
}

int Get(struct Array arr, int index) {
  if (index >= 0 && index < arr.length) {
    return arr.A[index];
  }

  return -1;
}

void Set(struct Array *arr, int index, int x) {
  if (index >= 0 && index < arr->length) {
    arr->A[index] = x;
  }
}

int Max(struct Array arr) {
  int max = arr.A[0];
  int i;

  for (i = 1; i < arr.length; i++) {
    if (arr.A[i] > max)
      max = arr.A[i];
  }

  return max;
}

int Min(struct Array arr) {
  int min = arr.A[0];
  int i;

  for (i = 1; i < arr.length; i++) {
    if (arr.A[i] < min)
      min = arr.A[i];
  }

  return min;
}

int Sum(struct Array arr) {
  int total = 0;
  int i;

  for (i = 0; i < arr.length; i++) {
    total += arr.A[i];
  }

  return total;
}

float Avg(struct Array arr) { return (float)Sum(arr) / arr.length; }

void Reverse(struct Array *arr) {
  int i, j;
  for (i = 0, j = arr->length - 1; i < j; i++, j--) {
    int temp;
    temp = arr->A[i];
    arr->A[i] = arr->A[j];
    arr->A[j] = temp;
  }
}

void Lshift(struct Array *arr) {
  int i;
  int first = arr->A[0];

  for (i = 0; i < arr->length - 1; i++) {
    arr->A[i] = arr->A[i + 1];
  }

  arr->A[arr->length - 1] = first;
}

void Rshift(struct Array *arr) {
  int i;
  int last = arr->A[arr->length - 1];

  for (i = arr->length - 1; i > 0; i--) {
    arr->A[i] = arr->A[i - 1];
  }

  arr->A[0] = last;
}

void InsertSort(struct Array *arr, int x) {
  if (arr->length == arr->size) {
    return;
  }

  int i = arr->length - 1;

  while (i >= 0 && arr->A[i] > x) {
    arr->A[i + 1] = arr->A[i];
    i--;
  }

  arr->A[i + 1] = x;
  arr->length++;
}

int isSorted(struct Array arr) {
  int i;

  for (i = 0; i < arr.length - 1; i++) {
    if (arr.A[i] > arr.A[i + 1])
      return 0;
  }

  return 1;
}

void Rearrange(struct Array *arr) {
  int i, j;
  i = 0;
  j = arr->length - 1;

  while (i < j) {
    while (arr->A[i] < 0) {
      i++;
    }

    while (arr->A[j] >= 0) {
      j--;
    }

    if (i < j) {
      swap(&arr->A[i], &arr->A[j]);
    }
  }
}

struct Array *Merge(struct Array *arr1, struct Array *arr2) {
  int i, j, k;
  i = j = k = 0;

  struct Array *arr3 = (struct Array *)malloc(sizeof(struct Array));

  while (i < arr1->length && j < arr2->length) {
    if (arr1->A[i] < arr2->A[j])
      arr3->A[k++] = arr1->A[i++];
    else
      arr3->A[k++] = arr2->A[j++];
  }

  for (; i < arr1->length; i++)
    arr3->A[k++] = arr1->A[i];

  for (; j < arr2->length; j++)
    arr3->A[k++] = arr2->A[j];

  arr3->length = arr1->length + arr2->length;
  arr3->size = 10;

  return arr3;
}

struct Array *Union(struct Array *arr1, struct Array *arr2) {
  int i, j, k;
  i = j = k = 0;

  struct Array *arr3 = (struct Array *)malloc(sizeof(struct Array));

  while (i < arr1->length && j < arr2->length) {
    if (arr1->A[i] < arr2->A[j])
      arr3->A[k++] = arr1->A[i++];
    else if (arr2->A[j] < arr1->A[i])
      arr3->A[k++] = arr2->A[j++];
    else {
      arr3->A[k++] = arr1->A[i++];
      j++;
    }
  }

  for (; i < arr1->length; i++)
    arr3->A[k++] = arr1->A[i];

  for (; j < arr2->length; j++)
    arr3->A[k++] = arr2->A[j];

  arr3->length = k;
  arr3->size = 10;

  return arr3;
}

struct Array *Intersection(struct Array *arr1, struct Array *arr2) {
  int i, j, k;
  i = j = k = 0;

  struct Array *arr3 = (struct Array *)malloc(sizeof(struct Array));

  while (i < arr1->length && j < arr2->length) {
    if (arr1->A[i] < arr2->A[j])
      i++;
    else if (arr2->A[j] < arr1->A[i])
      j++;
    else if (arr1->A[i] == arr2->A[j]) {
      arr3->A[k++] = arr1->A[i++];
      j++;
    }
  }

  arr3->length = k;
  arr3->size = 10;

  return arr3;
}

struct Array *Difference(struct Array *arr1, struct Array *arr2) {
  int i, j, k;
  i = j = k = 0;

  struct Array *arr3 = (struct Array *)malloc(sizeof(struct Array));

  while (i < arr1->length && j < arr2->length) {
    if (arr1->A[i] < arr2->A[j])
      arr3->A[k++] = arr1->A[i++];
    else if (arr2->A[j] < arr1->A[i])
      j++;
    else {
      i++;
      j++;
    }
  }

  for (; i < arr1->length; i++)
    arr3->A[k++] = arr1->A[i];

  arr3->length = k;
  arr3->size = 10;

  return arr3;
}

int main() {
  struct Array arr1;
  int ch;
  int x, index;

  printf("Enter Size of Array");
  scanf("%d", &arr1.size);
  arr1.A = (int *)malloc(arr1.size * sizeof(int));
  arr1.length = 0;

  do {
    printf("Menu\n");
    printf("1. Insert\n");
    printf("2. Delete\n");
    printf("3. Search\n");
    printf("4. Sum\n");
    printf("5. Display\n");
    printf("6. Exit\n");

    printf("enter your choice ");
    scanf("%d", &ch);

    switch (ch) {
    case 1:
      printf("Enter an element and index");
      scanf("%d%d", &x, &index);
      Insert(&arr1, index, x);
      break;

    case 2:
      printf("Enter index ");
      scanf("%d", &index);
      x = Delete(&arr1, index);
      printf("Deleted element is %d\n", x);
      break;

    case 3:
      printf("Enter element to search");
      scanf("%d", &x);
      index = LinearSearch(&arr1, x);
      printf("Element index %d", index);
      break;

    case 4:
      printf("Sum is %d\n", Sum(arr1));
      break;

    case 5:
      Display(arr1);
      break;
    }
  } while (ch < 6);

  return 0;
}