[ Foro de C ]
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;
}
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.
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.
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.)