Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <cstdlib>
- using namespace std;
- struct numero{
- int dato; //valor del numero
- numero *sig; //nodo al q apunta
- };
- typedef struct numero Numero;
- int cantidad = 0;
- //Es doble asterisco (puntero a puntero), ya que pasamos la lista por referencia ya que tambien es un puntero
- void ingresarNumero(Numero **); //puntero q recorrerá para insetar valor
- void ingresarNumeroInicio(Numero **);
- void ingresarNumeroPosicion(Numero **);
- void modificarDato(Numero **);
- void mostrarNumeros(Numero *); //mostrar valores
- void eliminarNumero(Numero **); //eliminar valor segun posición
- void borrarLista(Numero **);
- int main()
- {
- int opcion = 6;
- Numero *lista = NULL; //primer elemento de la lista vacia
- do{
- system("CLS");
- cout << "1.- Ingresar Dato al Final." << endl; cout << "2.- Ingresar Dato al Inicio." << endl;
- cout << "3.- Ingresar Dato en Posicion." << endl; cout << "4.- Modificar Datos." << endl; cout << "5.- Mostrar Datos." << endl;
- cout << "6.- Eliminar Dato." << endl; cout << "7.- Eliminar Lista." << endl; cout << "8.- Salir." << endl; cout << "--> ";
- cin >> opcion; cout << endl;
- switch(opcion){
- case 1: ingresarNumero(&lista); break;
- case 2: ingresarNumeroInicio(&lista); break;
- case 3: ingresarNumeroPosicion(&lista); break;
- case 4: modificarDato(&lista); break;
- case 5: mostrarNumeros(lista); break;
- case 6: eliminarNumero(&lista); break;
- case 7: borrarLista(&lista); break;
- }
- system("pause");
- }while(opcion!=8);
- cout << endl << "Nos vemos!" << endl;
- return 0;
- }
- void ingresarNumero(Numero **primerNumero){
- Numero *nuevoNumero = new Numero; //reservamos memoria
- int nuevoDato; //el dato
- mostrarNumeros(*primerNumero);
- if (nuevoNumero == NULL){cout << "\n\nNo se pudo reservar Memoria. " << endl;}
- else{
- cout << "\n\nSi se pudo reservar memoria. Direccion: " << nuevoNumero << endl << endl;
- cout << "Ingrese nuevo numero: "; cin >> nuevoDato;
- nuevoNumero->dato = nuevoDato; //Le asignamos el nuevo dato.
- nuevoNumero->sig = NULL; //el siguiente es nulo
- //Si la lista esta vacia:
- if (*primerNumero == NULL) {*primerNumero = nuevoNumero; cantidad++;}
- else{
- //si no esta vacia
- Numero *ptr = *primerNumero;
- while(ptr->sig != NULL) ptr = ptr->sig; // avanza al siguiente nodo
- // el nodo encontrado es no vacio pero el siguiente es nulo.
- ptr->sig = nuevoNumero; //el nodo sgte nulo toma la direccion de nuevo numero
- cantidad++; //aumenta uno en cantidad
- }
- mostrarNumeros(*primerNumero);
- }
- }
- void ingresarNumeroInicio(Numero **primerNumero){
- Numero *nuevoNumero = new Numero; //reservamos memoria
- int nuevoDato; //el dato
- mostrarNumeros(*primerNumero);
- if (nuevoNumero == NULL){cout << "\n\nNo se pudo reservar Memoria. " << endl;}
- else{
- cout << "\n\nSi se pudo reservar memoria. Direccion: " << nuevoNumero << endl << endl;
- cout << "Ingrese nuevo numero: "; cin >> nuevoDato;
- nuevoNumero->dato = nuevoDato; //Le asignamos el nuevo dato.
- //Si la lista esta vacia:
- if (*primerNumero == NULL) {nuevoNumero->sig = NULL; *primerNumero = nuevoNumero; cantidad++;}
- else{
- //si no esta vacia
- nuevoNumero->sig = *primerNumero; //el siguiente nodo del nuevo numero sera el primer nodo
- *primerNumero = nuevoNumero; //El primer nodo sera nuevo Numero
- cantidad++; //aumenta uno en cantidad
- }
- mostrarNumeros(*primerNumero);
- }
- }
- void ingresarNumeroPosicion(Numero **primerNumero){
- Numero *nuevoNumero = new Numero; //reservamos memoria
- int nuevoDato; //el dato
- mostrarNumeros(*primerNumero);
- if (nuevoNumero == NULL){cout << "\n\nNo se pudo reservar Memoria. " << endl;}
- else{
- int posicion = 1;
- cout << "\n\nSi se pudo reservar memoria. Direccion: " << nuevoNumero << endl << endl;
- cout << "Ingrese Posicion: "; cin >> posicion;
- cout << "Ingrese nuevo numero: "; cin >> nuevoDato;
- nuevoNumero->dato = nuevoDato; //Le asignamos el nuevo dato.
- nuevoNumero->sig = NULL;
- //Si esta fuera del rango
- if (posicion <= 1 || posicion >= cantidad) {cout << "\n\aPosicion Erronea\n\n"; return;}
- Numero *auxiliar, *anterior, *siguiente;
- auxiliar = *primerNumero;
- int contador = 1;
- //mientras contador sea distinto a la posicion anterior
- while(contador != (posicion-1)) {auxiliar = auxiliar->sig; contador++;} //avanza un nodo
- //Ya que tenemos el nodo anterior de la posicion donde se añade
- anterior = auxiliar; //anterior sera el nodo anterior
- siguiente = auxiliar->sig; //siguiente sera el nodo siguiente
- anterior->sig = nuevoNumero; //El nodo que le sigue al anterior sera nuevo numero
- nuevoNumero->sig = siguiente; //El nodo que sigue de nuevo numero sera el siguiente
- cantidad++; //aumenta uno en cantidad
- mostrarNumeros(*primerNumero);
- }
- }
- void modificarDato(Numero **primerNumero){
- int nuevoDato; //el dato
- int posicion = 1;
- mostrarNumeros(*primerNumero);
- cout << "Ingrese Posicion: "; cin >> posicion;
- cout << "Ingrese nuevo numero: "; cin >> nuevoDato;
- //Si esta fuera del rango
- if (posicion < 1 || posicion > cantidad) {cout << "\n\aPosicion Erronea\n\n"; return;}
- Numero *auxiliar;
- auxiliar = *primerNumero;
- int contador = 1;
- //mientras contador sea distinto a la posicion
- while(contador != posicion) {auxiliar = auxiliar->sig; contador++;} //avanza un nodo
- //Una vez encontrado el nodo de la posicion indicada
- auxiliar->dato = nuevoDato; //cambiamos el valor
- mostrarNumeros(*primerNumero);
- }
- void mostrarNumeros(Numero *ptr){
- if (ptr == NULL) cout << "\nLa Lista esta Vacia." << endl << endl;
- else {
- cout << endl << endl;
- while(ptr!=NULL){
- //mientras el nodo no sea nulo muestra el dato del nodo actual.
- cout << ptr->dato << " ";
- ptr = ptr->sig; // avanza al sgte nodo
- }
- cout << endl << endl;
- }
- }
- void eliminarNumero(Numero **primerNumero){
- mostrarNumeros(*primerNumero);
- cout << "cantidad: " << cantidad << endl << endl;
- int posicion;
- cout << "Ingrese posicion a borrar: "; cin >> posicion;
- if (posicion < 1 || posicion > cantidad) {cout << "\n\aPosicion Erronea\n\n"; return;}
- else{
- Numero *aBorrar, *anterior, *siguiente; //nodo a borrar, nodo anterior y nodo siguiente
- aBorrar = *primerNumero; //le asignamos el primer nodo
- //Si es el primer nodo (posicion = 1)
- if (posicion == 1){
- *primerNumero = (*primerNumero)->sig; //el primer nodo ahora será el sgte
- delete (aBorrar); //borramos el nodo
- }
- //si es el último nodo
- else if (posicion == cantidad){
- // si el nodo siguiente que le sigue no es nulo, significa q no es el penultimo y avanza un nodo
- while((aBorrar->sig)->sig!=NULL) aBorrar = aBorrar->sig;
- //Ahora q aBorrar es el penultimo nodo
- anterior = aBorrar; //le asignamos el penultimo nodo
- aBorrar = aBorrar->sig; //aBorrar sera el ultimo nodo
- anterior->sig = NULL; //dejamos nulo el nodo q sigue del penultimo nodo
- delete (aBorrar); //borramos el ultimo nodo
- }
- //Pero si está en medio:
- else{
- int contador = 1;
- //Mientras contador sea distinto a la posición anterior del nodo a borrar
- while(contador != (posicion-1)){
- aBorrar = aBorrar->sig; //avanza un nodo
- contador ++; //Avanza uno en contador
- }
- //Ahora q aBorrar es el nodo anterior al que hay que borrar
- anterior = aBorrar; //anterior es el nodo anterior.
- aBorrar = aBorrar->sig; //aBorrar sera el nodo a Borrar
- siguiente = aBorrar->sig; //siguiente sera el nodo siguiente del que hay que borrar
- anterior->sig = siguiente; //El nodo que sigue del anterior ahora sera siguiente
- delete (aBorrar); //borramos el nodo en la posicion indicada
- }
- cantidad--; //pierde 1 en cantidad
- mostrarNumeros(*primerNumero);
- }
- }
- void borrarLista(Numero **primerNumero){
- Numero *auxiliar, *aBorrar;
- auxiliar = *primerNumero;
- mostrarNumeros(*primerNumero);
- //Si la lista no esta vacia
- while(*primerNumero !=NULL){
- aBorrar = auxiliar; //aBorrar sera el nodo a borrar
- auxiliar = auxiliar->sig; //avanzamos un nodo
- *primerNumero = auxiliar; //el primer nodo sera el siguiente
- delete (aBorrar); //Borramos el nodo
- }
- cout << "\n\aLista Borrada.\n";
- mostrarNumeros(*primerNumero);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement