[ Foro de C ]

Necesito ayuda con ERROR de Pilas en C

10-Apr-2016 08:40
Invitado (ml0x)
3 Respuestas

Hola tengo una duda, al imprimir mi pila se cae el programa y no entiendo por que ! me estoy frustrando, agradecería muchísimo su ayuda. de ante mano Muchas gracias!

Aquí les va mi código !!


Código:
#include <stdio.h>
#include <stdlib.h>

/* run this program using the console pauser or add your own getch, system("pause") or input loop */

//creacion de la estructura
typedef struct Pila {
    int *dato;
    struct Pila *sgte; 
}Pila;

//asignacion de memoria
Pila *asignarMemoria(){
 return (Pila *)malloc(sizeof(Pila));
}

//apilado
Pila *apilar(Pila *p, int dato){
 
 Pila *q = asignarMemoria(); //Pila auxiliar
 q->dato=dato;
 q->sgte=NULL;
 
 if(p==NULL){
  return q;
 }
 q->sgte = p;
 p = q;
 return p;
}

//desapilado
Pila *desapilar(Pila *p){
 
 if(p == NULL){
  return p;
 }
 Pila *q = p->sgte;
 p->sgte = NULL;
 free(p); //liberar memoria
 return q;
}

//listar la pila
void mostrarPila (Pila *p){
 
 if(p!=NULL){
  Pila *q = p; //pila auxiliar
  while(q!=NULL){
   printf("%d ", q->dato);
   q = desapilar(q);
   }
  return;
 }
 printf("No hay elementos en la Pila\n"); 
}
//buscar un elemento en la pila
int buscarPila(Pila *p, int dato){
 if(p!=NULL){
  Pila *q = p; //pila auxiliar
  while(q!=NULL){
   if(q->dato==dato){
    return 1; //verdadero si lo encuentra.
   }
   q = desapilar(q);
  }
  return 0; //falso, si no lo encuentra.
 }
 return 0; //falso, si no lo encuentra.
}

int main(int argc, char *argv[]) {
 
 //Menu Principal.
 int opcionMenu, volverIntentar, scanfValidador;
 srand(time(NULL));  //Semilla del creador de numeros Randoms
 
do{
 do{
  
 printf("Seleccione una opcion\n");
 printf("[1] Ejercicio 1\n[2] Ejercicio 2\n[3] Ejercicio 3\n[4] Salir\n");
 scanfValidador = scanf("%d", &opcionMenu);
 fflush(stdin);
  if(scanfValidador!=1){
   printf("\nOpcion no valida, ingrese un valor numererico positivo.\n");
   puts("");
  } 
 }while(scanfValidador!=1); //Validador
    
     if(opcionMenu == 1){ 
      // Crear y listar una pila con n elementos. Ingresar un dato y consultar cuantas veces se repite y en que posiciones.
   Pila *pila;
   int n, i; //tamaño n de la pila
   int numRand;
   int scanfValidador3;
   
   do{
        puts("Ingrese tamaño de la Pila la cual tendra numeros random del [0-10]");
        scanfValidador3 = scanf("%d", &n);
        fflush(stdin);
        if(scanfValidador3!=1){
         printf("\nOpcion no valida, ingrese un valor numererico positivo.\n");
         puts("");
   }
        }while(scanfValidador3!=1); //Validador
        i=n;
        
        while(n!=0){ //Recorrer Pila
         numRand = rand() % 11; // genera un numero Random entre el 0 y el 10
         //pila->sgte=NULL;
         pila = apilar(pila, numRand);
    n--;
   } 
   while(i!=0){
    mostrarPila(pila);
    i--;
   }  
  }
  
  else if(opcionMenu == 2){
   printf("Opcion 2\n");
  }
 
  else if(opcionMenu == 3){
   printf("Opcion 3\n");
  }
 
  else if(opcionMenu == 4){
   exit(0);
  }
  else{
   puts("");
   printf("Opcion invalida\n");
   puts("");
  }
  int scanfValidador2;
 do{
  printf("\nPara volver a intentar preciona [1] y da enter.\nPara salir use cualquier otro numero y precione enter.\n");
  puts("");
  scanfValidador2 = scanf("%d", &volverIntentar);
  fflush(stdin);
  if(scanfValidador2!=1){
   printf("\nOpcion no valida, ingrese un valor numererico positivo.\n");
   puts("");
  }
 }while(scanfValidador2!=1); //Validador
}while(volverIntentar==1);
 return 0;
}


 


10-Apr-2016 23:17
Nacho Cabanes (+83)

Crea una versión simplificada de tu fuente, en la que sólo aparezcan las funciones de manejo de la pila y un "main" que añade un dato, muestre la pila, añada otro, la vuelva a mostrar, desapile, vuelva a mostrar y así sucesivamente. Eso te ayuda a rastrear los problemas de forma más sencilla.


int main(int argc, char *argv[]) 
{
    Pila *pila;
    puts("Apilando 1");
    pila = apilar(pila, 1);
    mostrarPila(pila);
    
    puts("Apilando 2");
    pila = apilar(pila, 2);
    mostrarPila(pila);
    
    puts("Desapilando");
    pila = apilar(pila, 2);
    mostrarPila(pila);

    return 0;
}  


También puedes añadir otros "puts" o "printf" para rastrear por dónde avanza el programa, si no estás usando un entorno que te permita depurar paso a paso. En tu caso, ¿te obligan a usar a "desapilar" para "mostrar" o es elección tuya? Sería más simple y menos propenso a errores si el "mostrar" se limitara a recorrer la secuencia de datos, porque tu pila auxiliar "q" es sólo un "alias" de la pila principal, y los cambios que hagas en la una se reflejarán también en la otra.


13-Apr-2016 19:25
Invitado (9626)

UUURGEEE!! PORFA AYUDA Programa en C que capture 10 números enteros aleatorios mediante la función random en el rango de 20 al 50 en un arreglo unidimensional,  muéstrelos en pantalla para después aplicar el ordenamiento burbuja, muestre los datos en forma descendente.


16-Apr-2016 16:54
Nacho Cabanes (+83)

No esperes que alguien haga todo tu programa por ti, inténtalo y pregunta dudas mas concretas.

Ah, y crea un nuevo hilo si tu consulta no está relacionada con ésta.






(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)