elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: ¿Eres nuevo? ¿Tienes dudas acerca del funcionamiento de la comunidad? Lee las Reglas Generales


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Ayuda con listas dobles Enlazadas
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Ayuda con listas dobles Enlazadas  (Leído 3,221 veces)
larezaka

Desconectado Desconectado

Mensajes: 18


Ver Perfil
Ayuda con listas dobles Enlazadas
« en: 27 Junio 2012, 17:44 pm »

Hola gente!!

Estoy haciendo un ejercicio en C++ que pide utilizar el concepto de LISTAS DOBLEMENTE ENLAZADAS y tengo algunos problemas para crear las funciones
de BORRAR un dato de la lista, MODIFICARLO, y BUSCARLO.
Si bien pude hacer lo de insertar los datos gracias a informacion que vi en estos foros, los demas se me hacen imposibles.
Incluso cree los menus y todo lo necesario para que este figurando, pero lo de las funciones no lo consigo crear y no veo ayuda en la red solo teoria.

si saben algo que pueda usar se agradece mucho...



Código
  1. #include <stdio.h>
  2. #include <conio.h>
  3. #include <ctype.h>
  4. #include <string.h>


la consigna pedia ingresar datos de una persona y mostrarlos..

Código
  1. struct datos
  2. {
  3. int dni;
  4.   char nombre[25];
  5.   char apellido[25];
  6.   int edad;
  7. };


Código
  1. struct listaenlazada
  2. {
  3.       struct datos pers;
  4.       struct listaenlazada *sig;
  5.       struct listaenlazada *ant;
  6. };
  7.  


son las que pude crer sim problemas, faltaria las de borrado , modificacion, y busqueda

Código
  1. void listdoubleen(void);
  2. struct listaenlazada *insertlistdouble(struct listaenlazada *primero);
  3.  
  4. void printlistdouble(struct listaenlazada *primero);
  5.  


hay opciones que no las uso que estan con X, por que eran para filas colas, etc, eso lo pude hacer.

Código
  1. main()
  2. {
  3. int op;
  4.  
  5.  
  6.   do
  7.   {
  8.   printf("\n*************Menu Inicial*************\n");
  9.      printf("\n\tElija una Opcion:\n\t1-xxx\n\t2-xxx\n\t3-xxx\n\t4-LISTA DOBLEMENTE ENLAZADA\n\t5-SALIR\n");
  10.  
  11.  printf("\n\tIntroduzca el nro:");
  12.      scanf("%d",&op);
  13.  
  14.      switch(op)
  15.      {
  16.       case 1:
  17.  
  18.         break;
  19.         case 2:
  20.  
  21.         break;
  22.         case 3:
  23.  
  24.         break;
  25.         case 4:
  26.         listdoubleen();
  27.         break;
  28.         case 5:
  29.         break;
  30.         default:
  31.         printf("la opcion elegida es incorrecta\n");
  32.         break;
  33.      }
  34.  
  35.   }while(op!=5);
  36.  
  37.  
  38. }



