elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Estamos en la red social de Mastodon


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Ayuda solucionar error en PILAS en C.
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Ayuda solucionar error en PILAS en C.  (Leído 5,270 veces)
ml0x

Desconectado Desconectado

Mensajes: 1


Ver Perfil
Ayuda solucionar error en PILAS en C.
« en: 10 Abril 2016, 08:13 am »

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;
}


En línea

class_OpenGL


Desconectado Desconectado

Mensajes: 437

Si usas Direct3D, no eres mi amigo :P


Ver Perfil
Re: Ayuda solucionar error en PILAS en C.
« Respuesta #1 en: 10 Abril 2016, 15:46 pm »

Un error que he visto es el siguiente:
Código
  1. void mostrarPila (Pila *p){
  2.    if(p!=NULL){
  3.        Pila *q = p; //pila auxiliar
  4.        while(q!=NULL){
  5.            printf("%d ", q->dato); // Aquí interpretas el dato de q como un puntero a entero
  6.            q = desapilar(q);
  7.        }
  8.        return;
  9.    }
  10.    printf("No hay elementos en la Pila\n");
  11. }

Código
  1. Pila *apilar(Pila *p, int dato){
  2.    Pila *q = asignarMemoria(); //Pila auxiliar
  3.    q->dato=dato; // Aquí interpretas el dato de q como un entero
  4.    q->sgte=NULL;
  5.  
  6.    if(p==NULL){
  7.        return q;
  8.    }
  9.    q->sgte = p;
  10.    p = q;
  11.    return p;
  12. }

Básicamente, estás interpretando de dos formas diferentes una variable. O bien interpretas la variable como un puntero, o bien como un entero. En este último caso, yo cambiaría de la estructura el tipo 'int*' a 'int'


En línea

Programador aficionado. Me quiero centrar en programar videojuegos. La API que uso para crearlos es OpenGL
class_OpenGL


Desconectado Desconectado

Mensajes: 437

Si usas Direct3D, no eres mi amigo :P


Ver Perfil
Re: Ayuda solucionar error en PILAS en C.
« Respuesta #2 en: 10 Abril 2016, 15:48 pm »

¿Por qué en la función apilar no retornas directamente q?
« Última modificación: 10 Abril 2016, 15:50 pm por class_OpenGL » En línea

Programador aficionado. Me quiero centrar en programar videojuegos. La API que uso para crearlos es OpenGL
lfgmespino

Desconectado Desconectado

Mensajes: 12


Ver Perfil
Re: Ayuda solucionar error en PILAS en C.
« Respuesta #3 en: 10 Abril 2016, 17:49 pm »

