#include <iostream>
#include <string>
using namespace std;
struct nodoLista
{
char dato;
struct nodoLista* ptrSiguiente;
};
typedef struct nodoLista NodoLista;
typedef NodoLista *ptrNodoLista;
void menu();
void insertar(ptrNodoLista *ptrS, char valor);
char eliminar(ptrNodoLista *ptrS, char valor);
int estaVacia(ptrNodoLista ptrS);
void buscar(ptrNodoLista ptrActual, char valor);
void imprimir(ptrNodoLista ptrActual);
int main()
{
ptrNodoLista ptrInicial = NULL; // inicialmente no existen nodos;
char opcion; // elección del usuario
char elemento; // caracter introducido por el usuario
do {
menu();
cin >> opcion;
switch( opcion ){
case '1':
cout << "\nIntroduzca un caracter: ";
cin >> elemento;
insertar(&ptrInicial, elemento);
imprimir(ptrInicial);
break;
case '2':
//! Si la lista no esta vacia
if (!estaVacia(ptrInicial))
{
cout << "\nIntroduzca un caracter para eliminar: ";
cin >> elemento;
//! si encuentra el caracter lo borra
if (eliminar(&ptrInicial, elemento))
{
cout << "\nCaracter " << elemento << " eliminado.\n";
imprimir(ptrInicial);
}
else
{
cout << "\nNo se encuentra el caracter " << elemento;
}
}
else {
cout << "\nLa lista esta vacia." << endl;
}
break;
case '3':
cout << "\nIntroduzca un caracter: ";
cin >> elemento;
buscar(ptrInicial, elemento);
break;
case '4':
cout << "\nFIN DEL PROGRAMA" << endl;
break;
default:
cout << "\nOPCION NO VALIDA" << endl;
break;
}
} while (opcion != '4');
return 0;
}
void menu()
{
cout << "\n MENU"
<< "\n=================="
<< "\n1.- Insertar."
<< "\n2.- Eliminar"
<< "\n3.- Buscar."
<< "\n4.- Salir"
<< "\n=================="
<< "\nOPCION (1-4): ";
}
// Inserta el dato en la lista ordenada
void insertar(ptrNodoLista *ptrS, char valor)
{
ptrNodoLista ptrNuevo;
ptrNodoLista ptrAnterior;
ptrNodoLista ptrActual;
ptrNuevo = new NodoLista;
if( ptrNuevo != NULL ) // si hay espacio disponoble
{
ptrNuevo->dato = valor; // coloca el valor en el nodo
ptrNuevo->ptrSiguiente = NULL; // apunta al nodo actual de la lista
ptrAnterior = NULL;
ptrActual = *ptrS;
// ciclo para localizar la ubicación correcta en la línea
while (ptrActual != NULL && valor > ptrActual->dato)
{
ptrAnterior = ptrActual; // entra al ...
ptrActual = ptrActual->ptrSiguiente; // ... siguiente nodo
}
// Inserta un nuevo nodo al principio de la lista
if (ptrAnterior == NULL)
{
ptrNuevo->ptrSiguiente = *ptrS;
*ptrS = ptrNuevo;
}
else
{ // inserta un nuevo nodo entre ptrAnterior y ptrActual
ptrAnterior->ptrSiguiente = ptrNuevo;
ptrNuevo->ptrSiguiente = ptrActual;
}
}
else
{
cout << "\nNo se inserto " << valor << ". No hay memoria disponible." << endl;
}
}
// Elimina un elemento de la lista
char eliminar(ptrNodoLista *ptrS, char valor)
{
ptrNodoLista ptrAnterior; // apuntador a un nodo previo de la lista
ptrNodoLista ptrActual; // apuntador al nodo actual d ela lista
ptrNodoLista tempPtr; // apuntador a un nodo temporal
if(valor == (*ptrS)->dato)
{
tempPtr = *ptrS; // almacena el nodo a eliminar
*ptrS = ( *ptrS )->ptrSiguiente; // desata el nodo
delete( tempPtr ); // libera el nodo desatado
return valor;
}
else
{
ptrAnterior = *ptrS;
ptrActual = (*ptrS)->ptrSiguiente;
// Ciclo para localizar la ubicación correcta en la lista
while(ptrActual != NULL && ptrActual->dato != valor)
{
ptrAnterior = ptrActual; // entra el ...
ptrActual = ptrActual->ptrSiguiente; // ... siguiente nodo
}
// elimina el nodo de ptrActual
if (ptrActual != NULL)
{
tempPtr = ptrActual;
ptrAnterior->ptrSiguiente = ptrActual->ptrSiguiente;
delete(tempPtr);
return valor;
}
}
return '\0';
}
// Deveuelve 1 si la lista esta vacia. de lo contrario 0
int estaVacia(ptrNodoLista ptrS)
{
return ptrS == NULL;
}
void buscar(ptrNodoLista ptrActual, char valor)
{
int count = 0;
// Si la lista esta vacia
if (ptrActual == NULL)
{
cout << "\nLa lista esta vacia.\n\n";
}
else
{
cout << "\nCaracter buscado: ";
// mientras no sea el final de la lista
while (ptrActual != NULL)
{
if (ptrActual->dato == valor)
{
cout << ptrActual->dato << " -> ";
count++;
}
ptrActual = ptrActual->ptrSiguiente;
}
cout << "\nSe encontro " << count << " coincidencia" << endl;
}
}
// Imprime la lista
void imprimir(ptrNodoLista ptrActual)
{
// Si la lista esta vacia
if (ptrActual == NULL)
{
cout << "\nLa lista esta vacia.\n\n";
}
else
{
cout << "\nLa lista es:\n";
// mientras no sea el final de la lista
while (ptrActual != NULL)
{
cout << ptrActual->dato << " -> ";
ptrActual = ptrActual->ptrSiguiente;
}
cout << "NULL\n\n";
}
}