/*
*
* Analizar los elementos en la lista por:
*
* ------>precio ( los 5 libors mas caros, mlas baratos, imprimir del libro mas caro al mas barato) ---> Casi completada
* ------>fecha de publicacion (el libro mas viejo, lista del libro mas "joven" al mas viejo) ---> como ordenar strings?
* ------>Libros por autor (lista ordenado por autor, y libro) --> como ordenar strings?
*
*
* Created on 9 de junio de 2014, 18:11
* Como puedo ordenar los strings de fechas? ... y tambien que esta mal en mi
* mostrarLista. PD. Estoy trabajando con PUGIXML para leer xml.
* pero hacer enfasis sobre todo en estas 2 funciones.
*/
// LIBRERIAS.
#include <iostream>
#include <string>
#include "pugixml.hpp"
#include "pugixml.cpp"
// ESPACIO DE NOMBRES.
using namespace std;
#define ASCENDENTE 1
#define DESCENDENTE 0
// ESTRUCTURAS.
struct datos {
string id; //id
string autor; //author
string titulo; //tittle
string genero; //genre
float precio; //price
string fechaPublic; //public date
string descripcion; //descrip
int number;
};
//struct c_date {
// int USA;
// int UK;
// int EU;
// int Norway;
//};
struct node {
datos data;
datos dataMoment;
node *left;
node *right;
};
// PROTOTIPOS.
// Función para crear una lista.
node *newList();
// Función para insertar en una lista por la derecha.
node *insertRight(node *list, node data);
// Función para imprimir un nodo en la lista.
void printNode(node *current);
// Función para imprimir la lista.
void printList(node *current);
// Función para retornar el tamaño de la lista.
int size(node * list);
node *analisisFecha(node *head);
// Función para leer el archivo XML.
void read(node *list);
node *Insertar(node *list, node data);
void ordenarLista(node *lista);
// Función para determinar libros mas caros y mas baratos
//void country(node *head);
node *LibrosCaros(node *head);
node *LibrosBaratos(node *head);
//void analisisFecha(node *head);
void MostrarLista(node *head, int orden);
// FUNCIÓN PRINCIPAL.
int main() {
node *head = newList();
node *current = head;
cout << "Lista\n";
read(head);
cout << "----------------------------------" << endl;
printList(head);
// MostrarLista(head,ASCENDENTE);
cout << endl << "TAMAÑO DE LISTA TOTAL: " << size(head) << endl << endl << endl;
cout << "______________________________________________________" << endl;
cout<<"LIBROS BARATOS:"<<endl<<endl;
LibrosBaratos(head);
//printList(LibrosCaros(head)); //Imprimir lista de libros BARATOS detalladamente
cout << "______________________________________________________" << endl;
cout<<"LIBROS CAROS:"<<endl<<endl;
LibrosCaros(head);
//printList(LibrosCaros(head)); //Imprimir lista de libros CAROS detalladamente
analisisFecha(head);
return 0;
}
// DESARROLLO DE LOS PROTOTIPOS.
node *newList() {
node *element = new node;
element->data.precio = -1;
element->right = element;
element->left = element;
return element;
}
node *insertRight(node *list, node data) {
node *element = new node;
element->data = data.data;
element->left = list;
element->right = list->right;
list->right = element;
element->right->left = element;
return element;
}
void printNode(node *current) {
int number = 1;
cout << "[" << current->data.number << "]" << endl << endl;
cout << "Book ID : " << current->data.id << endl;
cout << "Autor : " << current->data.autor << endl;
cout << "Titulo: " << current->data.titulo << endl;
cout << "Genero: " << current->data.genero << endl;
cout << "Precio : " << current->data.precio << endl;
cout << "Fecha de Publicacion : " << current->data.fechaPublic << endl;
cout << "Descripcion : " << current->data.descripcion << endl;
cout << "----------------------------------" << endl;
number++;
}
void printList(node *head) {
node *current = head;
while (head != current->left) {
current = current->left;
printNode(current);
}
cout << endl;
}
int size(node * list) {
node *head = list;
node *current = list;
int cont = 0;
while (head != (current = current->right)) {
cont = cont + 1;
}
return cont;
}
void read(node *list) {
node date;
string moment;
pugi::xml_document book;
book.load_file("books.xml");
pugi::xml_node catalog = book.first_child().first_child();
int n = 1;
do {
date.data.id = catalog.attribute("id").as_string();
date.data.autor = catalog.child("author").text().get();
date.data.titulo = catalog.child("title").text().get();
date.data.genero = catalog.child("genre").text().get();
//convirtiendo precio
moment = catalog.child("price").text().get();
date.data.precio = atof(moment.c_str());
date.data.fechaPublic= catalog.child("publish_date").text().get();
date.data.number = n;
date.data.descripcion = catalog.child("description").text().get();
insertRight(list, date);
n++;
}
while(catalog = catalog.next_sibling());
}
node *LibrosCaros(node *head){
node *current =head;
node *librosCaros= newList(); //Creando lista libros caros para realizar el analisis
node data;
while (head != (current=current->right)){
if (current->data.precio>15){
data.data=current->data;
cout<<current->data.titulo<<"-->"<<current->data.precio<<endl;
insertRight(librosCaros, data); //Insertando en una segunda lista de libros caros, ojo si imprimo lista se imprimen todos los detalles de cada librp
}
}
return librosCaros;
}
node *LibrosBaratos(node *head){
node *current =head;
node *librosBaratos= newList(); //Creando lista libros caros para realizar el analisis
node data;
while (head != (current=current->right)){
if (current->data.precio<15){
data.data=current->data;
cout<<current->data.titulo<<"-->"<<current->data.precio<<endl;
insertRight(librosBaratos, data); //Insertando en una segunda lista de libros caros
}
}
return librosBaratos;
}
//ANALIZAR FECHAS Y ORDENAR PERO TAMPOCO TRABAJA CORRECTAMENTE
node *analisisFecha(node *head){
node *current =head;
node *list3= newList(); //Creando lista 2 para realizar el analisis
node data;
string date = "2014-06-12";
int temp;
cout<<"_______________________________"<<endl<<endl;
while (head != (current=current->right)){
//if (current->data.fechaPublic<date)
// cout<<current->data.number<<"--->"<<current->data.fechaPublic<<endl;
}
}
//FUNCION NO TRABAJA CORRECTAMENTE ...
void MostrarLista(node *head, int orden) {
if(!head) cout<<"Lista Vacia";
node *current = head;
if(orden == ASCENDENTE) {
while(current->left ) current = current->right;
cout<<"Orden ascendente: "<<endl;
while(current) {
cout<<current->data.precio<<endl;
current = current->right;
}
}
else {
while(current->right) current = current->right;
cout<<"Orden descendente: "<<endl;
while(current) {
cout<<current->data.precio<<endl;
current = current->left;
}
}
cout<<endl;
}
*
* Analizar los elementos en la lista por:
*
* ------>precio ( los 5 libors mas caros, mlas baratos, imprimir del libro mas caro al mas barato) ---> Casi completada
* ------>fecha de publicacion (el libro mas viejo, lista del libro mas "joven" al mas viejo) ---> como ordenar strings?
* ------>Libros por autor (lista ordenado por autor, y libro) --> como ordenar strings?
*
*
* Created on 9 de junio de 2014, 18:11
* Como puedo ordenar los strings de fechas? ... y tambien que esta mal en mi
* mostrarLista. PD. Estoy trabajando con PUGIXML para leer xml.
* pero hacer enfasis sobre todo en estas 2 funciones.
*/
// LIBRERIAS.
#include <iostream>
#include <string>
#include "pugixml.hpp"
#include "pugixml.cpp"
// ESPACIO DE NOMBRES.
using namespace std;
#define ASCENDENTE 1
#define DESCENDENTE 0
// ESTRUCTURAS.
struct datos {
string id; //id
string autor; //author
string titulo; //tittle
string genero; //genre
float precio; //price
string fechaPublic; //public date
string descripcion; //descrip
int number;
};
//struct c_date {
// int USA;
// int UK;
// int EU;
// int Norway;
//};
struct node {
datos data;
datos dataMoment;
node *left;
node *right;
};
// PROTOTIPOS.
// Función para crear una lista.
node *newList();
// Función para insertar en una lista por la derecha.
node *insertRight(node *list, node data);
// Función para imprimir un nodo en la lista.
void printNode(node *current);
// Función para imprimir la lista.
void printList(node *current);
// Función para retornar el tamaño de la lista.
int size(node * list);
node *analisisFecha(node *head);
// Función para leer el archivo XML.
void read(node *list);
node *Insertar(node *list, node data);
void ordenarLista(node *lista);
// Función para determinar libros mas caros y mas baratos
//void country(node *head);
node *LibrosCaros(node *head);
node *LibrosBaratos(node *head);
//void analisisFecha(node *head);
void MostrarLista(node *head, int orden);
// FUNCIÓN PRINCIPAL.
int main() {
node *head = newList();
node *current = head;
cout << "Lista\n";
read(head);
cout << "----------------------------------" << endl;
printList(head);
// MostrarLista(head,ASCENDENTE);
cout << endl << "TAMAÑO DE LISTA TOTAL: " << size(head) << endl << endl << endl;
cout << "______________________________________________________" << endl;
cout<<"LIBROS BARATOS:"<<endl<<endl;
LibrosBaratos(head);
//printList(LibrosCaros(head)); //Imprimir lista de libros BARATOS detalladamente
cout << "______________________________________________________" << endl;
cout<<"LIBROS CAROS:"<<endl<<endl;
LibrosCaros(head);
//printList(LibrosCaros(head)); //Imprimir lista de libros CAROS detalladamente
analisisFecha(head);
return 0;
}
// DESARROLLO DE LOS PROTOTIPOS.
node *newList() {
node *element = new node;
element->data.precio = -1;
element->right = element;
element->left = element;
return element;
}
node *insertRight(node *list, node data) {
node *element = new node;
element->data = data.data;
element->left = list;
element->right = list->right;
list->right = element;
element->right->left = element;
return element;
}
void printNode(node *current) {
int number = 1;
cout << "[" << current->data.number << "]" << endl << endl;
cout << "Book ID : " << current->data.id << endl;
cout << "Autor : " << current->data.autor << endl;
cout << "Titulo: " << current->data.titulo << endl;
cout << "Genero: " << current->data.genero << endl;
cout << "Precio : " << current->data.precio << endl;
cout << "Fecha de Publicacion : " << current->data.fechaPublic << endl;
cout << "Descripcion : " << current->data.descripcion << endl;
cout << "----------------------------------" << endl;
number++;
}
void printList(node *head) {
node *current = head;
while (head != current->left) {
current = current->left;
printNode(current);
}
cout << endl;
}
int size(node * list) {
node *head = list;
node *current = list;
int cont = 0;
while (head != (current = current->right)) {
cont = cont + 1;
}
return cont;
}
void read(node *list) {
node date;
string moment;
pugi::xml_document book;
book.load_file("books.xml");
pugi::xml_node catalog = book.first_child().first_child();
int n = 1;
do {
date.data.id = catalog.attribute("id").as_string();
date.data.autor = catalog.child("author").text().get();
date.data.titulo = catalog.child("title").text().get();
date.data.genero = catalog.child("genre").text().get();
//convirtiendo precio
moment = catalog.child("price").text().get();
date.data.precio = atof(moment.c_str());
date.data.fechaPublic= catalog.child("publish_date").text().get();
date.data.number = n;
date.data.descripcion = catalog.child("description").text().get();
insertRight(list, date);
n++;
}
while(catalog = catalog.next_sibling());
}
node *LibrosCaros(node *head){
node *current =head;
node *librosCaros= newList(); //Creando lista libros caros para realizar el analisis
node data;
while (head != (current=current->right)){
if (current->data.precio>15){
data.data=current->data;
cout<<current->data.titulo<<"-->"<<current->data.precio<<endl;
insertRight(librosCaros, data); //Insertando en una segunda lista de libros caros, ojo si imprimo lista se imprimen todos los detalles de cada librp
}
}
return librosCaros;
}
node *LibrosBaratos(node *head){
node *current =head;
node *librosBaratos= newList(); //Creando lista libros caros para realizar el analisis
node data;
while (head != (current=current->right)){
if (current->data.precio<15){
data.data=current->data;
cout<<current->data.titulo<<"-->"<<current->data.precio<<endl;
insertRight(librosBaratos, data); //Insertando en una segunda lista de libros caros
}
}
return librosBaratos;
}
//ANALIZAR FECHAS Y ORDENAR PERO TAMPOCO TRABAJA CORRECTAMENTE
node *analisisFecha(node *head){
node *current =head;
node *list3= newList(); //Creando lista 2 para realizar el analisis
node data;
string date = "2014-06-12";
int temp;
cout<<"_______________________________"<<endl<<endl;
while (head != (current=current->right)){
//if (current->data.fechaPublic<date)
// cout<<current->data.number<<"--->"<<current->data.fechaPublic<<endl;
}
}
//FUNCION NO TRABAJA CORRECTAMENTE ...
void MostrarLista(node *head, int orden) {
if(!head) cout<<"Lista Vacia";
node *current = head;
if(orden == ASCENDENTE) {
while(current->left ) current = current->right;
cout<<"Orden ascendente: "<<endl;
while(current) {
cout<<current->data.precio<<endl;
current = current->right;
}
}
else {
while(current->right) current = current->right;
cout<<"Orden descendente: "<<endl;
while(current) {
cout<<current->data.precio<<endl;
current = current->left;
}
}
cout<<endl;
}