violacion de segmento y fallos de segmentacion

Imagen de SeVi25
0 puntos

Buenos días, resulta que este programa me da algunas veces problemas, otras no.
Me pide el tamaño de un vector, el cual le doy por ejemplo n=20, y luego una posición "k" dentro de ese vector a partir del cual me cogerá los elementos más próximos a esa "k", por ejemplo k=17, para ello me pide cuantos elementos próximos, con la variable "p", por ejemplo p=12.

Despues de eso, casi siempre, con "p" grande (entre 10-19), me da o fallo de segmentación o violación de segmento.

Sólo dejo las 3 funciones donde se puede encontrar el problema.

A ver si podeis ayudarme, muchas gracias.

#include 
#include 
#include 
#define MAX 50

void DelimitacionLimites (int k, int c[], int *li, int *ls, int p,int n);
void pract2(int v[],int ini, int fin, int k, int c[], int li, int ls, int p);
int pivoteAleatorio(int v[],int li,int ls);
int lleno(int v[],int fin);
void intercambia(int *p,int *q);
void imprimir(int c[],int p);
void crearvector(int v[], int n);
void Quicksort(int V[],int li,int ls);
//int comp(const void *, const void *);


int main(){
    int n,j,x,p;
   //int c[MAX];
   //int v[MAX];
   int *c;
   int *v;
   v = (int*) malloc (MAX);
   c = (int*) malloc (MAX);
    printf("ELIJA EL TAMAÑO DEL VECTOR QUE SEA COMO MAX 50 \n");
    scanf("%d",&n);

    printf("ELIJA CUANTOS VALORES CERCANOS QUIERE AL ELEMENTO K-ESIMO \n");
    scanf("%d",&p);  
 
    srand(time(NULL));
    for ( j=0; j para que los numeros aleatorios que llenen el vector estén entre 0 y 200
	printf("%d ",v[j]);
    }
printf("\n");
   
    for (x=0; x

n-1){ auxLi=auxLi-(auxLs-(n-1)); auxLs=n-1; } // fin if n4 *ls=auxLs; *li=auxLi; }// fin if n1 else{ printf ("No puede darse que el numero de elementos \n"); printf ("elegidos sea mayor o igual que el vector, \n"); printf ("ni que el \"k\" introducido sea igual que la \"N\". "); verdad = 0; main(); } // fin else } // fin DelimitacionLimites() void pract2(int v[],int ini, int fin, int k, int c[], int li, int ls, int p){ int i; printf("\nEntra en pract2 con \n [%d,%d] k %d y p %d \n",ini,fin,k,p); int piv=pivoteAleatorio(v,ini,fin); printf("\n el pivote entre [%d,%d] es: %d \n",ini,fin,piv); if(piv < li) { // recortamos la complejidad al encontrar el pivote fuera de los límites que hemos calculado. // printf("\n pivote < li"); pract2(v,piv+1,fin,k,c,li,ls,p); } else{ if(piv > ls) { // recortamos la complejidad al encontrar el pivote fuera de los límites que hemos calculado. // printf("\n pivote > ls"); pract2(v,ini,piv-1,k,c,li,ls,p); } else{ // else QUE ENCIERRA AL PIVOTE ENTRE EL "li" Y EL "ls" if(piv==k){ // NO forma parte de la solución final, así que llamamos nuevamente a la funcion pract2. // printf("\n pivote == k"); pract2(v,ini,fin,k,c,li,ls,p); } else{ // pivote encerrado entre "li" y "ls" if(piv == li ) { // tenemos que uno de las valores del vector solucion c[] será el "li", así que lo guardamos. // printf("\n pivote == li"); c[0]=v[piv]; imprimir(c,p); if(!lleno(c,p)){ // si después de encontrar ese elemento, vemos que el vector solución c[] aun no está completo, //llamamos de nuevo a la función pract2(), eso sí, moviendo el pivote una posicion a la derecha. pract2(v,piv+1,fin,k,c,li,ls,p); } } else{ // pivote encerrado entre "li" y "ls" if(piv == ls ){ // tenemos que uno de los valores del vector solucion c[] será el "ls", así que lo guardamos. // printf("\n pivote == ls"); c[p-1]=v[piv]; imprimir(c,p); if(!lleno(c,p)){ // si después de encontrar ese elemento, vemos que el vector solución c[] aun no está completo, //llamamos de nuevo a la función pract2(), eso sí, moviendo el pivote una posicion a la izquierda. pract2(v,ini,piv-1,k,c,li,ls,p); } } else{ // pivote encerrado entre "li" y "ls" if( piv < k ){ // el pivote es menor que "k" y se encuentra entre los límites, piv>li. // printf("\n pivote < k"); c[piv-li]=v[piv]; // guardamos el numero encontrado, ya que no es el "li" pero si es mayor que este y menor que "k". imprimir(c,p); if(!lleno(c,p)){ pract2(v,ini,fin,k,c,li,ls,p); } } else{ // pivote encerrado entre "li" y "ls" // printf("\n pivote > k"); c[piv-li-1]=v[piv]; imprimir(c,p); if(!lleno(c,p)){ pract2(v,ini,fin,k,c,li,ls,p); } //fin if } // fin else } // FIN else QUE ENCIERRA AL PIVOTE ENTRE EL "li" Y EL "ls" } } } } } // fin pract2()