Test Foro de elhacker.net SMF 2.1

Programación => Programación C/C++ => Mensaje iniciado por: ml0x en 10 Abril 2016, 08:13 AM

Título: Ayuda solucionar error en PILAS en C.
Publicado por: ml0x 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 !!

#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;
}
Título: Re: Ayuda solucionar error en PILAS en C.
Publicado por: class_OpenGL en 10 Abril 2016, 15:46 PM
Un error que he visto es el siguiente:
Código (cpp) [Seleccionar]
void mostrarPila (Pila *p){
    if(p!=NULL){
        Pila *q = p; //pila auxiliar
        while(q!=NULL){
            printf("%d ", q->dato); // Aquí interpretas el dato de q como un puntero a entero
            q = desapilar(q);
        }
        return;
    }
    printf("No hay elementos en la Pila\n");
}


Código (cpp) [Seleccionar]
Pila *apilar(Pila *p, int dato){
    Pila *q = asignarMemoria(); //Pila auxiliar
    q->dato=dato; // Aquí interpretas el dato de q como un entero
    q->sgte=NULL;

    if(p==NULL){
        return q;
    }
    q->sgte = p;
    p = q;
    return p;
}


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'
Título: Re: Ayuda solucionar error en PILAS en C.
Publicado por: class_OpenGL en 10 Abril 2016, 15:48 PM
¿Por qué en la función apilar no retornas directamente q?
Título: Re: Ayuda solucionar error en PILAS en C.
Publicado por: lfgmespino 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.


#include <stdio.h>
#include <stdlib.h>
#include <time.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){
while(p) {
printf("%d, ", p->dato);
p = p->sgte;
}
}

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