anch'io cerco di postarti una soluzione applicabile con piccole matrici (usa le strutture non so se le hai studiate):

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

#define Y 3
#define X 4

struct contatore
{
int valore;
int presenze;
};

int main()
{
  int matrice[Y][X]={3, 6, 2, 6, 5, 2, 2, 4, 7, 3, 5, 1};
  struct contatore[Y*X];
  int limite=0, migliore=0, i, j, k;

  /*Qui puoi mettere una funzione che visualizzi la matrice*/

  for(i=0; i<Y; i++)
  {
    for(j=0; j<X; j++)
    {
      for(k=0; k<=limite; k++)
      {
        if(k==limite)
        {
          contatore[limite].valore=matrice[i][j];
          contatore[limite].presenze=1;
          limite++;
          break;
        }
        if(contatore[k].valore==matrice[i][j])
        {
          contatore[k].presenze++;
          break;
        }
      }
    }
  }
  /* Questa funzione ha uno svantaggio:
  nel caso di valori con le stesse presenze  se ne visualizza solo uno, ma la si può migliorare */
  for(i=0; i<limite; i++);
  {
    if(contatore[migliore].valore<contatore[i].valore)
    {
      migliore=i;
    }
  }
  printf("Il numero con il maggio numero di presenze e': %d\n", contatore[migliore].valore);
  system("PAUSE");
  return 0;
  }