Bueno, eso que has puesto lo tenia en la funcion para crear el vector, lo que me faltaba era el "&". Aunque aun asi, en las otras funciones, no me va bien o.O y ademas, me da el mismo error que en la otra (la de abajo) xD
Pero he mirado de nuevo en la otra version (en la que cree un tipo de estructura para los contadores) y ahora va, pero solo si el vector es menor que 5, es decir, si tiene de 1 a 4 nodos. En caso de tener 5 o mas, solo me deja hacerlo 2 veces, a la que selecciono el 3º metodo para ordenar sale del programa (aunque sea todo el rato el mismo). Y si tiene un numero de 3 o mas cifras (mas de 100) peta directamente xD
Lo pongo:
__________________________________________________ _________
#include <time.h>
#include <stdlib.h>
#include <stdio.h>
#include <mem.h>
#include <string.h>
typedef int *p_int;
typedef struct c_i
{
int i;
int c;
}c_i;
char menu();
int *genera(int);
c_i seleccion(p_int v, int medida);
...
void mostrar(p_int v, long mida);
______________________________
int main()
{ int opcion,final=1,entrarA=0;
c_i c1,c2,c3,c4;
long largo;
p_int v,copia1,copia2,copia3,copia4;
printf("Si pulsas una tecla, aparecera el menu:\n ");
getche();
system("cls");
do {
opcion=menu();
switch(opcion)
{
case'a':{
printf("\nEscrive la longitud del vector.\n");
scanf("%ld",&largo);
v=genera(largo);
mostrar(v, largo);
entrarA=1;
}
break;
case'b': {if(entrarA==0)
{printf("\nNo hay un vector entrado.\n");
system("pause");
}
else
{copia1=malloc(sizeof(v));
memcpy(copia1,v,largo*sizeof(int));
c1=seleccion(copia1, largo);
printf("\nHas hecho %d intercambios i %d pasades.\n",c1.i,c1.c);
system("pause");
}
}
break;
...(aqui van el case'c', etc, del resto de las funciones, son iguales).
case'h': final=0;
}
}
while (final);
}
____________________________________
El menu no lo pongo porque lo use en otros programas y si funciona.
int *genera(int largo)
{
int i, *vector, *p;
vector=(int*)calloc(sizeof(int),largo);
p=vector;
srand(clock());
for(i=0;i<largo;i++,p++) *p=rand();
return vector;
}
c_i seleccion (p_int v, int medida)
{
int i, j, min,t,contador=0, intercambio=0;
c_i devuelve;
for ( i=0 ; i<medida-1; i++)
{ contador++;
min = i;
for ( j = i+1 ; j < medida ; j++)
{contador++;
if (v[j] < v[min])
{min = j;}
}
if (min != i)
{intercambio+=3;;
t=v[i];
v[i]=v[min];
v[min]=t;
}
}
devuelve.i=intercambio;
devuelve.c=contador;
return(devuelve);
}
...(aqui va el resto de funciones de ordenacion, son como la de seleccion mas o menos, asi que no las pongo)
void mostrar(p_int v, long medida)
{int i;
for (i=0;i<=medida;i++)
{printf("v[%d]=%d \t",i,v[i]);}
system("pause");
}
____________________________________
Espero que eso sea suficiente para que me podais ayudar. Las funciones de ordenacion, tienen todas la misma estructura (salvo el modo en que hacen los cambios, pero eso no es lo que da fallo) por eso solo pongo una a modo de ejemplo, porque no creo que el fallo sea de ahi, puesto que aunque en unas condiciones concretas (vectores pequeños) funcionan.
Gracias por las molestias y siento rayaros tanto ^^U |