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);
}