Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Listas Dobles enlazadas en C

Estas en el tema de Listas Dobles enlazadas en C en el foro de C/C++ en Foros del Web. Hola! Tengo un problema con unas funciones que tengo que hacer en un programa, para ingresar datos ordenadamente e imprimir la lista mayor a menor ...
  #1 (permalink)  
Antiguo 03/12/2011, 13:03
Avatar de FafaAngel  
Fecha de Ingreso: diciembre-2011
Mensajes: 3
Antigüedad: 13 años
Puntos: 0
Listas Dobles enlazadas en C

Hola!
Tengo un problema con unas funciones que tengo que hacer en un programa, para ingresar datos ordenadamente e imprimir la lista mayor a menor en vez de menor a mayor que lo tengo ya listo en otra funcion
Me podrian dar una mano ac dias que estoy con esto y no encuentro nada por la web :S
El programa era para listas y nos pidieron que lo hagamos para listas dobles enlazadas.

Código PHP:
#include <stdio.h>
#include <conio.h>
#include <ctype.h>
#include <string.h>

struct datos
{
    
int dni;
   
char nombre[25];
   
char apellido[25];
   
int edad;
};

struct listadob
{
    
struct datos pers;
   
struct listadob *sig;
    
struct listadob *ant;

};

void listadobf(void);
struct listadob *insertarlistadob(struct listadob *primero,struct listadob *ultimo);
void imprimirlistadob(struct listadob *primero);
void destruirlistadob(struct listadob *primero);
void guardararchlistadob(struct listadob *primero);
struct listadob *leerarchlistadob(struct listadob *primero,FILE *arch);
struct listadob *insertarlistadob2(struct datos *info,struct listadob *primero);
void imprimirlistadob_atras(struct listadob *ultimo);

main()
{
    
int op;
   do
   {
       
printf("\n-----------MENU PRINCIPAL-----------\n");
      
printf("Elija una Opcion:\n1-Pila\n2-Cola\n3-Lista\n4-Lista Doble\n5-Salir\n");
      
scanf("%d",&op);

      switch(
op)
      {
          case 
1:
         
//pilaf();
         
break;
         case 
2:
        
// colaf();
         
break;
         case 
3:
        
// listaf();
         
break;
         case 
4:
         
listadobf();
         break;
         case 
5:
         break;
         default:
         
printf("Opcion Incorrecta\n");
         break;
      }
   }while(
op!=5);
}
void listadobf(void)
{
    
int op,op2,op3,doc;
   
char apell[25],apell2[25],listadob[30];
   
struct listadob *primero=NULL;
    
struct listadob *ultimo=NULL;
   do
   {
      
clrscr();
       
printf("\nSeleccione una opcion:\n\n1-Insertar datos\n2-Extraer datos\n3-Imprimir Ordenado por DNI (Menor a Mayor)\n4-Imprimir Ordenado por DNI (Mayor a Menor)\n5-Modificar un Registro\n6-Buscar un Registro\n7-Cargar lista de un Archivo\n8-Guardar en un Archivo\n9-Volver al menu principal\n\n");
      
scanf("%d",&op);

      switch(
op)
      {
          case 
1:
         
primero=insertarlistadob(primero,ultimo);
         break;
         case 
2:
         
printf("Extraer un elemento de la lista:\nElija una opcion:\n1-DNI\n2-Apellido\n\n");
         
scanf("%d",&op2);
             switch(
op2)
            {
                case 
1:
                   
printf("Ingrese el numero de DNI: ");
                  
scanf("%d",&doc);
                        
primero=extraerlistadob(primero,doc);
               break;
               case 
2:
                   
printf("Ingrese el Apellido que desea eliminar: ");
                  
fflush(stdin);
                  
gets(apell);
                  
primero=extraerlistadob2(primero,apell);
               break;
               default:
                   
printf("Opcion incorrecta\n");
               break;
            }
         break;
         case 
3:
         
imprimirlistadob(primero);
         break;
           case 
4:
         
imprimirlistadob_atras(ultimo);
         break;
         case 
5:
             
printf("Ingrese el DNI del registro que desea modificar:\n");
              
scanf("%d",&doc);
             
modificarlistadob(primero,doc);
         break;
         case 
6:
             
printf("Desea buscar por?\n1-Apellido\n2-Dni\n\n");
            
scanf("%d",&op3);
            switch(
op3)
            {
                case 
1:
                  
printf("Ingrese el apellido que desea buscar: ");
                  
fflush(stdin);
                  
gets(apell2);
                   
buscarlistadob2(primero,apell2);
               break;
               case 
2:
                   
printf("Ingrese el numero de DNI que desea buscar: ");
                  
scanf("%d",&doc);
                  
buscarlistadob(primero,doc);
               break;
               default:
                   
printf("Opcion Incorrecta\n");
               break;
            }
         break;
         case 
7:
            
FILE *arch;
            
printf("Ingrese el path del archivo que desea abrir: ");
               
fflush(stdin);
               
gets(listadob);

                 if((
arch=fopen(listadob,"rb"))==NULL)
                {
                    
printf("No se pudo abrir el archivo\n");
                 
getch();
               break;
                }

             
primero=leerarchlistadob(primero,arch);
            
fclose(arch);
         break;
         case 
8:
             
guardararchlistadob(primero);
         break;
         case 
9:
             
destruirlistadob(primero);
         break;
          default:
             
printf("Opcion Incorrecta\n");
         break;
      }
   }while(
op!=9);


getch();

}