Código
  1. //+++++++++++++
  2.  
  3. void listdoubleen(void)
  4. {
  5. int op,op2,op3,doc;
  6.   char apell[25],apell2[25],listaenlazada[30];
  7.   struct listaenlazada *primero=NULL;
  8.  
  9.  
  10.   do
  11.   {
  12.     // clrscr();
  13.   printf("\nSeleccione una opcion:\n\n\t1-Insertar datos\n\t2-Quitar datos\n\t3-Imprimir datos en pantalla\n\t4-Modificar un Registro\n\t5-Buscar un Registro\n\t6-Volver al menu principal\n\n");
  14.   printf("\n\tIngresar el nro: ");
  15.      scanf("%d",&op);
  16.  
  17.      switch(op)
  18.      {
  19.       case 1:
  20.         primero=insertlistdouble(primero);
  21.         break;
  22.         case 2:
  23.         printf("Sacar un elemento de la lista:\nElija una opcion:\n\t1-DNI\n\t2-Apellido\n\n");
  24.         printf("\n\tIngresar el nro: ");
  25.         scanf("%d",&op2);
  26.         switch(op2)
  27.            {
  28.             case 1:
  29.               printf("Ingrese el numero de DNI: ");
  30.                  scanf("%d",&doc);
  31.  
  32.               break;
  33.               case 2:
  34.               printf("Ingrese el Apellido que desea eliminar: ");
  35.                  fflush(stdin);
  36.                  gets(apell);
  37.  
  38.               break;
  39.               default:
  40.               printf("Opcion incorrecta\n");
  41.               break;
  42.            }
  43.         break;
  44.         case 3:
  45.         printlistdouble(primero);
  46.         break;
  47.         case 4:
  48.         printf("Ingrese el DNI del registro que desea modificar:\n");
  49.       scanf("%d",&doc);
  50.  
  51.         break;
  52.         case 5:
  53.         printf("Desea buscar por?\n\t1-Apellido\n\t2-Dni\n\n");
  54.            scanf("%d",&op3);
  55.            switch(op3)
  56.            {
  57.             case 1:
  58.                  printf("Ingrese el apellido que desea buscar: ");
  59.                  fflush(stdin);
  60.                  gets(apell2);
  61.  
  62.               break;
  63.               case 2:
  64.               printf("Ingrese el numero de DNI que desea buscar: ");
  65.                  scanf("%d",&doc);
  66.  
  67.               break;
  68.               default:
  69.               printf("Opcion Incorrecta\n");
  70.               break;
  71.            }
  72.         break;
  73.         case 6:
  74.  
  75.         break;
  76.       default:
  77.         printf("Opcion Incorrecta\n");
  78.         break;
  79.      }
  80.   }while(op!=6);
  81.  
  82.  
  83. getch();
  84.  
  85. }


aca inserte los datos

Código
  1. struct listaenlazada *insertlistdouble(struct listaenlazada *primero)
  2. {
  3. struct listaenlazada *a,*b,*aux;
  4.  
  5.   int band=0,op,op2;
  6.   char resp;
  7.   a=b=primero;
  8.  
  9.  
  10.   aux=new struct listaenlazada;
  11.  
  12.   if(!aux)
  13.   {
  14.   printf("No hay espacio disponible en memoria\n");
  15.      getch();
  16.      return (primero);
  17.   }
  18.  
  19. do
  20. {
  21.   op2=0;
  22.   band=0;
  23.   printf("Ingresar el DNI: ");
  24.   scanf("%d",&aux->pers.dni);
  25.  
  26.   while(b)
  27.   {
  28.   if(aux->pers.dni<b->pers.dni)
  29.      {
  30.       break;
  31.      }
  32.      if(aux->pers.dni==b->pers.dni)
  33.      {
  34.       band=1;
  35.         break;
  36.      }
  37.      a=b;
  38.      b=a->sig;
  39.   }
  40.   if(band==1)
  41.   {
  42. printf("\nEl Dni Ingresado ya se encuentra en la lista.\tElija una Opcion:\n\n\t1-Modificar dicho registro\n\t2-Ingresar otro DNI\n\t3-Volver al Menu\n");
  43. printf("\n\tIngresar el nro: ");
  44.      scanf("%d",&op2);
  45.   }
  46.  
  47. }while(op2==2);
  48.  
  49.      if(op2==1)
  50.      {
  51.  
  52.      return(primero);
  53.      }
  54.      else
  55.      {
  56.       if(op2==3)
  57.         {
  58.         return(primero);
  59.         }
  60.      }
  61.  
  62.  
  63.   if(band!=1)    
  64.   {
  65.   printf("Ingresar el Apellido: ");
  66.      fflush(stdin);
  67.      gets(aux->pers.apellido);
  68.      printf("Ingresar el Nombre: ");
  69.      fflush(stdin);
  70.      gets(aux->pers.nombre);
  71.      printf("Ingresar la edad: ");
  72.      scanf("%d",&aux->pers.edad);
  73.   }
  74.  
  75.   if(b==primero)  
  76.   {
  77.   aux->sig=primero;
  78.      if(primero!=NULL){
  79.       primero->ant=aux;
  80.   }
  81.      primero=aux;
  82.   }
  83.   else      
  84.   {
  85.   aux->sig=b;
  86.      if(b!=NULL){
  87.       b->ant=aux;
  88.      }
  89.      a->sig=aux;
  90.      aux->ant=a;
  91.   }
  92.  
  93.   return(primero);
  94.  
  95. }


los imprimi...

