¿Hay algo que se me escapa de las manos en este código y me genera error?

Iniciado por theluigy13etv, 27 Abril 2012, 04:38 AM

0 Miembros y 1 Visitante están viendo este tema.

theluigy13etv

Hola a todos, resulta que estoy aprendiendo a crear pilas y a realizar las operaciones básicas como creación de pilas, recorrido, inserción de nodos y eliminación de nodos. Creo que voy bien porque todo me estaba saliendo bien. Luego, decidí implementar un menú en mi programa para poder elegir la operación que desea hacer el usuario, y fue recién que me genera problemas. El problema específicamente está en lo siguiente:

El menú es:

Citar
MENU DE OPCIONES

1. Crea Pila
2. Recorre Pila
3. Elimina Nodo
4. Inserta Nodo
0. SALIR
   

Y el error sale cuando elijo la opción cero 0, me sale un mensaje de error y no entiendo el porqué, tal vez hay algo que se me está escapando de las manos.
Estaré agradecido si me ayudan a encontrar el error.

Código:


#include <stdio.h>

struct Luis {
  int cod;
  struct Luis *punt;      
};

typedef struct Luis Nodo;

Nodo *pila=NULL;
short int llave;

void menu();
Nodo *Crea_Nodo(int cod);
void Crea_Pila(Nodo **h);
void Recorre_Pila(Nodo *h);    
void Elimina_Nodo(Nodo **h);
void Inserta_Nodo(Nodo **h);        
         
int main() {
  menu();  
}

Nodo *Crea_Nodo(int cod) {
  Nodo *aux;
  aux = malloc(sizeof(Nodo));
  aux->cod=cod;
  aux->punt=NULL;
  return aux;
}

void Crea_Pila(Nodo **h) {
  Nodo *aux;
  int i, n, cod;
  printf("\nCreando la Pila...\n");
  llave=1;
  *h = NULL;
  printf("\n\tIngrese la cantidad de Nodos: ");
  scanf("%d", &n);
  puts("");
  for(i=0; i<n; i++) {
     printf("\t> ");
     scanf("%d", &cod);
     if(*h==NULL)
        *h=Crea_Nodo(cod);
     else {
        aux=Crea_Nodo(cod);
        aux->punt=*h;
        *h=aux;
     }
  }
  if(h!=NULL) printf("\n\tLa pila ha sido creada\n");
}

void Recorre_Pila(Nodo *h) {
  printf("\nRecorriendo Pila\n\n");
  if(h==NULL) printf("\n!!! La pila esta vacia !!!\n");
  while(h!=NULL) {
     printf("\t--> %d ", h->cod);
     h=h->punt;              
  }    
  puts("");
}

void Elimina_Nodo(Nodo **h) {
  Nodo *aux;
  char resp;
 
  printf("\nDesea eliminar nodo?\n");
  scanf("%d", &resp);
  if(resp==0) return;
  do{
     if(*h==NULL) {
        printf("\nLa pila esta vacia, no puede seguir eliminando nodos\n");            
        return;
     }
     else {
        aux=(*h)->punt;
        free(*h);
        *h=aux;
     }
     printf("\nDesea seguir eliminando nodos?\n");
     scanf("%d", &resp);
  }while(resp);
}

void Inserta_Nodo(Nodo **h) {
  int num;
  Nodo *aux;
  char resp;
 
  do{
     printf("\nIngrese dato a insertar a la pila: ");    
     scanf("%d", &num);
     if(*h==NULL)
        *h=Crea_Nodo(num);
     else {
        aux=Crea_Nodo(num);
        aux->punt = *h;
        *h=aux;    
     }
     printf("\nDesea seguir insertando datos?");
     scanf("%d", &resp);  
  }while(resp);
}

void menu() {
  short int resp;
  do{
     printf("\n\t\t\tMENU DE OPCIONES\n");
     printf(  "\t\t\t----------------\n\n");    
     printf("\t1. Crea Pila\n");
     printf("\t2. Recorre Pila\n");
     printf("\t3. Elimina Nodo\n");
     printf("\t4. Inserta Nodo\n");
     printf("\t0. SALIR\n");
     printf("\n\t Ingrese opcion ==> ");
     scanf("%d", &resp);
     
     switch(resp) {
        case 1:    
           Crea_Pila(&pila);
           break;
        case 2:
           if(llave==1) Recorre_Pila(pila);
           else puts("\a");
           break;
        case 3:
           if(llave==1) Elimina_Nodo(&pila);    
           else puts("\a");
           break;            
        case 4:
           if(llave==1) Inserta_Nodo(&pila);    
           else puts("\a");
           break;
        default:
           printf("\nAdios\n");    
     }        
  }while(resp>0);
}


Estoy sospechando que el problema está en el módulo MENU, pero no lo encuentro, lo demás veo que está bien porque lo he probado antes sin el MENU

durasno

Hola! el "problema" ( si es q se puede decir problema) esta en el short int resp. No se porque razon no deja almacenar un cero  :o ... declara la variable de tipo int
Espero q alguien pueda responder mejor a esto

Saludos

Ahorrate una pregunta, lee el man

Beakman

Cambia esta parte:
Nodo *aux;
aux = malloc( sizeof( Nodo ) );

Por esto:
Nodo *aux;
aux = ( Nodo* )malloc( sizeof( Nodo ) );


En cuanto al cero no veo por qué no debería funcionar. Escribinos el mensaje de error.