¡Buenas!
Aquí te dejo otro código. Trabaja las combinaciones sobre un vector de enteros, ya que es lo único que te hace falta. Hacer combinaciones sobre un vector de cualquier cosa es hacer combinaciones sobre los indices del vector...
Había visto un error que no existia...
¡Saludos!
Aquí te dejo otro código. Trabaja las combinaciones sobre un vector de enteros, ya que es lo único que te hace falta. Hacer combinaciones sobre un vector de cualquier cosa es hacer combinaciones sobre los indices del vector...
Código (c) [Seleccionar]
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct t_combinatoria
{
unsigned long **lista;
unsigned long n_elementos;
unsigned long longitud_elemento;
};
typedef struct t_combinatoria t_combinatoria;
void inicializar_combinatoria(t_combinatoria *c)
{
c->lista = NULL;
c->n_elementos = 0;
c->longitud_elemento = 0;
}
void finalizar_combinatoria(t_combinatoria *c)
{
unsigned long i;
for(i = 0 ; i < c->n_elementos ; i++)
free(c->lista[i]);
free(c->lista);
c->lista = NULL;
c->n_elementos = 0;
c->longitud_elemento = 0;
}
unsigned long factorial(unsigned long n)
{
unsigned long ret = 1;
while(n)
ret *= (n--);
return ret;
}
unsigned long n_sobre_k(unsigned long n, unsigned long k)
{
return (factorial(n) / factorial(k)) / factorial(n - k);
}
int combinaciones(t_combinatoria *datos,unsigned long elementos_conjunto, unsigned long elementos_combinacion)
{
static unsigned long indice = 0;
static unsigned long elementos_fijados = 0;
static unsigned long *aux = NULL;
unsigned long i;
if(!elementos_combinacion)
return 0;
if(indice == elementos_combinacion)
{
memcpy(*(datos->lista + elementos_fijados), aux, elementos_combinacion * sizeof(unsigned long));
elementos_fijados++;
return 1;
}
/* si es la primera vez que llamamos a la funcion, reservamos memoria para la tabla de combinaciones */
if(!indice)
{
if(!(aux = (unsigned long *) malloc(elementos_combinacion * sizeof(unsigned long))))
return 0;
datos->n_elementos = n_sobre_k(elementos_conjunto,elementos_combinacion);
datos->longitud_elemento = elementos_combinacion;
if(!(datos->lista = (unsigned long **) malloc(datos->n_elementos * sizeof(unsigned long *))))
{
datos->n_elementos = 0;
datos->longitud_elemento = 0;
return 0;
}
for(i = 0 ; i < datos->n_elementos ; i++)
{
if(!(datos->lista[i] = (unsigned long *) malloc(datos->longitud_elemento * sizeof(unsigned long))))
{
int j;
for(j = 0 ; j < i ; j++)
free(datos->lista[i]);
free(datos->lista);
datos->lista = NULL;
datos->n_elementos = 0;
datos->longitud_elemento = 0;
return 0;
}
}
for(i = 0 ; i < elementos_conjunto - elementos_combinacion + indice + 1; i++)
{
aux[indice] = i;
indice++;
combinaciones(datos, elementos_conjunto, elementos_combinacion);
indice--;
}
free(aux);
aux = NULL;
elementos_fijados = 0;
indice = 0;
}
else
{
for(i = aux[indice - 1] + 1 ; i < elementos_conjunto - elementos_combinacion + indice + 1; i++)
{
aux[indice] = i;
indice++;
combinaciones(datos, elementos_conjunto, elementos_combinacion);
indice--;
}
}
return 1;
}
int main(int argc, char *argv[])
{
unsigned long i,j,k;
t_combinatoria comb;
char *vocales = "aeiou";
for(i = 1 ; i <= 5 ; i++)
{
inicializar_combinatoria(&comb);
combinaciones(&comb, 5 , i);
for(j = 0 ; j < comb.n_elementos ; j++)
{
for(k = 0 ; k < comb.longitud_elemento ; k++)
printf("%c",vocales[comb.lista[j][k]]);
printf("\n");
}
finalizar_combinatoria(&comb);
}
return 0;
}
Había visto un error que no existia...

¡Saludos!