Advertisement
davidcastrosalinas

EDD 202009925 - LLS Insercción Eliminación Búsqueda y recursividad

Sep 25th, 2020
154
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 9.55 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 (fácil)
  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.         cout <<"[x]"<< l->info<<endl;
  170.         delete(l);
  171.         l = NULL;
  172.         return;
  173.     } else { //tiene por lo menos un nodo
  174.         //vamos hasta el último
  175.         Lista aux = l;
  176.         Lista penultimo = l;
  177.         while(aux->link != NULL) {
  178.             penultimo = aux;
  179.             aux= aux->link;
  180.         }
  181.         //aux tiene el último nodo
  182.         cout <<"[x]"<< aux->info<<endl;
  183.         delete (aux);
  184.         penultimo->link = NULL;
  185.     }
  186. }
  187.  
  188. void eliminarNodoIgualaK(Lista &l, int k){
  189.     if(l == NULL)
  190.         return ;
  191.  
  192.     //revisamos el primer elemento
  193.     if (l != NULL && l->info == k) {//caso particular sólo 1 nodo
  194.         cout <<"Eliminó el primero igual a "<<l->info<<endl;
  195.         Lista nodoEliminar = l;
  196.         l = l->link;
  197.         delete(nodoEliminar);
  198.         return ;
  199.     } else { //tiene por lo menos un nodo
  200.         //vamos hasta el último
  201.         Lista aux = l;
  202.         Lista siguiente = l;
  203.         while(aux != NULL) {
  204.             siguiente = aux->link;
  205.             cout <<"\t Revisando "<<aux->info<<endl;
  206.             if(siguiente != NULL && siguiente->info == k){
  207.                 cout <<"Eliminó el primero igual a "<<aux->info<<endl;
  208.                 Lista nodoEliminar = siguiente;
  209.                 aux->link = siguiente->link;
  210.                 delete(nodoEliminar);
  211.                 //break;
  212.             }
  213.             aux= aux->link;
  214.         }
  215.     }
  216. }
  217.  
  218. void ordenarListaPorBurbuja(Lista &L) {
  219.     Lista actual    = L;
  220.     Lista siguiente = L;
  221.  
  222.     while (actual != NULL) {
  223.         siguiente =  actual->link;
  224.         while (siguiente != NULL) {
  225.             if(actual->info > siguiente->info) {
  226.                 int temp        = siguiente->info;
  227.                 siguiente->info = actual->info;
  228.                 actual->info    = temp;
  229.             }
  230.             // *siguiente elemento **
  231.             siguiente = siguiente->link;
  232.         }
  233.         actual = actual->link;
  234.     }
  235. }
  236.  
  237. ///recursividad
  238. void mostrarR(Lista l){
  239.     if(l == NULL)
  240.         return;
  241.     cout <<l->info << endl;
  242.     mostrarR(l->link);
  243. }
  244.  
  245. void mostrarRecursivoInverso(Lista l){
  246.     if(l == NULL)
  247.         return;
  248.  
  249.     mostrarRecursivoInverso(l->link);
  250.     cout <<l->info << endl;
  251. }
  252.  
  253. int contarR(Lista l){
  254.     if(l == NULL)
  255.         return 0;
  256.     return 1 + contarR(l->link);
  257. }
  258.  
  259. int sumarR(Lista l){
  260.     if(l == NULL)
  261.         return 0;
  262.     return l->info + sumarR(l->link);
  263. }
  264.  
  265. #include <climits>
  266. int mayorR(Lista l) {
  267.     if(l == NULL)
  268.         return INT_MIN;
  269.     int mayor = mayorR(l->link);
  270.     if(l->info > mayor)
  271.         return l->info;
  272.     else
  273.         return mayor;
  274. }
  275.  
  276. int promedioR(Lista l, int suma, int cantidad) {
  277.     if(l == NULL) {
  278.         if(cantidad > 0)
  279.             return suma / cantidad;
  280.         else {
  281.             cout << "error div X";
  282.             return -1;
  283.         }
  284.     }
  285.     else {
  286.         //si colocamos ++ delante de la variable, realiza la suma antes de la llamada
  287.         promedioR(l->link, suma + l->info, ++cantidad);
  288.     }
  289. } //cout <<promedioR(L, 0,0);
  290.  
  291. void agregarR(Lista &l, int valor){
  292.     if(l == NULL) {
  293.         Lista nuevoNodo = new(Nodo);
  294.         nuevoNodo->info = valor;
  295.         nuevoNodo->link = NULL;
  296.         l = nuevoNodo;
  297.     } else {
  298.         agregarR(l->link, valor);
  299.     }
  300. }
  301.  
  302. int main()
  303. {
  304.     /** ¿Porqué es importante inicializar la variable con NULL? **/
  305.     Lista L = NULL;
  306.  
  307.     //insertamos
  308.     insertarAlInicio(L, 1);
  309.     insertarAlInicio(L, 2);
  310.     insertarAlInicio(L, 3);
  311.     for(int i=0;i<rand()%20; i++)
  312.         insertarAlInicio(L, rand()%100);
  313.  
  314.     cout << "LLS: lista lineal simple" << endl;
  315.     mostrarLista(L);
  316.     mostrarImpares(L);
  317.     cout <<"Sumar Nodos:"<<sumarNodos(L)<<endl;
  318.     cout <<"Contar Nodos:"<<cantidadNodos(L)<<endl;
  319.     /**ejercicios:
  320.     - retornar la cantidad de nodos que tiene una lista
  321.     - retornar la suma de los nodos
  322.     */
  323.  
  324.     Lista L2 = NULL;
  325.     for(int i=0;i<10; i++)
  326.         insertarAlFinal(L2, i);
  327.     mostrarLista(L2);
  328.  
  329.     //Insertar Nodo Ordenado o en posición X
  330.     Lista L3 = NULL;
  331.     insertarNodoOrdenado(L3, 7);
  332.     cout <<"mostrar Ordenado 7"<<endl;;
  333.     mostrarLista(L3);
  334.     insertarNodoOrdenado(L3, 3);
  335.     insertarNodoOrdenado(L3, 15);
  336.     insertarNodoOrdenado(L3, 8);
  337.     insertarNodoOrdenado(L3, 2);
  338.     insertarNodoOrdenado(L3, 20);
  339.     insertarNodoOrdenado(L3, 1);
  340.     cout <<"mostrar Ordenado "<<endl;;
  341.     mostrarLista(L3);
  342.  
  343.     cout <<"Eliminamos dos primeros nodos";
  344.     eliminarPrimerNodo(L2);
  345.     eliminarPrimerNodo(L2);
  346.     mostrarLista(L2);
  347.     cout <<"Eliminamos dos ultimos nodos"<<endl;
  348.     eliminarUltimoNodo(L2);
  349.     cout <<endl<<"eliminado otra vez "<<endl;
  350.     eliminarUltimoNodo(L2);
  351.     mostrarLista(L2);
  352.     cout <<endl<<"eliminado igual a K = 5 "<<endl;
  353.     eliminarNodoIgualaK(L2, 5);
  354.     cout <<endl<<"eliminado igual a K = 2 "<<endl;
  355.     eliminarNodoIgualaK(L2, 2);
  356.     mostrarLista(L2);
  357.  
  358.     Lista L4 = NULL;
  359.     insertarAlFinal(L4, 17);
  360.     insertarAlFinal(L4, 4);
  361.     insertarAlFinal(L4, 24);
  362.     insertarAlFinal(L4, 2);
  363.     insertarAlFinal(L4, 1);
  364.     cout <<endl<<"L4 Antes de Ordenar "<<endl;
  365.     mostrarLista(L4);
  366.     ordenarListaPorBurbuja(L4);
  367.     cout <<endl<<"L4 Después de Ordenar "<<endl;
  368.     mostrarLista(L4);
  369.  
  370.     cout <<"recursividad"<<endl;
  371.     Lista L5 = NULL;
  372.     agregarR(L5, 1);
  373.     agregarR(L5, 2);
  374.     agregarR(L5, 3);
  375.     agregarR(L5, 4);
  376.     cout <<"Mostrar"<<endl;
  377.     mostrarR(L5);
  378.     cout <<"Mostrar"<<endl;
  379.     mostrarR(L5);
  380.  
  381.     cout <<"Promedio: "<<promedioR(L5, 0, 0);
  382.  
  383.     return 0;
  384. }
  385.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement