ex7-1.c
/* code: ex7-1.c   (v1.20.00) */
#include <stdio.h>
#include <stdlib.h>
#define ARRAY_SIZE 13
/* ------------------------------------------- */
int linear_search (int array[], int n, int key)
{
  int i;
  for (i = 0; i < n; i++) {
    if (array[i] == key) {
      return i;
    }
  }
  return -1;
}
/* ------------------------------------------- */
void print_array (int array[], int n)
{
  int i;
  for (i = 0; i < n; i++) {
    printf ("%d ", array[i]);
  }
  printf ("\n");
}
/* ------------------------------------------- */
int main ()
{
  int index, key;
  int array[ARRAY_SIZE] = {
    900, 990, 210, 50, 80, 150, 330,
    470, 510, 530, 800, 250, 280
  };
  key = 800;
  print_array (array, ARRAY_SIZE);
  index = linear_search (array, ARRAY_SIZE, key);
  if (index != -1) {
    printf ("Found: %d (Index:%d)\n", key, index);
  }
  else {
    printf ("Not found: %d\n", key);
  }
  return 0;
}
ex7-2.c
/* code: ex7-2.c   (v1.20.00) */
#include <stdio.h>
#include <stdlib.h>
#define ARRAY_SIZE 13
/* ------------------------------------------- */
int binary_search (int array[], int num, int key)
{
  int middle, low, high;
  low = 0;
  high = num - 1;
  while (low <= high) {
    middle = (low + high) / 2;
    if (key == array[middle]) {
      return middle;
    }
    else if (key < array[middle]) {
      high = middle - 1;
    }
    else {
      low = middle + 1;
    }
  }
  return -1;
}
/* ------------------------------------------- */
void print_array (int array[], int n)
{
  int i;
  for (i = 0; i < n; i++) {
    printf ("%d ", array[i]);
  }
  printf ("\n");
}
/* ------------------------------------------- */
int main ()
{
  int index, key;
  int array[ARRAY_SIZE] = {
    50, 80, 150, 210, 250, 280, 330,
    470, 510, 530, 800, 900, 990
  };
  key = 800;
  print_array (array, ARRAY_SIZE);
  index = binary_search (array, ARRAY_SIZE, key);
  if (index != -1) {
    printf ("Found: %d (Index:%d)\n", key, index);
  }
  else {
    printf ("Not found: %d\n", key);
  }
  return 0;
}
q7-1.c
/* code: q7-1.c   (v1.25.00) */  
#include <stdio.h>
#include <stdlib.h>
#include <search.h>
  
#define ARRAY_SIZE 5
#define EXTRA_ROOM 1  
  
/* ------------------------------------------- */ 
int compare (const void *x, const void *y)
{
  
int a = *(const int *) x;
  
int b = *(const int *) y;
  
return (a > b) - (a < b);
}
 
/* ------------------------------------------- */ 
void print_array (int arr[], size_t n)
{
  
for (size_t i = 0; i < n; i++) {
    
printf ("%d ", arr[i]);
  
} 
printf ("\n");
} 
 
/* ------------------------------------------- */ 
int main ()
{
  
int key = 25;
  
size_t elements = ARRAY_SIZE;
  
int array[ARRAY_SIZE + EXTRA_ROOM] = { 10, 20, 30, 40, 50 };
  
 
printf ("Initial array: ");
  
print_array (array, elements);
  
 
int *found = lsearch (&key, array, &elements, sizeof (int), compare);
  
 
if (!found) {
    
printf ("Search error\n");
    
return EXIT_FAILURE;
  
}
  
 
printf ("\nResult:\n");
  
if (elements == ARRAY_SIZE) {
    
printf ("Key %d was already in the array.\n", key);
  
}
  else {
    
printf ("Key %d was added to the array.\n", key);
  
}
  
 
print_array (array, elements);
  
return EXIT_SUCCESS;
}
q7-2.c
/* code: q7-2.c   (v1.25.00) */
#include <stdio.h>
#include <stdlib.h>
#include <search.h>
#define ARRAY_SIZE 10
/* ------------------------------------------- */
int compare (const void *a, const void *b)
{
  int x = *(int *) a;
  int y = *(int *) b;
  if (x < y)
    return -1;
  if (x > y)
    return 1;
  return 0;
}
/* ------------------------------------------- */
void print_array (int array[], int n)
{
  int i;
  for (i = 0; i < n; i++) {
    printf ("%d ", array[i]);
  }
  printf ("\n");
}
/* ------------------------------------------- */
int main ()
{
  int key;
  int *r;
  int array[ARRAY_SIZE] = {
    10, 12, 16, 19, 28, 30, 38, 44, 70, 98
  };				/* ordered array! */
  key = 16;
  print_array (array, ARRAY_SIZE);
  r = (int *) bsearch (&key, array, ARRAY_SIZE, sizeof (int), compare);
  if (r != NULL) {
    printf ("Found: %d\n", *r);
  }
  else {
    printf ("Not found: %d\n", key);
  }
  return 0;
}
q7-3.c
/* code: q7-3.c   (v1.25.00) */
#include <stdio.h>
#include <stdlib.h>
#define MAX 1000000
/* ------------------------------------------- */
void array_print (int a[], int max)
{
  int i;
  for (i = 0; i < max; i++) {
    printf ("%02d ", a[i]);
  }
  printf ("\n");
}
/* ------------------------------------------- */
int array_find_empty (int a[], int max)
{
  int i;
  for (i = 0; i < max; i++) {
    if (a[i] == -1) {
      return i;
    }
  }
  return -1;
}
/* ------------------------------------------- */
void array_insert (int a[], int max, int index, int empty, int data)
{
  int i;
  if (empty > index) {
    for (i = empty; i > index; i--) {
      a[i] = a[i - 1];
    }
  }
  else {
    for (i = empty; i < index; i++) {
      a[i] = a[i + 1];
    }
  }
  a[index] = data;
}
/* ------------------------------------------- */
int array_delete (int a[], int index)
{
  int data;
  data = a[index];
  a[index] = -1;
  return data;
}
/* ------------------------------------------- */
int main ()
{
  int i, j, index_ins, index_del, empty, data;
  int *a;
  a = (int *) malloc (sizeof (int) * MAX);
  if (a == NULL) {
    printf ("Error! memory not allocated.");
    exit (EXIT_FAILURE);
  }
  for (j = 0; j < MAX; j++) {
    a[j] = rand () % 100;
  }
  data = a[MAX / 2];
  a[MAX / 2] = -1;
  for (i = 0; i < 1000; i++) {
    index_ins = rand () % MAX;
    index_del = rand () % MAX;
    /* printf("ins:%d  del:%d\n", index_ins, index_del );  */
    empty = array_find_empty (a, MAX);
    /* printf("empty:%d\n", empty ); */
    array_insert (a, MAX, index_ins, empty, data);
    data = array_delete (a, index_del);
    /* array_print( a, MAX ); */
  }
  free (a);
  return 0;
}
/* ------------------------------------------- */
/* 
 $ gcc -pg -Wall q7-3.c -o q7-3
 $ ./q7-3
 $ gprof q7-3 gmon.out > gmon.log
 $ more gmon.log
 */
/* ------------------------------------------- */
EOF