struct listadob *insertarlistadob(struct listadob *primero,struct listadob *ultimo)
{
    
struct listadob *a,*b,*aux;

   
int band=0,op,op2;
   
char resp;
   
a=b=primero;
   
a=b=ultimo;


   
aux=new struct listadob;

   if(!
aux)
   {
       
printf("No hay espacio disponible\n");
      
getch();
      return (
primero);
   }

do
{
   
op2=0//para que no vuelva a entrar al do while
   
band=0;
   
printf("Ingrese el DNI que desea insertar: ");
   
scanf("%d",&aux->pers.dni);

   while(
b)
   {
       if(
aux->pers.dni<b->pers.dni)
      {
          break;
      }
      if(
aux->pers.dni==b->pers.dni)
      {
          
band=1;
         break;
      }
      
a=b;
      
b=a->sig;
   }
       if(
band==1)
       {
           
printf("\nEl Dni Ingresado ya esta en la lista.\tElija una Opcion:\n\n1-Modificar dicho registro\n2-Ingresar otro DNI\n3-Volver al Menu\n");
         
scanf("%d",&op2);
       }

}while(
op2==2);

      if(
op2==1)   //si el DNI ingresado no estaba en la lista no entra a este If
      
{
       
modificarlistadob(primero,aux->pers.dni);
      return(
primero);
      }
      else
      {
          if(
op2==3)
         {
             return(
primero,ultimo);
         }
      }


   if(
band!=1)     //Continúa cargando
   
{
       
printf("Ingrese el Apellido de dicha persona: ");
      
fflush(stdin);
      
gets(aux->pers.apellido);
      
printf("Ingrese el Nombre: ");
      
fflush(stdin);
      
gets(aux->pers.nombre);
      
printf("Ingrese la edad: ");
      
scanf("%d",&aux->pers.edad);
   }
   if(
b==primero)  //si b es igual a primero,quedaria primera
   
{
       
aux->sig=primero;
       
aux->sig=ultimo;

       
aux->ant=primero;
       
aux->ant=ultimo;

      
primero=aux;
      
ultimo=aux;
   }
   else       
//de lo contrario queda entre medio de a y b
   
{
       
aux->sig=b;
       
aux->ant=a;
      
a->sig=aux;
     
// b->ant=aux;

     
if(b)
        {
            
b->ant=aux;
        }
   }