Tiene muchas cosas mal o por lo menos, rarillas.
Te he corregido el mínimo necesario para que funcione.
Código
  1.  
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <time.h>
  5.  
  6.  
  7. /* run this program using the console pauser or add your own getch, system("pause") or input loop */
  8.  
  9. //creacion de la estructura
  10. typedef struct Pila {
  11.    int dato;
  12.    struct Pila *sgte;
  13. } Pila;
  14.  
  15. //asignacion de memoria
  16. Pila *asignarMemoria(){
  17. return (Pila *)malloc(sizeof(Pila));
  18. }
  19.  
  20. //apilado
  21. Pila *apilar(Pila *p, int dato){
  22.  
  23. Pila *q = asignarMemoria(); //Pila auxiliar
  24. q->dato=dato;
  25. q->sgte=NULL;
  26.  
  27. if(p==NULL){
  28.  return q;
  29. }
  30. q->sgte = p;
  31. p = q;
  32. return p;
  33. }
  34.  
  35. //desapilado
  36. Pila *desapilar(Pila *p){
  37.  
  38. if(p == NULL){
  39.  return p;
  40. }
  41. Pila *q = p->sgte;
  42. p->sgte = NULL;
  43. // free(p); //liberar memoria
  44. return q;
  45. }
  46.  
  47. //listar la pila
  48. void mostrarPila (Pila *p){
  49. while(p) {
  50. printf("%d, ", p->dato);
  51. p = p->sgte;
  52. }
  53. }
  54.  
  55. /*
  56.  if(p!=NULL){
  57.   Pila *q = p; //pila auxiliar
  58.   while(q!=NULL){
  59.    printf("%d ", q->dato);
  60.    q = desapilar(q);
  61.    }
  62.   return;
  63.  }
  64.  printf("No hay elementos en la Pila\n");
  65. }
  66. */
  67.  
  68. //buscar un elemento en la pila
  69. int buscarPila(Pila *p, int dato){
  70. if(p!=NULL){
  71.  Pila *q = p; //pila auxiliar
  72.  while(q!=NULL){
  73.   if(q->dato==dato){
  74.    return 1; //verdadero si lo encuentra.
  75.   }
  76.   q = desapilar(q);
  77.  }
  78.  return 0; //falso, si no lo encuentra.
  79. }
  80. return 0; //falso, si no lo encuentra.
  81. }
  82.  
  83. int main(int argc, char *argv[]) {
  84.  
  85. //Menu Principal.
  86. int opcionMenu, volverIntentar, scanfValidador;
  87. srand(time(NULL));  //Semilla del creador de numeros Randoms
  88.  
  89. do{
  90. do{
  91.  
  92. printf("Seleccione una opcion\n");
  93. printf("[1] Ejercicio 1\n[2] Ejercicio 2\n[3] Ejercicio 3\n[4] Salir\n");
  94. scanfValidador = scanf("%d", &opcionMenu);
  95. fflush(stdin);
  96.  if(scanfValidador!=1){
  97.   printf("\nOpcion no valida, ingrese un valor numererico positivo.\n");
  98.   puts("");
  99.  }
  100. }while(scanfValidador!=1); //Validador
  101.  
  102.     if(opcionMenu == 1){
  103.      // Crear y listar una pila con n elementos. Ingresar un dato y consultar cuantas veces se repite y en que posiciones.
  104.   Pila *pila;
  105.   int n, i; //tamaño n de la pila
  106.   int numRand;
  107.   int scanfValidador3;
  108.  
  109.   do{
  110.        puts("Ingrese tamaño de la Pila la cual tendra numeros random del [0-10]");
  111.        scanfValidador3 = scanf("%d", &n);
  112.        fflush(stdin);
  113.        if(scanfValidador3!=1){
  114.        printf("\nOpcion no valida, ingrese un valor numererico positivo.\n");
  115.        puts("");
  116.  }
  117.        }while(scanfValidador3!=1); //Validador
  118.        i=n;
  119.  
  120.        while(n!=0){ //Recorrer Pila
  121.         numRand = rand() % 11; // genera un numero Random entre el 0 y el 10
  122.         //pila->sgte=NULL;
  123.         pila = apilar(pila, numRand);
  124.     n--;
  125.   }
  126.  
  127.   // while(i!=0) {
  128.   mostrarPila(pila);
  129. //  i--;
  130. //  }  
  131.  
  132.  }
  133.  
  134.  else if(opcionMenu == 2){
  135.   printf("Opcion 2\n");
  136.  }
  137.  
  138.  else if(opcionMenu == 3){
  139.   printf("Opcion 3\n");
  140.  }
  141.  
  142.  else if(opcionMenu == 4){
  143.   exit(0);
  144.  }
  145.  else{
  146.   puts("");
  147.   printf("Opcion invalida\n");
  148.   puts("");
  149.  }
  150.  int scanfValidador2;
  151. do{
  152.  printf("\nPara volver a intentar preciona [1] y da enter.\nPara salir use cualquier otro numero y precione enter.\n");
  153.  puts("");
  154.  scanfValidador2 = scanf("%d", &volverIntentar);
  155.  fflush(stdin);
  156.  if(scanfValidador2!=1){
  157.   printf("\nOpcion no valida, ingrese un valor numererico positivo.\n");
  158.   puts("");
  159.  }
  160. }while(scanfValidador2!=1); //Validador
  161. }while(volverIntentar==1);
  162. return 0;
  163. }
  164.  
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Ayuda solucionar error UBUNTU 11.04 64bits
GNU/Linux
777Rubenix777 3 5,359 Último mensaje 29 Abril 2011, 23:10 pm
por 777Rubenix777
Como solucionar el error 414 de Google
Desarrollo Web
Graphixx 0 7,315 Último mensaje 16 Julio 2011, 05:58 am
por Graphixx
SOLUCIONAR ERROR 0XC004E003
Windows
kikagauto 0 16,071 Último mensaje 28 Abril 2012, 06:33 am
por kikagauto
Ayuda! Hay un error que no se como solucionar en Python
Scripting
LucchettiFan 4 2,443 Último mensaje 7 Enero 2024, 13:36 pm
por LucchettiFan
MOVIDO: Ayuda! Hay un error que no se como solucionar en Python
Programación General
fary 0 751 Último mensaje 6 Enero 2024, 17:49 pm
por fary
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines