Está en la página 1de 5

lista.

hpp

typedef struct TElem{


int casilla1;
int casilla2;
TCadena nombre;
};

private:
// Definir tipo nodo
typedef struct TNodo{
TElem elemento;
TNodo *sig;
};
typedef TNodo *TLista;
// Definir atributo de la lista
TLista lista;
int numElem; //Tamaño de la lista

lista.cpp

#include <iostream>
#include "lista.hpp"

using namespace std;

// Implementación del constructor


CListaPos::CListaPos()
{
lista=NULL;
numElem=0;
}

// Implementación del destructor


CListaPos::~CListaPos()
{
TLista aux;

while (lista!=NULL){
aux=lista;
lista=lista->sig;
delete aux;
}
numElem=0;
}

// Comprueba si la lista está vacía


bool CListaPos::ListaVacia()
{
bool vacia=false;

if(lista==NULL){
vacia=true;
}
return vacia;
}

// Comprueba si la lista está llena


bool CListaPos::EstaLlena()
{
return false;
// Siempre devuelve falso por tratarse de memoria dinámica
}
//Elimina un elemento de la lista
void CListaPos::EliminarLista(const int pos, bool &ok)
{
TLista aux1,aux2;
int i;
aux1=lista
ok=false;

if(lista!=NULL){
if(pos==1){
lista=lista->sig;
delete aux1;
numElem=numElem-1;
}else if (pos<=LongitudLista()){
for(i=1; i<(pos-1); i++){
aux1=aux1->sig;
}
aux2=aux1->sig;
aux1->sig=aux2->sig;
delete aux2;
numElem=numElem-1;
}
ok=true;
}
}
//OJO!!! HAY UNA VERSIÓN BOOLEANA QUE DEVUELVE SI SE HA ELIMINADO

// La lista empieza en la posición 1


void CListaPos::InsertarLista(const int pos, const TElem elem)
{
TLista aux,nuevo;
int i;

nuevo=new TNodo;
nuevo->elemento=elem;
nuevo->sig=NULL;

if(lista==NULL){ //Es lo mismo que if(ListaVacia()) CASO 1: Crea lista con nuevo nodo
lista=nuevo;
numElem=numElem+1;
}else if(pos==1){ //CASO 2: Inserta en la 1ª posición
nuevo->sig=lista;
lista=nuevo;
numElem=numElem+1;
}else if(pos<=LongitudLista()){ // CASO 3: Inserta en una posición de la lista
aux=lista;
for(i=1; i<(pos-1); i++){
aux=aux->sig;
}
nuevo->sig=aux->sig;
aux->sig=nuevo;
numElem=numElem+1;
}else{ //CASO 4: Inserta al final de la lista
aux=lista;
for(i=1; i<LongitudLista(); i++){
aux=aux->sig;
}
aux->sig=nuevo;
numElem=numElem+1;
}
}
//OJO!!! HAY UNA VERSIÓN BOOLEANA QUE DEVUELVE SI SE HA INSERTADO
// Devuelve el elemento del indice pos y ok=falso si no existia
CListaPos::TElem CListaPos::VerElem(const int pos, bool &ok)
{
TLista aux;
CListapos::TElem elem;
int i=1;
ok=false;

if(lista!=NULL){
if(pos==1){
elem=lista->elemento;
}else if(pos<=Longitud()){
aux=lista;
for(i=1;i<pos;i++){
aux=aux->sig;
}
elem=aux->elemento;
}
ok=true;
return datos;
}

//Devuelve la longitud de la lista


int CListaPos::LongitudLista()
{
return numElem;
}

//Lee los datos de un fichero de texto


typedef struct TEstruct{ //Estructura del main
ClistaPos listado;
};
void LeerFicheros(TEstruct &t) {

fstream fichin;
char car;
CListaPos::TElem elem;
int i=1;

fichin.open("ficheroentrada.dat", ios::in);
if(!fichin.is_open()){
cout << "Error al abrir el archivo" << endl;
}else{
fichin>>elem.casilla1; //Elemento 1
while(!fichin.eof()){
fichin.get(car); //Lee espacio en blanco
fichin>>elem.casilla2; //Elemento 2
fichin.get(car); //Lee espacio en blanco
fichin>>elem.nombre; //Elemento 3
t.listado.Insertar(i,elem); //Inserta en la lista
i++; //Incrementa la posición del cursor del fichero
fichin>>elem.casilla1; //De Nuevo se pone el primer elemento
}
}
fichin.close();
}
//Lee los datos de un fichero de texto
typedef struct TEstruct{ //Estructura del main
ClistaPos listado;
int numElemList;
};
void EscribirFicheros(TEstruct &t) {

CListaPos::TElem elem;
int i;
bool ok;
fstream fichout ("ficherosalida.dat", ios::out);

fichin.open("ficherosalida.dat", ios::out);
if(!fichout){
cout << "Error al escribir el archivo" << endl;
}else{
for(i=1;i<=t.listado.Longitud();i++){
elem=t.listado.VerElem(i,ok);
fichout<<elem.casilla1<<” “<<elem.casilla2<<” “<<elem.nombre<<endl;
}
}
fichout.close();
}

// Debe leer el fichero binario hotel.hex cuyo formato es el que se indica en el


// procedimiento EscribirFichero
void LeerFichero(CListaPos &hotel) {
int i=0, j , longlista;
CListaPos::TElem elem;

fstream fichin;
fichin.open("hotel.hex", ios::in|ios::binary);

if (fichin.bad() || fichin.fail()){
cout<<"Error en la lectura del fichero"<<endl;
}else{
fichin>>longlista; //sirve para luego determiner la longitude del fichero

while(!fichin.eof() && i<longlista){


fichin.read((char*)&elem.nombre, sizeof(CListaPos::TCadena));
fichin.read((char*)&elem.apellidos, sizeof(CListaPos::TCadena));
fichin.read((char*)&elem.DNI, sizeof(CListaPos::TCadena));
fichin.read((char*)&elem.numfacturas, sizeof(int));

system("pause");

for (j=0;j<=longlista;j++){
fichin.read((char*)&elem.facturas[j].concepto, sizeof(CListaPos::TCadena));
fichin.read((char*)&elem.facturas[j].precio, sizeof(int));
}
hotel.InsertarLista(i+1,elem);
i++;
}
}
fichin.close();
}
// Debe escribir la informacion del hotel en un fichero BINARIO con la estructura
siguiente
// 1 entero que indica el numero de clientes
// seguido de los datos de los clientes guardados registro a registro

void EscribirFichero(CListaPos &hotel) {


CListaPos::TElem elem;
int i, j;
bool ok;

//inicio
fstream fich;
fich.open("hotel.hex", ios::out|ios::binary);

if (fich.bad() ||fich.fail()){
cout<<"Error al abrir el fichero"<<endl;
}else {
fich<<hotel.Longitud();

for (i=1;i<=hotel.Longitud();i++){
elem=hotel.VerElem(i,ok);

fich.write((char*)&elem.nombre, sizeof(CListaPos::TCadena));
fich.write((char*)&elem.apellidos, sizeof(CListaPos::TCadena));
fich.write((char*)&elem.DNI, sizeof(CListaPos::TCadena));
fich.write((char*)&elem.numfacturas, sizeof(int));

for(j=0; j<=CListaPos::MAXFACTURAS;j++){

fich.write((char*)&elem.facturas[j].concepto,sizeof(CListaPos::TCadena));
fich.write((char*)&elem.facturas[j].precio,sizeof(int));

}
}
}
fich.close();