   return(
primero);

}



void imprimirlistadob(struct listadob *primero)
{
   
struct listadob *a;

    
a=primero;
   
clrscr();

   while(
a)
   {
       
printf("Dni:%d\nApellido:%s\nNombre:%s\nEdad:%d\n\n",a->pers.dni,a->pers.apellido,a->pers.nombre,a->pers.edad);
      
a=a->sig;
   }
getch();
}


void imprimirlistadob_atras(struct listadob *ultimo)
{
   
struct listadob *a;

    
a=ultimo;
   
clrscr();

   while(
a)
   {
       
printf("Dni:%d\nApellido:%s\nNombre:%s\nEdad:%d\n\n",a->pers.dni,a->pers.apellido,a->pers.nombre,a->pers.edad);
      
a=a->ant;
   }
getch();
}


void destruirlistadob(struct listadob *primero)
{
    
struct listadob *a,*b;

   
a=primero;

   while(
a)
   {
       
b=a->sig;
      
delete a;
      
a=b;
   }
}



void guardararchlistadob(struct listadob *primero)
{
   
FILE *arch;
   
struct listadob *a;
   
struct datos aux;
   
char listadob[30];
   
int cont=0;
         
printf("Guardar en : ");
       
fflush(stdin);
       
gets(listadob);

       if((
arch=fopen(listadob,"wb"))==NULL)
        {
            
printf("No se puede abrir el archivo\n");

            
getch();
        }
    
a=primero;

   
clrscr();

   while(
a)
   {
      
aux=a->pers;
      
fwrite(&aux,sizeof(struct datos),1,arch);
      
cont++;
      
a=a->sig;
   }

   
printf("\nSe grabaron %d estructuras en el archivo\n",cont);
   
getch();

fclose(arch);
}

struct listadob *leerarchlistadob(struct listadob *primero,FILE *arch)  // Funcion para leer una Lista desde un Archivo
{

   
struct datos aux;
   
char pila[30];
   
int tam,a;


   
rewind(arch);
   if(
feof(arch))
   {
       
printf("\nEl archivo se encuentra vacio\n");
      
getch();
   }


   while(!
feof(arch))
   {
       
tam=fread(&aux,sizeof(struct datos),1,arch);
      if(
tam!=1)
      {
          if(
feof(arch))
         {
             break;
         }
         else
         {
             
printf("No se pudo leer el ultimo dato\n");
             break;
         }
      }

      
primero=insertarlistadob2(&aux,primero);
      
a++;
   }

printf("\nSe grabaron %d estructura/s en memoria\n",a);


getch();
return (
primero);
}


struct listadob *insertarlistadob2(struct datos *info,struct listadob *primero)
{
    
struct listadob *a,*b,*aux;

   
int op,band=0;

   
a=b=primero;


   
aux=new struct listadob;

   if(!
aux)
   {
       
printf("No hay espacio disponible\n");
      
getch();
      return (
primero);
   }


   
aux->pers.dni=info->dni;

   while(
b)
   {
       if(
aux->pers.dni<b->pers.dni)
      {
          break;
      }
      if(
aux->pers.dni==b->pers.dni//Si el Dni del Archivo ya se encuentra cargado en memoria no lo vuelve a recuperar
      
{
          
band=1;
         break;
      }
      
a=b;
      
b=a->sig;
   }





   if(
band==1)
   {
       return(
primero);
   }

   if(
band!=1)
   {

      
strcpy(aux->pers.apellido,info->apellido);

      
strcpy(aux->pers.nombre,info->nombre);

      
aux->pers.edad=info->edad;
   }
   if(
b==primero)
   {
       
aux->sig=primero;
      
primero=aux;
   }
   else
   {
       
aux->sig=b;
      
a->sig=aux;
   }

   return(
primero);



Etiquetas: dobles, enlazadas, funcion, listas, programa, string, struct
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 02:05.