Вы находитесь на странице: 1из 6

#if !

defined(_LISTAS_SIMPLES)
#define _LISTAS_SIMPLES

#include <stdio.h>

typedef int tipo;

struct nodo {
tipo informacion;
nodo *siguiente;
};

struct listaSimple{
nodo *cabeza;
nodo *final;
};

/*
Nombre: esVacia (listaSimple *l)
Descripcion: Funcion que retorna TRUE cuando la lista "l"
esta vacia, o FALSE en otro caso
*/
bool esVacia (listaSimple *l){

if (l==NULL) // Si no se ha creado la lista


return true;

if (l->cabeza==NULL) // Existe la lista pero no tiene nodos


return true;

return false;
}

/*
Nombre: inicializarLista():
Descripcion: Funcion que permite reservar memoria para una nueva
listaSimple, y establece los punteros cabeza y final el NULL
retorna un NULL en caso de error
*/
listaSimple* inicializarLista() {

listaSimple *l= new listaSimple();


if (l==NULL)
return NULL;

l->cabeza=NULL;
l->final=NULL;

return l;
};

/*
Nombre: insertarPrincipio()
Descripcion: Funcion que permite insertar el "dato" en la lista "L"
al principio de la misma. Retorna TRUE si lo logra o FALSE
en otro caso
*/
bool insertarPrincipio(listaSimple *L, tipo dato){

if (L==NULL)
return false;

nodo *temp= new nodo();


if (temp==NULL)
return false;

temp->informacion=dato;
temp->siguiente = L->cabeza;
L->cabeza=temp;

if (L->final==NULL)
L->final=temp;
return true;
}

/*
Nombre: insertarFinal(listaSimple *L, tipo dato)
Descripcion: Funcion que permite insertar el "dato" en la lista "L"
al final. Retorna TRUE si lo logra o FALSE en otro caso
*/
bool insertarFinal(listaSimple *L, tipo dato){

if (L==NULL)
return false;

nodo *temp= new nodo();


if (temp==NULL)
return false;

temp->informacion=dato;
temp->siguiente = NULL;
if (L->final==NULL)
L->final=temp;
else {
L->final->siguiente=temp;
L->final=temp;
}

if (L->cabeza==NULL)
L->cabeza=temp;

return true;

/*
Nombre: insertarAntesDe(listaSimple *L, tipo dato, nodo *nodox)
Descripcion: Funcion que permite insertar el "dato" en la lista "L"
antes de "nodox"
*/
bool insertarAntesDe(listaSimple *L, tipo dato, nodo *nodox){

if (L==NULL)
return false;
if (nodox==NULL)
return false;

if (nodox==L->cabeza)
return insertarPrincipio (L,dato);

if (nodox==L->final)
return insertarFinal(L,dato);

nodo *temp= new nodo();


if (temp==NULL)
return false;

temp->informacion=dato;
nodo *aux= L->cabeza;
while (aux->siguiente!=nodox)
aux=aux->siguiente;

if (aux==NULL)
return false;

temp->siguiente= aux->siguiente;
aux->siguiente=temp;

return true;
}

/*
Nombre: insertarDespuesDe(listaSimple *L, tipo dato, nodo *nodox)
Descripcion: Funcion que permite insertar el "dato" en la lista "L"
despues de "nodox"
*/
bool insertarDespuesDe(listaSimple *L, tipo dato, nodo *nodox){

if (L==NULL)
return false;

if (nodox==NULL)
return false;

if (nodox==L->cabeza)
return insertarPrincipio (L,dato);

if (nodox==L->final)
return insertarFinal(L,dato);

nodo *temp= new nodo();


if (temp==NULL)
return false;

temp->informacion=dato;

temp->siguiente=nodox->siguiente;
nodox->siguiente=temp;

return true;
}

/*
Nombre: BuscarDato(listaSimple *l, tipo dato)
Descripcion: Funcion que retorna el nodo donde se cuenta el
"dato"
*/
nodo* BuscarDato(listaSimple *l, tipo dato){

if (l==NULL) // Si no se ha creado la lista


return NULL;

if (esVacia(l))
return NULL;

nodo *aux= l->cabeza;


while (aux->siguiente!=NULL){
if (aux->informacion==dato)
return aux;
aux=aux->siguiente;
}
return NULL;
}

/*
Nombre: cantNodos(listaSimple *l)
Descripcion: Funcion que retorna la cantidad de nodos que posee la lista
*/
int cantNodos(listaSimple *l){

if (l==NULL) // Si no se ha creado la lista


return 0;

if (l->cabeza==NULL) // Existe la lista pero no tiene nodos


return 0;

// Recorriendo la lista y contando sus nodos


int contar=1;
nodo *aux= l->cabeza;
while (aux->siguiente!=NULL){
contar++;
aux=aux->siguiente;
}
return contar;
}

/*
Nombre: eliminarPrincipio(listaSimple *l)
Descripcion: Funcion Elimina un nodo al principio de la lista
*/
bool eliminarPrincipio(listaSimple *l){

if (l==NULL) // Si no se ha creado la lista


return false;

if (esVacia(l))
return false;

nodo *aux=l->cabeza;
l->cabeza=aux->siguiente;

// Si la lista quedo VACIA


if (l->cabeza==NULL)
l->final=NULL;

delete aux;
return true;
}

/*
Nombre: eliminarFinal(listaSimple *l)
Descripcion: Funcion Elimina un nodo al final de la lista
*/
bool eliminarFinal(listaSimple *l){

if (l==NULL) // Si no se ha creado la lista


return false;

if (esVacia(l))
return false;
// Si hay un solo nodo en la lista
if (l->cabeza==l->final){
delete l->final;
l->cabeza=NULL;
l->final=NULL;
return true;
}

nodo *aux=l->cabeza;
while (aux->siguiente!=l->final)
aux=aux->siguiente;

delete l->final;

aux->siguiente=NULL;
l->final=aux;
return true;
}

/*
Nombre: eliminarAntesDe(listaDoble *l, nodo *nodox)
Descripcion: Funcion que permite eliminar el nodo en la lista "l" antes de
"nodox"
*/
bool eliminarAntesDe(listaDoble *l, nodo *nodox){
if(l==NULL)
return false;

if(nodox==NULL)
return false;

if(nodox==l->cabeza)
return false;
if(nodox==l->cabeza->siguiente)
return eliminarPrincipio(l);

nodo *aux=l->cabeza;
while(aux->siguiente->siguiente!=nodox)
aux=aux->siguiente;

delete aux->siguiente;
aux->siguiente=nodox;
return true;
}

/*
Nombre: eliminarDespuesDe(listaDoble *l, nodo *nodox)
Descripcion: Funcion que permite eliminar el nodo en la lista "l" despues de
"nodox"
*/
bool eliminarDespuesDe(listaDoble *l, nodo *nodox){
if(l==NULL)
return false;

if(nodox==NULL)
return false;

if(nodox==l->final)
return false;

if(nodox->siguiente==l->final)
return eliminarFinal(l);

nodo *aux=nodox->siguiente;
nodox->siguiente=aux->siguiente;
delete aux;
return true;
}

bool eliminarLista(listaSimple *l){

if (l==NULL) // Si no se ha creado la lista


return false;

if (esVacia(l))
return false;

while (!esVacia(l))
eliminarFinal(l);

delete l;

return true;
}
#endif

Вам также может понравиться