Foros del Web » Programación para mayores de 30 ;) » C/C++ »

programa dejo de funciona (lista)

Estas en el tema de programa dejo de funciona (lista) en el foro de C/C++ en Foros del Web. Hola tengo una duda cuando meto la siguiente combinacion en mi programa : elijo opcion 1 guardo numero 2 vuelvo a elejir opcion 1 y ...
  #1 (permalink)  
Antiguo 26/05/2013, 17:32
 
Fecha de Ingreso: marzo-2013
Mensajes: 11
Antigüedad: 11 años, 1 mes
Puntos: 0
Pregunta programa dejo de funciona (lista)

Hola tengo una duda cuando meto la siguiente combinacion en mi programa :
elijo opcion 1 guardo numero 2 vuelvo a elejir opcion 1 y guardo numero 1 se rompe alguien me puede decir ¿por que?
aqui les pongo el codigo
Código C:
Ver original
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. struct nodo{
  4.        int dato;
  5.        nodo *siguiente;
  6.        };
  7. int menu();
  8. void *crear(void *);
  9. void *eliminar(void *);
  10. void *mostrar(void *);
  11. main(){
  12.        void *p=NULL;
  13.        int x;
  14.        do{
  15.           x=menu();
  16.           switch(x){
  17.                    case 1: p=crear(p);
  18.                            continue;
  19.                    case 2: p=eliminar(p);
  20.                            break;
  21.                    case 3: p=mostrar(p);
  22.                            continue;        
  23.                    }
  24.          }while(x<4);
  25.        }
  26. int menu(){
  27.     int x;
  28.     do{
  29.         printf("\n\tMenu\n");
  30.         printf("1.- Introducir elemento a la Lista\n");
  31.         printf("2.- Eliminar elemento de la Lista\n");
  32.         printf("3.- Mostar elementos de la Lista\n");
  33.         printf("4.- Salir\n");
  34.         printf("Elige una Opcion => ");
  35.         scanf("%d",&x);
  36.     }while(x<1&&x>4);
  37.     return x;
  38.   }
  39. void *crear(void *p){
  40.      nodo *q,*aux,*aux1;
  41.      q=(nodo*)malloc(sizeof(nodo));
  42.      q->siguiente=NULL;
  43.      printf("Dame un numero para ingresar en la Lista\t");
  44.      scanf("%d",&q->dato);
  45.      if(p==NULL){
  46.         p=q;
  47.        }
  48.      else{
  49.           aux=(nodo*)p;
  50.           if(q->dato<aux->dato){
  51.                   q->siguiente=aux;
  52.                   p=q;              
  53.                }
  54.           else{
  55.                aux=(nodo*)p;
  56.                while(aux->dato<q->dato&&aux->siguiente!=NULL){
  57.                      aux1=aux;
  58.                      aux=aux->siguiente;
  59.                      }
  60.                }
  61.           if(aux->siguiente==NULL&&aux->dato<q->dato){
  62.              aux->siguiente=q;                                        
  63.              }
  64.           else{
  65.                aux1->siguiente=q;
  66.                q->siguiente=aux;
  67.                }
  68.           }
  69.      return (p);
  70.      }
  71. void *eliminar(void *p){
  72.      nodo *q,*aux,*aux1;
  73.      int x;
  74.      aux=(nodo*)p;
  75.      printf("Numero a eliminar de la Lista\t");
  76.      scanf("%d",&x);
  77.      if(p==NULL){
  78.                  printf("Lista Vacia");
  79.                  }
  80.      else{
  81.           while(aux->dato<x&&aux->siguiente!=NULL){
  82.                aux1=aux;
  83.                aux=aux->siguiente;                                    
  84.                }
  85.           if(aux->dato==x){
  86.              if(aux==p){
  87.                  if(aux==NULL){
  88.                     p=NULL;          
  89.                     }
  90.                   else{
  91.                        p=aux->siguiente;
  92.                        }      
  93.                  }
  94.               else{
  95.                    if(aux->siguiente==NULL){
  96.                       aux1->siguiente=NULL;                      
  97.                       }
  98.                    else{
  99.                         aux1=aux->siguiente;
  100.                         }
  101.                    }
  102.               free(aux);        
  103.              }
  104.           else{
  105.                printf("Elemento no existente");
  106.                }
  107.           }
  108.      return p;
  109.      }
  110. void *mostrar(void *p){
  111.      nodo*s;
  112.      s=(nodo*)p;
  113.      if(p==NULL){
  114.         printf("\nPila Vacia\n");
  115.         }
  116.      else{
  117.           printf("\n");
  118.           do{
  119.              printf("%d.. ",s->dato);
  120.              s=s->siguiente;
  121.             }while(s!=NULL);
  122.          }
  123.      return p;
  124.      }

Última edición por nandaarea; 26/05/2013 a las 17:50
  #2 (permalink)  
Antiguo 27/05/2013, 05:07
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 11 años, 8 meses
Puntos: 83
Respuesta: programa dejo de funciona (lista)

"...alguien me puede decir ¿por que?..."

Porque aux1 no está definido, y como no lo inicializaste a nulo no tienes forma de hacer ninguna comprovacion de error. Cuando entras 2 y 1 se cumple que if(q->dato < aux->dato), pero ahi no asignas nada a aux1, sino que solo asignas aux1 en el siguiente else pero que en este caso no entras:

Código:
if(p==NULL){
		p=q;
	}
	else {//en la segunda llamada entras aqui
		aux = (struct nodo*)p;
		if(q->dato < aux->dato) {//se cumple esto
			q->siguiente=aux;
			p=q;              
		}
		else {//y no se ejecuta esto
			aux=(struct nodo*)p;
			while(aux->dato<q->dato&&aux->siguiente!=NULL) {
				aux1=aux;//por lo tanto no asignas nada a aux1
				aux=aux->siguiente;
			}
		}
		
		if(aux->siguiente == NULL && aux->dato < q->dato) {
			aux->siguiente = q;                                       
		}
		else {//aqui aux1 contiene datos basura
			aux1->siguiente = q;
			q->siguiente = aux;
		}
	}
Saludos
vosk

Etiquetas: int, programa, struct
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 18:38.