Pequena aplicação de remoção/inserção

[Enunciado]  O programa abaixo administra uma coleção de números digitados pelo usuário. (A coleção pode conter mais de uma cópia de um mesmo número.) O usuário pode

A coleção é armazenada em ordem crescente. 

// Este programa administra uma coleção de números.
// Digite 
//           i 222
//
// para inserir 222 na coleção. Digite 
//
//           r 333
//
// para remover 333 da coleção. Digite qualquer
// caractere diferente de 'i' e 'r' para sair.

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
void insere (int k, int x, int n, int v[]);
void remove (int k, int n, int v[]);

#define MAX 100

int main (void)
{
   int v[MAX];
   int n = 0;
   while (true) { 
      // a coleção está em v[0..n-1], em ordem crescente
      char str[2], op;
      int k, x;
      printf ("\nOperação? ");
      scanf ("%s", str); 
      op = str[0];
      switch (op) {
         case 'i': if (n >= MAX) return EXIT_FAILURE;
                   scanf ("%d", &x);
                   for (k = 0; k < n && v[k] < x; ++k) ;
                   n = insere (k, x, n, v);
                   break;
         case 'r': if (n <= 0) return EXIT_FAILURE;
                   scanf ("%d", &x);
                   for (k = 0; k < n && v[k] < x; ++k) ;
                   if (k < n && v[k] == x) 
                      n = remove (k, n, v);
                   break;
         default:  return EXIT_SUCCESS;
      }   
      printf ("Temos: ");
      for (k = 0; k < n; ++k) 
         printf (" %d", v[k]);
      printf ("\n");
   }
}

O código de operação digitado pelo usuário é armazenado em str[0];  o vetor str tem um elemento adicional para acomodar o byte nulo que marca o fim da string.

O programa é interrompido se o espaço alocado a v estiver esgotado e o usuário tentar inserir mais um elemento. O programa também é interrompido se o usuário tentar remover um elemento de uma coleção vazia.