sebakan29 Posted November 26, 2011 Report Share Posted November 26, 2011 Haber si me siguen, tengo un enredo con unas funciones, supongamos q tengo una lista enlazada cn datos como nombre, rut, codigo de registro, etc, y necesito buskar por el codigo de registro y mostrar los datos completos de la personas, lo q he implementado es lo siguiente: void buscar(){ lista *l; int cod_ins; struct nodo *aux; aux=l->head; printf("Ingrese codigo inscripcion a buscar: "); fflush(stdin); scanf("%i",&cod_ins); //valida si la lista esta vacia if(l->head == NULL){ printf("La lista esta vacia.");; } else{ //declara un puntero p al primer elemento de la lista do{ //valida si la data del nodo es la data buscada if(aux->cod_ins == cod_ins){ //devuelve la referencia al nodo y termina la función printf("\nNombre: %s - Apellido: %s - Sexo: %c - Edad: %i - Codigo de inscripcion: %i - Codigo de carrera: %i - Tema inscrito: %c ", aux->nombre, aux->apellido, aux->sexo, aux->edad, aux->cod_ins, aux->cod_carrera, aux->tema); } else{ //p apunta al siguiente nodo aux = aux->link; } //se repite mientras no se llegue al final de la lista }while(aux!=NULL); } //si termina la lista y no encontro el nodo buscado retorna NULL return NULL; } pero no me lo toma =/, al momento de buskar me lanza error, no se como implementarla el lenguaje es c++Les agradeceria si me ayudaran Link to comment Share on other sites More sharing options...
susodicho Posted November 28, 2011 Report Share Posted November 28, 2011 (edited) :mmm: Sin siquiera compilar se ve algo malo: el puntero l no está asignado, así que difícilmente te va a funcionar... :tonto:Además, de la forma en que lo tienes hecho ahora, siempre devuelve NULL (sin importar si encontró o no el dato), más encima la función no debería devolver nada porque la declaraste como "void buscar()". De todas formas, supongo que lo que quisiste hacer es: void buscar(lista *l) { //etc. } o sea, en vez de declarar el puntero "l" como variable local, lo dejas como parámetro de la función. Por último: el lenguaje es C (no C++) Edited November 28, 2011 by susodicho Link to comment Share on other sites More sharing options...
Th3_K4T Posted November 29, 2011 Report Share Posted November 29, 2011 (edited) Si, como te dicen, el puntero l está vacío, lo tienes que pasar por referencia en la función. Para las funciones que necesiten sólo buscar o leer datos se hace así: void buscar(lista *l) { //Nota: Puedes recorrer directamente *l sin necesitar de un auxiliar } Para funciones en que tengas que modificar la lista se hace así: void editar(lista **l) { //Nota: Necesitas crear un auxiliar o perderás el head de *l lista *aux = *l; } Edited November 29, 2011 by Th3_K4T Link to comment Share on other sites More sharing options...
sebakan29 Posted December 3, 2011 Author Report Share Posted December 3, 2011 Tengo este codigo: #include <stdio.h> #include<stdlib.h> #include<string.h> #include<conio.h> struct nodo{ char nombre[15]; char apellido[30]; char sexo; int edad; int cod_ins; int cod_carrera; char tema; struct nodo *link; }; typedef struct{ int tamano; struct nodo *head; }lista; lista *create(){ lista *aux; aux = (lista *)malloc(sizeof(lista)); aux->tamano = 0; aux->head = NULL; return (aux); } void add_inicio(char nombre[], char apellido[], char sexo, int edad, int cod_ins, int cod_carrera, char tema, lista *l){ struct nodo *aux; aux = (struct nodo *)malloc(sizeof(struct nodo)); strcpy(aux->nombre, nombre); strcpy(aux->apellido, apellido); aux->sexo= sexo; aux->edad= edad; aux->cod_ins= cod_ins; aux->cod_carrera= cod_carrera; aux->tema= tema; aux->link = l->head; l->head = aux; l->tamano++; } void ingresa(){ lista *l; char nombre[15],apellido[30], sexo,tema; int edad, cod_ins, cod_carrera, insertar=0; struct nodo *aux; l = create(); while (insertar == 0) { printf("\nIngrese Nombre: "); fflush(stdin); gets(nombre); printf("\nIngrese Apellidos: "); fflush(stdin); gets(apellido); printf("\nIngrese Sexo: "); fflush(stdin); scanf("%c", &sexo); printf("\nIngrese edad: "); fflush(stdin); scanf("i", &edad); printf("\nIngrese codigo de inscripcion: "); fflush(stdin); scanf("%i", &cod_ins); printf("\nIngrese codigo de carrera: "); fflush(stdin); scanf("%i", &cod_carrera); printf("\nIngrese Tema inscrito: "); fflush(stdin); scanf("%c", &tema); add_inicio(nombre, apellido, sexo, edad, cod_ins, cod_carrera, tema, l); printf("\nDesea ingresar otro participante (0:Si; 1:No): "); scanf("%i", &insertar); } } void buscar(lista *l){ struct nodo *aux; int busk; aux=l->head; printf("Ingrese codigo para buscar participante: "); scanf("%i",&busk); while(aux != NULL){ printf ("\nLos datos son los siguientes:\n"); if(aux->cod_ins == busk) printf("\nNombre: %s - Apellido: %s - Sexo: %c - Edad: %i - Codigo de inscripcion: %i - Codigo de carrera: %i - Tema inscrito: %c ", aux->nombre, aux->apellido, aux->sexo, aux->edad, aux->cod_ins, aux->cod_carrera, aux->tema); else aux = aux->link; } if(aux==NULL) printf("\nLa lista esta Vacia!!"); } int Menuprincipal(){ lista *l; l=create(); int op; do{ system("cls"); system("color 0A"); printf("Name: PROYECT ALGORITMO AND STRUCT DATA ©"); printf("\nCopyright ©WEB NORTZIDE S.A. 2011 "); printf("\nAuthor: Sebastian Oliva "); printf("\nDate: 30/04/11 23:00"); printf("\nDescription: PROYECT ALGORITMO AND STRUCT DATA © "); printf("\n\n\n\t\t\t.......................................\n"); printf("\t\t\t. PROYECT ALGORITMO AND STRUCT DATA © ."); printf("\n\t\t\t. 2011 ."); printf("\n\t\t\t. 1.- INGRESO ALUMNO ."); printf("\n\t\t\t. 2.- BUSCAR ."); printf("\n\t\t\t. 3.- SALIR ."); printf("\n\t\t\t.......................................\n\n\n"); printf("\nPOR FAVOR ESCOGER UNA OPCION: "); scanf("%d",&op); fflush(stdin); system("cls"); switch(op) { case 1:{ ingresa(); } break; system("cls"); case 2:{ buscar(l); break; system("cls"); } } }while(op!=3); } int main() { system("TITLE SEBASTIAN OLIVA ® S.A."); system("color 0A"); Menuprincipal(); system("pause"); } Me dicen q la funcion ingresa() no esta recibiendo "lista l"No se como modificarla para q resiva "lista l"la funcion buskar no me funciona :/ Si alguien me puede ayudar porfavor le agradeceria! Link to comment Share on other sites More sharing options...
Th3_K4T Posted December 3, 2011 Report Share Posted December 3, 2011 (edited) 1) Te falta el return en el main. 2) La función de menú principal sólo debería mostrar un menú, no manejar la lista. 3) El Ingresa() no está recibiendo la lista que creaste en menuprincipal(); LEE LO QUE ESCRIBÍ, el ingresa debería ser así: void ingresa(lista **l); y ocupar un auxiliar dentro para recorrer e ingresar. Lo otro, es que la anidación de estructuras que usaste te complica todo, es necesario hacer eso?. Y por último, te aconsejo que la función ingresa o busca no hagan ningún printf o scanf, sino que debería recibir los datos por referencia, y programar lo más modular posible las funciones de la lista. Además de los errores de código, hay errores en la forma en que has dividido el problema que hacen que no sea un código reutilizable y escalable, si no te exigen eso en la tarea, haz como que nunca dije nada, sino, corrige esos errores. Suerte. Edited December 3, 2011 by Th3_K4T Link to comment Share on other sites More sharing options...
susodicho Posted December 6, 2011 Report Share Posted December 6, 2011 Primero, la lista se crea una vez, después sólo se le agregan nodos. Tú estás creando la lista varias veces. Así que elimina las instrucciones: lista *l; l=create(); de las funciones ingresa y MenuPrincipal. Lo otro, cambiaste la función buscar (poniendo la lista como parámetro), pero tienes que hacer lo mismo con las funciones ingresa y MenuPrincipal (es la misma idea). Así que mejor crea la lista en la función main: int main() { lista *l; l=create(); // el resto del programa... return 0; } Otras cosas:Los system("cls"); no deberías ponerlos después de los breakEs incorrecto que la función buscar muestre el error "La lista está vacía" cuando aux==NULL. Esa condición se cumple siempre que se sale del ciclo while.Deberías validar ciertos datos ingresados por el usuario: la edad no puede ser negativa ni un valor "muy alto", sexo sólo debería ser 'M' ó 'F',... O sea, deberían seguir pidiendo que se ingrese el valor hasta que sea válido.Deberías pedir al usuario que conteste 'S' (Sí) ó 'N' (No) cuando le preguntas si quiere seguir ingresando datos, en vez de pedirle que ingrese '0' ó '1'. Este punto y el anterior lo puedes solucionar usando _getchCualquier función que reciba la lista como parámetro debería verificar primero que no sea NULL antes de empezar a usarla. Si es NULL, simplemente debería salir sin hacer nada.Creo que sería más lógico que el ciclo de la función ingresa sea un do...while en vez de un while. Link to comment Share on other sites More sharing options...
AshWilliams Posted December 6, 2011 Report Share Posted December 6, 2011 Entre lo que posteo K4T y susodicho, pues, más claro no puede estar....espero tu comentario para cerrar el tema. Saludos :krider: 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