Jump to content

Ayuda Listas Enlazadas en C


Recommended Posts

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

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

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

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 by r_kstro
Link to comment
Share on other sites

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

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

  • 2 weeks later...

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

  • 2 weeks later...

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

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...