Código
  1. void printlistdouble(struct listaenlazada *primero)
  2. {
  3.   struct listaenlazada *a,*b;
  4.  
  5. a=primero;
  6.  // clrscr();
  7.  
  8.   printf("Se recorre desde el primero de la lista hasta el ultimo\n");
  9.   while(a)
  10.   {
  11.   printf("Dni:%d\nApellido:%s\nNombre:%s\nEdad:%d\n\n",a->pers.dni,a->pers.apellido,a->pers.nombre,a->pers.edad);
  12.      b=a;
  13.      a=a->sig;
  14.   }
  15.   printf("Se recorre desde el ultimo de la lista hasta el primero\n");
  16.   while(b)
  17.   {
  18.   printf("Dni:%d\nApellido:%s\nNombre:%s\nEdad:%d\n\n",b->pers.dni,b->pers.apellido,b->pers.nombre,b->pers.edad);
  19.      b=b->ant;
  20.   }
  21. printf("\n\tPresione cualquier tecla para terminar... ");
  22. getch();
  23. }

es lo que llegue a hacer hasta el momento lo anterior no me parecio complicado, pero con lo de listas enlazadas se me hizo una laguna..

Gracias camaradas!!!! ::)


« Última modificación: 28 Junio 2012, 05:05 am por larezaka » En línea

durasno


Desconectado Desconectado

Mensajes: 373


Ver Perfil
Re: Ayuda con listas dobles Enlazadas
« Respuesta #1 en: 29 Junio 2012, 06:41 am »

Hola! si bien dijist que esto no te costo mucho no es muy optimo lo que haces, osea haces todo en una sola funcion. En la funcion listdoubleen(); creas la lista, la enlazas, imprimis... pero el mayor problema es q declaras struct listaenlazada *primero=NULL; en esa funcion, por lo cual cuando regreses al main no vas a poder hacer nada ya que primero solo va a ser visible en la funcion y no en el main

Te recomiendo este link (entra donde dice listas abiertas)
http://c.conclase.net/edd/index.php?cap=000#inicio

o mejor bajate este libro(busca el capitulo de listas):
Programacion en C Metodologia, Algoritmos y Estructurade datos


Saludos


En línea

Ahorrate una pregunta, lee el man
SXF

Desconectado Desconectado

Mensajes: 189



Ver Perfil WWW
Re: Ayuda con listas dobles Enlazadas
« Respuesta #2 en: 29 Junio 2012, 12:31 pm »

Primeramente esto esta mal es así:

typedef struct datos
{
   int dni;
   char nombre[25];
   char apellido[25];
   int edad;
   int grado;
   struct datos *sig;
   struct datos *ant;
};


En el link que te dio durasmo aparece como se forma una lista doblemente enlazada, eliminar , añadir y consultar, es muy sencillo.
En línea

larezaka

Desconectado Desconectado

Mensajes: 18


Ver Perfil
Re: Ayuda con listas dobles Enlazadas
« Respuesta #3 en: 1 Julio 2012, 17:02 pm »

Hola Gente...

Por suerte no tuve que modificar las struct, en enlace que me prestaron me sirvio mucho, tenia un ejemplo muy preciso como para resolverlo, ahora me funciona de D10S , solo tengo un ligero problema con eliminar un elemento de la lista
printf("Se recorre desde el ultimo de la lista hasta el primero\n")

que solo me lo borra cuando va del primero a lo ultimo, sigo revisando el codigo, en cuanto funcione lo subo para que lo vean.

Se agradece....
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Reemplazar comillas dobles dentro de comillas dobles.
.NET (C#, VB.NET, ASP)
seba123neo 2 8,565 Último mensaje 22 Agosto 2012, 20:25 pm
por seba123neo
Ayuda con Formularios con listas Dobles
PHP
larezaka 0 1,766 Último mensaje 7 Octubre 2012, 16:52 pm
por larezaka
necesito ayuda por favor.. listas doblemente enlazadas... diganme el error...
Programación C/C++
anthonynlson 1 4,430 Último mensaje 23 Octubre 2012, 00:44 am
por twins
Ayuda con listas enlazadas en Java
Java
ticogrunge 0 1,479 Último mensaje 16 Diciembre 2012, 20:41 pm
por ticogrunge
AYUDA! Urgente LISTAS ENLAZADAS DOBLES
Programación C/C++
dmon1 0 1,708 Último mensaje 17 Abril 2015, 06:01 am
por dmon1
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines