#include <stdio.h>
#include <stdlib.h>
struct tipo_lista_libro {
char titulo[20];
char autor[25];
float precio;
struct tipo_lista_libro *sig;
};
struct tipo_lista_libro *anadir_libro_lista(struct tipo_lista_libro libro, struct tipo_lista_libro *lista);
struct tipo_lista_libro *ordenar_lista_libros_seleccion(struct tipo_lista_libro *lista);
void imprimir_lista_libros(struct tipo_lista_libro *lista);
int main()
{
struct tipo_lista_libro libro;
struct tipo_lista_libro *lista_libros=NULL;
int i=0;
char titulo[25]="", autor[25]="";
for (i=0; i<10; i++) {
sprintf(libro.titulo, "libro %c%c",(i%3)+65, (i%5)+69);
sprintf(libro.autor, "Autor %c",i+48);
libro.precio = (i +20)*1.16 + (1.35)*i;
lista_libros = anadir_libro_lista(libro,lista_libros);
}
printf("Lista desordenada:\n");
imprimir_lista_libros(lista_libros);
lista_libros = ordenar_lista_libros_seleccion(lista_libros);
printf("\nLista ordenada por titulo:\n");
imprimir_lista_libros(lista_libros);
return 0;
}
//Esta función nos permite añadir nuevos libros a una lista. Recibe como parámetros una estructura con los datos del libro y
//un puntero al inicio de la lista. La función devuelve el puntero al inicio de la lista de libros con el nuevo incluido.
struct tipo_lista_libro *anadir_libro_lista(struct tipo_lista_libro libro, struct tipo_lista_libro *lista) {
struct tipo_lista_libro *item_lista = NULL;
item_lista=(struct tipo_lista_libro *)malloc(sizeof(struct tipo_lista_libro));
strcpy(item_lista->autor, libro.autor);
strcpy(item_lista->titulo, libro.titulo);
item_lista->precio = libro.precio;
item_lista->sig = NULL;
if (lista==NULL) {
lista = item_lista;
} else {
item_lista->sig = lista;
lista = item_lista;
}
return lista;
}
//Esta función permite ordenar una lista de nodos que guardan la información relativa a los
//libros utilizando el campo título. El algoritmo de ordenación implementado es el de selección.
struct tipo_lista_libro *ordenar_lista_libros_seleccion(struct tipo_lista_libro *lista) {
struct tipo_lista_libro *lista_aux = NULL, *lista_aux2 = NULL;
struct tipo_lista_libro libro;
lista_aux = lista;
if (lista != NULL) {
while (lista_aux->sig != NULL) {
lista_aux2 = lista_aux->sig;
while (lista_aux2 != NULL) {
if (strcmp(lista_aux->titulo, lista_aux2->titulo)>0) {
//Copiamos el contenido de lista_aux a una variable temporal
// memcpy(&libro,lista_aux,sizeof(libro));
strcpy(libro.titulo, lista_aux->titulo);
strcpy(libro.autor, lista_aux->autor);
libro.precio = lista_aux->precio;
//Copiamos el contenido de lista_aux2 a lista_aux
strcpy(lista_aux->titulo, lista_aux2->titulo);
strcpy(lista_aux->autor, lista_aux2->autor);
lista_aux->precio = lista_aux2->precio;
//Copiamos en lista_aux2 el contenido de la variable auxiliar
strcpy(lista_aux2->titulo, libro.titulo);
strcpy(lista_aux2->autor, libro.autor);
lista_aux2->precio = libro.precio;
}
lista_aux2 = lista_aux2->sig;
}
lista_aux = lista_aux->sig;
}
}
return lista;
}
//Esta función realiza la tarea de mostrar por pantalla el contenido de una lista de libros.
void imprimir_lista_libros(struct tipo_lista_libro *lista) {
struct tipo_lista_libro *ptr_aux=NULL;
if (lista!=NULL) {
printf("\n LIBROS ORDENADOS POR TITULO ...........\n\n");
ptr_aux = lista;
while (ptr_aux!=NULL) {
printf(" Titulo: %s Autor: %s\n",ptr_aux->titulo, ptr_aux->autor);
ptr_aux = ptr_aux->sig;
}
printf("\n");
}
}