Jump to content

Consulta Listas Enlazadas


Recommended Posts

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

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

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

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

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

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 break
  • Es 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 _getch
  • Cualquier 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

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...