kingtryst Posted May 27, 2011 Report Share Posted May 27, 2011 Bueno ddebo trabajar con lista enlazadas el problema que tengo esque debo borrar datos de la lista pero al momento que elimino el primer dato de mi lista el programa se me cae y no se como hacerlo para que no pase. el codigo que he hecho trae mas cosas hasta ahora pero el prblema que tengo es el ya mencionado si alguien puede revisar el codigo y decirme donde estar el error O que me falta se lo agradeceria muxo #include <stdio.h> #include <stdlib.h> #include <windows.h> main(){ int opcion,cod; struct alumno{ int codigo; char nombre[50]; char apellido[50]; char carrera[150]; char ciudad[150]; int edad; struct alumno *sig; }; struct alumno *inicio=NULL; struct alumno *final=NULL; struct alumno *nuevo=NULL; struct alumno *aux=NULL; struct alumno *aux1=NULL; do{ printf("-------MENU------\n"); printf("1.- Ingresar alumno\n"); printf("2.- Eliminar alumno\n"); printf("3.- Modificar datos alumnos\n"); printf("4.- Mostrar listado de alumnos\n"); printf("5.- Salir\n"); scanf("%d",&opcion); system("cls"); switch(opcion){ case 1://ingresar datos nuevo=(struct alumno*)malloc(sizeof(struct alumno)); if(nuevo==NULL){ printf("No hay espacio"); }else{ printf("Ingrese Codigo: "); scanf("%d",&nuevo->codigo); printf("Ingrese Nombre: "); scanf("%s",&nuevo->nombre); printf("Ingrese Apellido: "); scanf("%s",&nuevo->apellido); printf("Ingrese Carrera: "); scanf("%s",&nuevo->carrera); printf("Ingrese Edad: "); scanf("%d",&nuevo->edad); printf("Ingrese Ciudad: "); scanf("%s",&nuevo->ciudad); if(inicio==NULL){ inicio=nuevo; final=nuevo; final->sig=NULL; }else{ final->sig=nuevo; final=nuevo; final->sig=NULL; } }system("cls"); break; case 2://eliminar segun codigo del alumno printf("Ingrese el codigo del alumno a modificar: "); scanf("%d",&cod); aux=inicio; while(aux->sig->codigo!=cod){ aux=aux->sig; } if(aux==NULL){ printf("Codigo no encontrado"); }else{aux1=inicio; aux1=aux->sig; aux->sig=aux1->sig; free(aux1); } printf("dato de alumno eliminado"); system("pause>null"); system("cls"); break; case 3://Modificar datos segun codigo alumno case 4://Muestra datos aux=inicio; while(aux!=NULL){ printf("%d\n",aux->codigo); printf("%s\n",aux->nombre); printf("%s\n",aux->apellido); printf("%s\n",aux->carrera); printf("%d\n",aux->edad); printf("%s\n",aux->ciudad); aux=aux->sig;} system("pause>null"); system("cls"); break; } }while(opcion!=5); } Link to comment Share on other sites More sharing options...
rkstro Posted May 27, 2011 Report Share Posted May 27, 2011 Mira segun yoo tienes por lo menos 2 problemas: while(aux->sig->codigo!=cod){ aux=aux->sig; } El problema de eso es que cuando vas haciendo el while, vas a llegar a un punto en que el aux sea el ultimo y el sig del ultimo es NULL, por eso entonces al comprobar la condicion del while aux->sig->codigo se cae, porque o aux es NULL o sig lo es, y por lo tanto no tienen codigo. Lo otro es similar y esta en: }else{ aux1=inicio; aux1=aux->sig; aux->sig=aux1->sig; free(aux1); } Aqui pasa lo mismo o similar con aux 1 creo. Link to comment Share on other sites More sharing options...
kingtryst Posted May 28, 2011 Author Report Share Posted May 28, 2011 supuestamente en la condicion de el while me va a dejar un nodo antes del nodo donde esta la informacion que deseo borrar aux no es null porke antes del while le asigno inicio y sig es un puntero que apunta a a la estructura alumno y la segunda parte todavia la estoy revisando si en algo de lo que dije estoy equivocado porfavor corrijeme Link to comment Share on other sites More sharing options...
rkstro Posted May 28, 2011 Report Share Posted May 28, 2011 (edited) supuestamente en la condicion de el while me va a dejar un nodo antes del nodo donde esta la informacion que deseo borrar aux no es null porke antes del while le asigno inicio y sig es un puntero que apunta a a la estructura alumno y la segunda parte todavia la estoy revisando si en algo de lo que dije estoy equivocado porfavor corrijeme Mira, puede que a lo mejor tenga algun error en lo que diga, pues hace tiempo que no trabajo con C puro y ya no me acuero muy bien, pero si mi memoria no me falla, por ejemplo supongamos que hay un solo alumno en la lista, osea tendrias algo como esto: +----------+ Inicio --> | Alumno 1 | --> NULL +----------+ /\ Aux -----/ Entonces el while al verificar Aux->sig->codigo se caera, porque Aux->sig es NULL y como tal no tendra en memoria nada, ni menos codigo Edited May 28, 2011 by r_kstro Link to comment Share on other sites More sharing options...
kingtryst Posted May 29, 2011 Author Report Share Posted May 29, 2011 en el caso de ser el primero si porke no habria nada antes de el o sea NULL pero cuando tengo datos de 2 alumnos y queria borrar el primero se cae pero me puedes ayudar a arreglar el codigo porke sinceramente no soy muy experto en listas enlazadas y no se que debo hacer en esta caso Link to comment Share on other sites More sharing options...
Sting_Master Posted June 2, 2011 Report Share Posted June 2, 2011 case 2://eliminar segun codigo del alumno printf("Ingrese el codigo del alumno a modificar: "); scanf("%d",&cod); aux=inicio; while(aux->sig->codigo!=cod){ aux=aux->sig; } if(aux==NULL){ printf("Codigo no encontrado"); }else{aux1=inicio; aux1=aux->sig; aux->sig=aux1->sig; free(aux1); } printf("dato de alumno eliminado"); Aca debes comprobar si el dato a eliminar es igual al inicio(head), porque si el dato es igual el inicio al eliminarlo pierdes la cabeza de la lista, entonces pierdes en que parte de la memoria esta la lista guardada, por lo tanto en este caso el inicio seria inicio->sig, aux->sig=NULL, aux esta parado en inicio, y ahi liberas el aux. Espero haberte ayudado Link to comment Share on other sites More sharing options...
Pathfinder Posted June 13, 2011 Report Share Posted June 13, 2011 Uff años que no veia pubnteros!! Me trajo muchos recuerdos... en fin, ya te han ayudado bastante y conicido con lo que te han dicho, Ahora un consejo, utilizas algún ide? Si es así utiliza la herramienta de debug que tenga :) te ahorrará bastante tiempo en encontrar donde y porqué se cae tu programa. Y si no usas, te aconsejo que uses uno. Saludos! Link to comment Share on other sites More sharing options...
lostinspacex Posted June 23, 2011 Report Share Posted June 23, 2011 ctm nunca he hecho estructuras de datos sin clases xD , queda todo re desordenado , case 2://eliminar segun codigo del alumno printf("Ingrese el codigo del alumno a modificar: "); scanf("%d",&cod); aux=inicio; while(aux->sig->codigo!=cod){ aux=aux->sig; //ESTO VA AL FINAL DEL WHILE } if(aux==NULL){ // ESTO VA FUERA DEL WHILE printf("Codigo no encontrado"); } else{aux1=inicio; aux1=aux->sig; aux->sig=aux1->sig; free(aux1); } printf("dato de alumno eliminado"); system("pause>null"); system("cls"); break; HAY VARIOS CASOS DE BORRADO , SI ENCUENTRA AL PRIMERO PONLO FUERA DEL WHILE ES EL MAS SIMPLE : INICIO = INICIO->SIGUIENTE; SI EL COMPADRE NO ES PRIMERO AUX=INICIO; AUX1=INICIO->SIGUIENTE; WHILE(AUX1){ IF (AUX1.CODIGO==CODIGO){ AUX->SIGUIENTE = AUX1->SIGUIENTE; } AUX=AUX1; AUX1=AUX1->SIGUIENTE; } La identación te salvara la vida Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now