Advertisement
davidcastrosalinas

EDD 20200925 LLS Insercción y eliminación de Nodos.

Sep 25th, 2020
157
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 9.32 KB | None | 0 0
  1. #include <iostream>
  2.  
  3. /**
  4. ¿qué haremos hoy?
  5. - Revisaremos:
  6.     - retornar la cantidad de nodos que tiene una lista
  7.     - retornar la suma de los nodos
  8.   resumen: profesor
  9. - Tarea: mostrar sólo los elementos impares
  10.  
  11.  
  12.  
  13. - función insertarAlInicio (esta es la forma fácil)
  14. - función insertarAlFinal (tenemos que recorrer hasta el nodo final)
  15. - Eliminar el primer nodo (fácil)
  16. - Eliminar el último nodo
  17. - Eliminar nodo X
  18.  
  19. --Ejercicios: Crear función mayorElemento de la lista
  20. --Contar si el primer dígito es igual a K
  21. --retornar el mayor elemento
  22. --retornar el menor elemento INT_MAX
  23. **/
  24. using namespace std;
  25.  
  26. //como construir un nodo
  27. struct Nodo {
  28.     int info;
  29.     struct Nodo *link;
  30. };
  31. //Lista es un tipo de variable de tipo puntero
  32. typedef Nodo *Lista;
  33.  
  34. //función que muestra una lista
  35. void mostrarLista(Lista aux){
  36.     cout <<"Mostrando lista"<<endl;
  37.     while(aux != NULL) {
  38.         cout << "valor: "<< aux->info<<endl;
  39.         aux = aux->link;
  40.     }
  41. }
  42.  
  43. int cantidadNodos(Lista aux){
  44.     int cantidad = 0;
  45.     while(aux != NULL) {
  46.         cantidad ++;
  47.         aux = aux->link;
  48.     }
  49.     return cantidad;
  50. }
  51.  
  52. int sumarNodos(Lista aux){
  53.     int suma = 0;
  54.     while(aux != NULL) {
  55.         suma += aux->info;
  56.         aux = aux->link;
  57.     }
  58.     return suma;
  59. }
  60.  
  61. void mostrarImpares(Lista aux){
  62.     cout <<"Mostrando Impares"<<endl;
  63.     while(aux != NULL) {
  64.         if(aux->info % 2 == 1)
  65.             cout << "valor: "<< aux->info<<endl;
  66.         aux = aux->link;
  67.     }
  68. }
  69.  
  70.  
  71.  
  72. void insertarAlInicio(Lista &l, int valor) {
  73.     Lista nuevoNodo = new(Nodo);
  74.     nuevoNodo->info = valor;
  75.     nuevoNodo->link = l;
  76.     l = nuevoNodo;
  77. }
  78.  
  79. void insertarAlFinal2(Lista &l, int valor) {
  80.     //1 creamos el nuevo nodo
  81.     Lista nuevoNodo = new(Nodo);
  82.     nuevoNodo->info = valor;
  83.     nuevoNodo->link = NULL;
  84.     //caso particular l es null
  85.     if(l == NULL)
  86.         l = nuevoNodo;
  87.  
  88.     else //si sólo tiene un nodo
  89.         if(l->link == NULL)
  90.             l->link = nuevoNodo;
  91.     else {
  92.         Lista aux = l;
  93.         //recorremos hasta el final
  94.         while (aux->link != NULL)
  95.             aux = aux->link;
  96.  
  97.         aux->link = nuevoNodo;
  98.     }
  99. }
  100.  
  101.  
  102. void insertarAlFinal(Lista &l, int valor) {
  103.     //1 creamos el nuevo nodo
  104.     Lista nuevoNodo = new(Nodo);
  105.     nuevoNodo->info = valor;
  106.     nuevoNodo->link = NULL;
  107.     //caso particular l es null
  108.     if(l == NULL)
  109.         l = nuevoNodo;
  110.  
  111.     else {
  112.         Lista aux = l;
  113.         //recorremos hasta el final
  114.         /***recorro a->link, para saber si es el ultimo elemento de la lista **/
  115.         /**Si lo hago con aux != NULL, sólo llegaré al último nodo**/
  116.         while (aux->link != NULL)
  117.             aux = aux->link;
  118.  
  119.         aux->link = nuevoNodo;
  120.     }
  121. }
  122.  
  123. //insertar un nodo según posicion (se podría considerar como un indice)
  124. void insertarNodoOrdenado(Lista &l, int valor){
  125.     //preparamos el nodo
  126.     Lista nuevoNodo = new(Nodo);
  127.     nuevoNodo->info = valor;
  128.     nuevoNodo->link = NULL;
  129.  
  130.     //Si la lista es vacia
  131.     if(l == NULL) {
  132.         l = nuevoNodo;
  133.  
  134.     } else if(l->info >= valor) { //revisamos el primer caso
  135.             nuevoNodo->link = l;
  136.             l = nuevoNodo;
  137.     } else {
  138.         Lista aux = l;
  139.         Lista siguiente = l;
  140.         while(aux->link != NULL){
  141.             siguiente = aux->link;
  142.             if(siguiente != NULL && siguiente->info >= valor) {
  143.                 aux->link = nuevoNodo;
  144.                 nuevoNodo->link = siguiente;
  145.                 break; //termina la ejecución
  146.             }
  147.             aux=aux->link;
  148.         }
  149.         //si no lo encontró lo agregamos al final
  150.         aux->link = nuevoNodo;
  151.     }
  152. }
  153.  
  154. //Eliminar ultimo nodo
  155. void eliminarPrimerNodo(Lista &p) {
  156.     if(p != NULL) {
  157.         Lista nodoEliminar = p;
  158.         p = p->link;
  159.         delete(nodoEliminar);
  160.     }
  161. }
  162.  
  163. //eliminar el último nodo
  164. void eliminarUltimoNodo(Lista &l){
  165.     if(l == NULL)
  166.         return ;
  167.  
  168.     if (l->link == NULL) {//caso particular sólo 1 nodo
  169.         delete(l);
  170.         l = NULL;
  171.         return;
  172.     } else { //tiene por lo menos un nodo
  173.         //vamos hasta el último
  174.         Lista aux = l;
  175.         Lista penultimo = l;
  176.         while(aux->link != NULL) {
  177.             cout <<"[x]"<< aux->info<<endl;
  178.             penultimo = aux;
  179.             aux= aux->link;
  180.         }
  181.         //aux tiene el último nodo
  182.         delete (aux);
  183.         penultimo->link = NULL;
  184.     }
  185. }
  186.  
  187. void eliminarNodoIgualaK(Lista &l, int k){
  188.     if(l == NULL)
  189.         return ;
  190.  
  191.     //revisamos el primer elemento
  192.     if (l != NULL && l->info == k) {//caso particular sólo 1 nodo
  193.         cout <<"Eliminó el primero igual a "<<l->info<<endl;
  194.         Lista nodoEliminar = l;
  195.         l = l->link;
  196.         delete(nodoEliminar);
  197.         return ;
  198.     } else { //tiene por lo menos un nodo
  199.         //vamos hasta el último
  200.         Lista aux = l;
  201.         Lista siguiente = l;
  202.         while(aux != NULL) {
  203.             siguiente = aux->link;
  204.             cout <<"\t Revisando "<<aux->info<<endl;
  205.             if(siguiente != NULL && siguiente->info == k){
  206.                 cout <<"Eliminó el primero igual a "<<aux->info<<endl;
  207.                 Lista nodoEliminar = siguiente;
  208.                 aux->link = siguiente->link;
  209.                 delete(nodoEliminar);
  210.                 //break;
  211.             }
  212.             aux= aux->link;
  213.         }
  214.     }
  215. }
  216.  
  217. void ordenarListaPorBurbuja(Lista &L) {
  218.     Lista actual    = L;
  219.     Lista siguiente = L;
  220.  
  221.     while (actual != NULL) {
  222.         siguiente =  actual->link;
  223.         while (siguiente != NULL) {
  224.             if(actual->info > siguiente->info) {
  225.                 int temp        = siguiente->info;
  226.                 siguiente->info = actual->info;
  227.                 actual->info    = temp;
  228.             }
  229.             // *siguiente elemento **
  230.             siguiente = siguiente->link;
  231.         }
  232.         actual = actual->link;
  233.     }
  234. }
  235.  
  236. ///recursividad
  237. void mostrarR(Lista l){
  238.     if(l == NULL)
  239.         return;
  240.     cout <<l->info << endl;
  241.     mostrarR(l->link);
  242. }
  243.  
  244. void mostrarRecursivoInverso(Lista l){
  245.     if(l == NULL)
  246.         return;
  247.  
  248.     mostrarRecursivoInverso(l->link);
  249.     cout <<l->info << endl;
  250. }
  251.  
  252. int contarR(Lista l){
  253.     if(l == NULL)
  254.         return 0;
  255.     return 1 + contarR(l->link);
  256. }
  257.  
  258. int sumarR(Lista l){
  259.     if(l == NULL)
  260.         return 0;
  261.     return l->info + sumarR(l->link);
  262. }
  263.  
  264. #include <climits>
  265. int mayorR(Lista l) {
  266.     if(l == NULL)
  267.         return INT_MIN;
  268.     int mayor = mayorR(l->link);
  269.     if(l->info > mayor)
  270.         return l->info;
  271.     else
  272.         return mayor;
  273. }
  274.  
  275. int promedioR(Lista l,int suma, int cantidad) {
  276.     if(l == NULL) {
  277.         if(cantidad > 0)
  278.             return suma / cantidad;
  279.         else {
  280.             cout << "error div X";
  281.             return -1;
  282.         }
  283.     }
  284.     else {
  285.         promedioR(l->link, suma + l->info, cantidad++);
  286.     }
  287. } //cout <<promedioR(L, 0,0);
  288.  
  289. void agregarR(Lista &l, int valor){
  290.     if(l == NULL) {
  291.         Lista nuevoNodo = new(Nodo);
  292.         nuevoNodo->info = valor;
  293.         nuevoNodo->link = NULL;
  294.         l = nuevoNodo;
  295.     } else {
  296.         agregarR(l->link, valor);
  297.     }
  298. }
  299.  
  300. int main()
  301. {
  302.     /** ¿Porqué es importante inicializar la variable con NULL? **/
  303.     Lista L = NULL;
  304.  
  305.     //insertamos
  306.     insertarAlInicio(L, 1);
  307.     insertarAlInicio(L, 2);
  308.     insertarAlInicio(L, 3);
  309.     for(int i=0;i<rand()%20; i++)
  310.         insertarAlInicio(L, rand()%100);
  311.  
  312.     cout << "LLS: lista lineal simple" << endl;
  313.     mostrarLista(L);
  314.     mostrarImpares(L);
  315.     cout <<"Sumar Nodos:"<<sumarNodos(L)<<endl;
  316.     cout <<"Contar Nodos:"<<cantidadNodos(L)<<endl;
  317.     /**ejercicios:
  318.     - retornar la cantidad de nodos que tiene una lista
  319.     - retornar la suma de los nodos
  320.     */
  321.  
  322.     Lista L2 = NULL;
  323.     for(int i=0;i<10; i++)
  324.         insertarAlFinal(L2, i);
  325.     mostrarLista(L2);
  326.  
  327.     //Insertar Nodo Ordenado o en posición X
  328.     Lista L3 = NULL;
  329.     insertarNodoOrdenado(L3, 7);
  330.     cout <<"mostrar Ordenado 7"<<endl;;
  331.     mostrarLista(L3);
  332.     insertarNodoOrdenado(L3, 3);
  333.     insertarNodoOrdenado(L3, 15);
  334.     insertarNodoOrdenado(L3, 8);
  335.     insertarNodoOrdenado(L3, 2);
  336.     insertarNodoOrdenado(L3, 20);
  337.     insertarNodoOrdenado(L3, 1);
  338.     cout <<"mostrar Ordenado "<<endl;;
  339.     mostrarLista(L3);
  340.  
  341.     cout <<"Eliminamos dos primeros nodos";
  342.     eliminarPrimerNodo(L2);
  343.     eliminarPrimerNodo(L2);
  344.     mostrarLista(L2);
  345.     cout <<"Eliminamos dos ultimos nodos"<<endl;
  346.     eliminarUltimoNodo(L2);
  347.     cout <<endl<<"eliminado otra vez "<<endl;
  348.     eliminarUltimoNodo(L2);
  349.     mostrarLista(L2);
  350.     cout <<endl<<"eliminado igual a K = 5 "<<endl;
  351.     eliminarNodoIgualaK(L2, 5);
  352.     cout <<endl<<"eliminado igual a K = 2 "<<endl;
  353.     eliminarNodoIgualaK(L2, 2);
  354.     mostrarLista(L2);
  355.  
  356.     Lista L4 = NULL;
  357.     insertarAlFinal(L4, 17);
  358.     insertarAlFinal(L4, 4);
  359.     insertarAlFinal(L4, 24);
  360.     insertarAlFinal(L4, 2);
  361.     insertarAlFinal(L4, 1);
  362.     cout <<endl<<"L4 Antes de Ordenar "<<endl;
  363.     mostrarLista(L4);
  364.     ordenarListaPorBurbuja(L4);
  365.     cout <<endl<<"L4 Después de Ordenar "<<endl;
  366.     mostrarLista(L4);
  367.  
  368.     cout <<"recursividad"<<endl;
  369.     Lista L5 = NULL;
  370.     agregarR(L5, 1);
  371.     agregarR(L5, 2);
  372.     agregarR(L5, 3);
  373.     agregarR(L5, 4);
  374.     mostrarR(L5);
  375.     mostrarR(L5);
  376.  
  377.     return 0;
  378. }
  379.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement