Advertisement
Guest User

Untitled

a guest
Oct 31st, 2014
165
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 14.77 KB | None | 0 0
  1. /*
  2.  * File:   main.c
  3.  * Author: Victor
  4.  *
  5.  * Created on 22 de octubre de 2014, 08:06 PM
  6.  */
  7.  
  8. #include <stdio.h>
  9. #include <stdlib.h>
  10. #include <limits.h>
  11.  
  12. /*Listas*/
  13. typedef struct nodo {
  14.     int elem;
  15.     struct nodo *sig;
  16. } TNodo;
  17.  
  18. typedef struct lista {
  19.     int nElem;
  20.     TNodo *inicio;
  21.     TNodo *final;
  22. } TLista;
  23.  
  24. typedef struct nodo_char {
  25.     char elem;
  26.     struct nodo_char *sig;
  27. } TNodoChar;
  28.  
  29. typedef struct lista_char {
  30.     int nElem;
  31.     TNodoChar *inicio;
  32.     TNodoChar *final;
  33. } TListaChar;
  34.  
  35. /*Pila*/
  36. typedef struct {
  37.     TNodo *top;
  38. } TPila;
  39.  
  40. /*Cola*/
  41. typedef struct {
  42.     TNodo *inicio;
  43.     TNodo *final;
  44. } TCola;
  45.  
  46. /*Deque*/
  47. typedef struct deque {
  48.     int elem;
  49.     struct deque *sig;
  50.     struct deque *ant;
  51. } TNodoDeque;
  52.  
  53. typedef struct {
  54.     int nElem;
  55.     TNodoDeque *inicio;
  56.     TNodoDeque *final;
  57. } TDeque;
  58.  
  59. /*Listas*/
  60. void crear_lista(TLista *L) {
  61.     L->inicio = NULL;
  62.     L->final = NULL;
  63.     L->nElem = 0;
  64. }
  65.  
  66. void finalizar_lista(TLista *L) {
  67.     TNodo *ptrElim = L->inicio;
  68.     while (ptrElim) {
  69.         L->inicio = ptrElim->sig;
  70.         free(ptrElim);
  71.         ptrElim = L->inicio;
  72.     }
  73. }
  74.  
  75. int es_lista_vacia(TLista *L) {
  76.     return L->nElem == 0;
  77. }
  78.  
  79. void insertar_der(TLista *L, int n) {
  80.     TNodo *ptrNuevo = malloc(sizeof (TNodo));
  81.     if (ptrNuevo) {
  82.         ptrNuevo->elem = n;
  83.         ptrNuevo->sig = NULL;
  84.  
  85.         if (L->inicio == NULL)
  86.             L->inicio = ptrNuevo;
  87.         else
  88.             L->final->sig = ptrNuevo;
  89.         L->final = ptrNuevo;
  90.         (L->nElem)++;
  91.     }
  92. }
  93.  
  94. void insertar_izq(TLista *L, int n) {
  95.     TNodo *ptrNuevo = malloc(sizeof (TNodo));
  96.     if (ptrNuevo) {
  97.         ptrNuevo->elem = n;
  98.         ptrNuevo->sig = NULL;
  99.  
  100.         if (L->inicio == NULL)
  101.             L->inicio = ptrNuevo;
  102.         else
  103.             ptrNuevo->sig = L->inicio;
  104.         L->inicio = ptrNuevo;
  105.         (L->nElem)++;
  106.     }
  107. }
  108.  
  109. void eliminar(TLista *L, int n) {
  110.     TNodo *ptrRec, *ptrAnt;
  111.     int termino = 0;
  112.     ptrRec = L->inicio;
  113.     while (ptrRec && !termino) {
  114.         if (ptrRec->elem == n) {
  115.             if (ptrRec == L->inicio)
  116.                 L->inicio = L->inicio->sig;
  117.             else
  118.                 if (ptrRec == L->final) {
  119.                 L->final = ptrAnt;
  120.                 L->final->sig = NULL;
  121.             } else
  122.                 ptrAnt->sig = ptrRec->sig;
  123.             free(ptrRec);
  124.             termino = 1;
  125.             (L->nElem)--;
  126.         } else {
  127.             ptrAnt = ptrRec;
  128.             ptrRec = ptrRec->sig;
  129.         }
  130.     }
  131. }
  132.  
  133. void imprimir_lista(TLista *L) {
  134.     int i;
  135.     TNodo *ptrRec = L->inicio;
  136.     for (i = 0; i < L->nElem; i++) {
  137.         printf("%d->", ptrRec->elem);
  138.         ptrRec = ptrRec->sig;
  139.     }
  140.     printf("NULL\n");
  141. }
  142.  
  143. /*Pilas*/
  144.  
  145. void crear_pila(TPila *P) {
  146.     P->top = NULL;
  147. }
  148.  
  149. void push(TPila *P, int n) {
  150.     TNodo *ptrNodo = malloc(sizeof (TNodo));
  151.     if (ptrNodo) {
  152.         ptrNodo->elem = n;
  153.         ptrNodo->sig = P->top;
  154.         P->top = ptrNodo;
  155.     }
  156. }
  157.  
  158. int es_pila_vacia(TPila *P) {
  159.     return (P->top == NULL);
  160. }
  161.  
  162. int pop(TPila *P) {
  163.     int valor;
  164.     TNodo *ptrNodo;
  165.     if (!es_pila_vacia(P)) {
  166.         ptrNodo = P->top;
  167.         valor = ptrNodo->elem;
  168.         P->top = P->top->sig;
  169.         free(ptrNodo);
  170.         return valor;
  171.     }
  172.     return -1;
  173. }
  174.  
  175. void finaliza_pila(TPila *P) {
  176.     while (!es_pila_vacia(P))
  177.         pop(P);
  178. }
  179.  
  180. void imprime_pila(TPila *P) {
  181.     TNodo *ptrRec = P->top;
  182.     while (ptrRec) {
  183.         printf("%d\n", ptrRec->elem);
  184.         ptrRec = ptrRec->sig;
  185.     }
  186. }
  187.  
  188. /*Cola*/
  189.  
  190. void crear_cola(TCola *C) {
  191.     C->inicio = NULL;
  192.     C->final = NULL;
  193. }
  194.  
  195. void encolar(TCola *C, int n) {
  196.     TNodo *ptrNodo = malloc(sizeof (TNodo));
  197.     if (ptrNodo) {
  198.         ptrNodo->elem = n;
  199.         ptrNodo->sig = NULL;
  200.         if (C->inicio == NULL)
  201.             C->inicio = ptrNodo;
  202.         else
  203.             C->final->sig = ptrNodo;
  204.         C->final = ptrNodo;
  205.     }
  206. }
  207.  
  208. int es_cola_vacia(TCola *C) {
  209.     return C->inicio == NULL;
  210. }
  211.  
  212. int desencolar(TCola *C) {
  213.     TNodo *ptrNodo;
  214.     int valor;
  215.     if (!es_cola_vacia(C)) {
  216.         ptrNodo = C->inicio;
  217.         valor = ptrNodo->elem;
  218.         C->inicio = C->inicio->sig;
  219.         free(ptrNodo);
  220.         return valor;
  221.     }
  222.     return -1;
  223. }
  224.  
  225. void finaliza_cola(TCola *C) {
  226.     while (!es_cola_vacia) {
  227.         desencolar(C);
  228.     }
  229. }
  230.  
  231. /*Ejercicios*/
  232.  
  233. TLista merge_listas(TLista *L1, TLista *L2) {
  234.     TLista lMerged;
  235.     crear_lista(&lMerged);
  236.  
  237.     TNodo *ptrRec1 = L1->inicio;
  238.     TNodo *ptrRec2 = L2->inicio;
  239.  
  240.     while (ptrRec1 && ptrRec2) {
  241.         if (ptrRec1->elem < ptrRec2->elem) {
  242.             insertar_der(&lMerged, ptrRec1->elem);
  243.             ptrRec1 = ptrRec1->sig;
  244.         } else {
  245.             insertar_der(&lMerged, ptrRec2->elem);
  246.             ptrRec2 = ptrRec2->sig;
  247.         }
  248.     }
  249.  
  250.     while (ptrRec1) {
  251.         insertar_der(&lMerged, ptrRec1->elem);
  252.         ptrRec1 = ptrRec1->sig;
  253.     }
  254.  
  255.     while (ptrRec2) {
  256.         insertar_der(&lMerged, ptrRec2->elem);
  257.         ptrRec2 = ptrRec2->sig;
  258.     }
  259.  
  260.     return lMerged;
  261. }
  262.  
  263. void partir_lista(TLista *L, TLista *primeraMitad, TLista *segundaMitad) {
  264.     int lenLista = L->nElem;
  265.     if (lenLista == 2) {
  266.         insertar_der(primeraMitad, L->inicio->elem);
  267.         insertar_der(segundaMitad, L->final->elem);
  268.     } else {
  269.         int i;
  270.         TNodo *ptrRec = L->inicio;
  271.  
  272.         for (i = 0; i < lenLista / 2; i++) {
  273.             insertar_der(primeraMitad, ptrRec->elem);
  274.             ptrRec = ptrRec->sig;
  275.         }
  276.  
  277.         for (i = lenLista / 2; i < lenLista; i++) {
  278.             insertar_der(segundaMitad, ptrRec->elem);
  279.             ptrRec = ptrRec->sig;
  280.         }
  281.     }
  282. }
  283.  
  284. void merge_sort(TLista* L) {
  285.     if (L->nElem > 1) {
  286.         TLista primeraMitad, segundaMitad;
  287.         crear_lista(&primeraMitad);
  288.         crear_lista(&segundaMitad);
  289.         partir_lista(L, &primeraMitad, &segundaMitad);
  290.         merge_sort(&primeraMitad);
  291.         merge_sort(&segundaMitad);
  292.         *L = merge_listas(&primeraMitad, &segundaMitad);
  293.     }
  294.  
  295. }
  296.  
  297. /*Pregunta 1*/
  298. void imprimePosiciones(TLista *L, TLista *P) {
  299.     TNodo *ptrRecP = P->inicio;
  300.     TNodo *ptrRecL;
  301.     while (ptrRecP) {
  302.         ptrRecL = L->inicio;
  303.         int i;
  304.         if (ptrRecP->elem <= L->nElem) {
  305.             for (i = 1; i < ptrRecP->elem; i++)
  306.                 ptrRecL = ptrRecL->sig;
  307.             printf("%d ", ptrRecL->elem);
  308.         }
  309.         ptrRecP = ptrRecP->sig;
  310.     }
  311.     printf("\n");
  312. }
  313.  
  314. /*Pregunta 2*/
  315. void parentheses_balance(TListaChar *L) {
  316.  
  317. }
  318.  
  319. /*Pregunta 3*/
  320.  
  321. void crear_deque(TDeque *D) {
  322.     D->nElem = 0;
  323.     D->inicio = NULL;
  324.     D->final = NULL;
  325. }
  326.  
  327. void insertar_deque_der(TDeque *D, int n) {
  328.     TNodoDeque *ptrNodo = malloc(sizeof (TNodoDeque));
  329.     if (ptrNodo) {
  330.         ptrNodo->elem = n;
  331.         ptrNodo->ant = NULL;
  332.         ptrNodo->sig = NULL;
  333.         if (D->inicio == NULL)
  334.             D->inicio = ptrNodo;
  335.         else {
  336.             D->final->sig = ptrNodo;
  337.             ptrNodo->ant = D->final;
  338.         }
  339.         D->final = ptrNodo;
  340.         (D->nElem)++;
  341.     }
  342. }
  343.  
  344. void insertar_deque_izq(TDeque *D, int n) {
  345.     TNodoDeque *ptrNodo = malloc(sizeof (TNodoDeque));
  346.     if (ptrNodo) {
  347.         ptrNodo->elem = n;
  348.         ptrNodo->ant = NULL;
  349.         ptrNodo->sig = NULL;
  350.         if (D->final == NULL)
  351.             D->final = ptrNodo;
  352.         else {
  353.             D->inicio->ant = ptrNodo;
  354.             ptrNodo->sig = D->inicio;
  355.         }
  356.         D->inicio = ptrNodo;
  357.         (D->nElem)++;
  358.     }
  359. }
  360.  
  361. int eliminar_deque_der(TDeque *D) {
  362.     int valor;
  363.     TNodoDeque *ptrEliminar;
  364.     if (D->final) {
  365.         ptrEliminar = D->final;
  366.         valor = ptrEliminar->elem;
  367.         D->final = D->final->ant;
  368.         D->final->sig = NULL;
  369.         free(ptrEliminar);
  370.         (D->nElem)--;
  371.         return valor;
  372.     }
  373.     return -1;
  374. }
  375.  
  376. int eliminar_deque_izq(TDeque *D) {
  377.     int valor;
  378.     TNodoDeque *ptrEliminar;
  379.     if (D->inicio) {
  380.         ptrEliminar = D->inicio;
  381.         valor = ptrEliminar->elem;
  382.         D->inicio = D->inicio->sig;
  383.         D->inicio->ant = NULL;
  384.         free(ptrEliminar);
  385.         (D->nElem)--;
  386.         return valor;
  387.     }
  388.     return -1;
  389. }
  390.  
  391. /*Pregunta 4*/
  392.  
  393. int esta_en_lista(int n, TLista *L) {
  394.     TNodo *ptrRec = L->inicio;
  395.     int i;
  396.     for (i = 0; i < L->nElem; i++) {
  397.         if (ptrRec->elem == n)
  398.             return 1;
  399.         ptrRec = ptrRec->sig;
  400.     }
  401.     return 0;
  402. }
  403.  
  404. TLista union_conjuntos(TLista *L1, TLista *L2) {
  405.     TLista LUnion;
  406.     crear_lista(&LUnion);
  407.     TNodo *ptrL1, *ptrL2;
  408.     ptrL1 = L1->inicio;
  409.     ptrL2 = L2->inicio;
  410.  
  411.     int i;
  412.     for (i = 0; i < L1->nElem; i++) {
  413.         if (esta_en_lista(ptrL1->elem, L2))
  414.             insertar_der(&LUnion, ptrL1->elem);
  415.         ptrL1 = ptrL1->sig;
  416.     }
  417.  
  418.     for (i = 0; i < L2->nElem; i++) {
  419.         if (esta_en_lista(ptrL2->elem, L1))
  420.             insertar_der(&LUnion, ptrL2->elem);
  421.         ptrL2 = ptrL2->sig;
  422.     }
  423.  
  424.     return LUnion;
  425. }
  426.  
  427. TLista interseccion_conjuntos(TLista *L1, TLista *L2) {
  428.     TLista LInt;
  429.     crear_lista(&LInt);
  430.     TNodo *ptrL1, *ptrL2;
  431.     ptrL1 = L1->inicio;
  432.     ptrL2 = L2->inicio;
  433.  
  434.     int i;
  435.     for (i = 0; i < L1->nElem; i++) {
  436.         if (!esta_en_lista(ptrL1->elem, L2))
  437.             insertar_der(&LInt, ptrL1->elem);
  438.         ptrL1 = ptrL1->sig;
  439.     }
  440.  
  441.     for (i = 0; i < L2->nElem; i++) {
  442.         if (!esta_en_lista(ptrL2->elem, L1))
  443.             insertar_der(&LInt, ptrL2->elem);
  444.         ptrL2 = ptrL2->sig;
  445.     }
  446.  
  447.     return LInt;
  448. }
  449.  
  450. TLista diferencia_conjuntos(TLista *L1, TLista *L2) {
  451.     TLista LDif;
  452.     crear_lista(&LDif);
  453.     TNodo *ptrL1, *ptrL2;
  454.     ptrL1 = L1->inicio;
  455.     ptrL2 = L2->inicio;
  456.  
  457.     int i;
  458.  
  459.     while (ptrL1) {
  460.         if (esta_en_lista(ptrL1->elem, L2))
  461.             ptrL1 = ptrL1->sig;
  462.         else
  463.             insertar_der(&LDif, ptrL1->elem);
  464.     }
  465.  
  466.     return LDif;
  467. }
  468.  
  469. void crearConjuntoVacio(TLista *L) {
  470.     finalizar_lista(L);
  471. }
  472.  
  473. void insertar_elem_conjunto(TLista *L, int n) {
  474.     if (!esta_en_lista(n, L)) {
  475.         insertar_der(L, n);
  476.     }
  477. }
  478.  
  479. void remover_elem_conjunto(TLista *L, int n) {
  480.     if (esta_en_lista(n, L)) {
  481.         eliminar(L, n);
  482.     }
  483. }
  484.  
  485. int min_conjunto(TLista *L) {
  486.     int min = INT_MAX;
  487.     TNodo *ptrRec = L->inicio;
  488.     int i;
  489.     for (i = 0; i < L->nElem; i++) {
  490.         if (ptrRec->elem < min)
  491.             min = ptrRec->elem;
  492.         ptrRec = ptrRec->sig;
  493.     }
  494.     return min;
  495. }
  496.  
  497. int max_conjunto(TLista *L) {
  498.     int max = 0;
  499.     TNodo *ptrRec = L->inicio;
  500.     int i;
  501.     for (i = 0; i < L->nElem; i++) {
  502.         if (ptrRec->elem > max)
  503.             max = ptrRec->elem;
  504.         ptrRec = ptrRec->sig;
  505.     }
  506.     return max;
  507. }
  508.  
  509. int igual_conjuntos(TLista *L1, TLista *L2) {
  510.     int igualL1 = 1, igualL2 = 1;
  511.     TNodo *ptrL1, *ptrL2;
  512.     ptrL1 = L1->inicio;
  513.     ptrL2 = L2->inicio;
  514.     int i;
  515.     for (i = 0; i < L1->nElem; i++) {
  516.         igualL1 = igualL1 && esta_en_lista(ptrL1->elem, L2);
  517.         ptrL1 = ptrL1->sig;
  518.     }
  519.  
  520.     for (i = 0; i < L2->nElem; i++) {
  521.         igualL2 = igualL2 && esta_en_lista(ptrL2->elem, L1);
  522.         ptrL2 = ptrL2->sig;
  523.     }
  524.  
  525.     return igualL1 && igualL2;
  526. }
  527.  
  528. /*Pregunta 5*/
  529.  
  530. TLista suma_listas(TLista *L1, TLista *L2) {
  531.     TLista LSuma;
  532.     crear_lista(&LSuma);
  533.  
  534.     TPila P1;
  535.     TPila P2;
  536.     crear_pila(&P1);
  537.     crear_pila(&P2);
  538.  
  539.     int res = 0;
  540.     int sum_parcial = 0;
  541.     TNodo *ptrL1, *ptrL2;
  542.     ptrL1 = L1->inicio;
  543.     ptrL2 = L2->inicio;
  544.  
  545.     while (ptrL1 != NULL) {
  546.         push(&P1, ptrL1->elem);
  547.         ptrL1 = ptrL1->sig;
  548.     }
  549.  
  550.     while (ptrL2 != NULL) {
  551.         push(&P2, ptrL2->elem);
  552.         ptrL2 = ptrL2->sig;
  553.     }
  554.  
  555.     TNodo *ptrP1 = P1.top;
  556.     TNodo *ptrP2 = P2.top;
  557.  
  558.     while (ptrP1 && ptrP2) {
  559.         sum_parcial = (ptrP1->elem) + (ptrP2->elem) + res;
  560.         res = 0;
  561.         if (sum_parcial <= 9) {
  562.             insertar_izq(&LSuma, sum_parcial);
  563.         } else {
  564.             res = sum_parcial / 10;
  565.             sum_parcial = sum_parcial % 10;
  566.             insertar_izq(&LSuma, sum_parcial);
  567.         }
  568.         pop(&P1);
  569.         pop(&P2);
  570.         ptrP1 = P1.top;
  571.         ptrP2 = P2.top;
  572.     }
  573.  
  574.     while (ptrP1) {
  575.         insertar_izq(&LSuma, ptrP1->elem + res);
  576.         ptrP1=ptrP1->sig;
  577.         res = 0;
  578.     }
  579.  
  580.     while (ptrP2) {
  581.         insertar_izq(&LSuma, ptrP2->elem + res);
  582.         ptrP2=ptrP2->sig;
  583.         res = 0;
  584.     }
  585.  
  586.     return LSuma;
  587. }
  588.  
  589. TLista resta_listas(TLista *L1, TLista *L2) {
  590.     TLista LResta;
  591.     crear_lista(&LResta);
  592.     if (L1->nElem >= L2->nElem) {
  593.         int difLen = L1->nElem - L2->nElem;
  594.  
  595.         TCola C1, C2;
  596.         crear_cola(&C1);
  597.         crear_cola(&C2);
  598.  
  599.         TNodo *ptrRec1, *ptrRec2;
  600.         ptrRec1 = L1->inicio;
  601.         ptrRec2 = L2->inicio;
  602.  
  603.         while (ptrRec1) {
  604.             encolar(&C1, ptrRec1->elem);
  605.             ptrRec1 = ptrRec1->sig;
  606.         }
  607.  
  608.         if (difLen > 0) {
  609.             int i;
  610.             for (i = 0; i < difLen; i++) {
  611.                 encolar(&C2, 0);
  612.             }
  613.         }
  614.  
  615.         while (ptrRec2) {
  616.             encolar(&C2, ptrRec2->elem);
  617.             ptrRec2 = ptrRec2->sig;
  618.         }
  619.  
  620.         TNodo *ptrC1, *ptrC2, *ptrRecL;
  621.         ptrC1 = C1.inicio;
  622.         ptrC2 = C2.inicio;
  623.         ptrRecL = LResta.inicio;
  624.  
  625.         int lleva = 0;
  626.         while (ptrC1 && ptrC2) {
  627.             int res;
  628.  
  629.             res = ptrC1->elem - ptrC2->elem;
  630.             if (lleva == 1) {
  631.                 res += 10;
  632.                 lleva = 0;
  633.             }
  634.             if (ptrC1->sig && ptrC2->sig) {
  635.                 if (ptrC1->sig->elem < ptrC2->sig->elem) {
  636.                     res--;
  637.                     lleva = 1;
  638.                 }
  639.             }
  640.             insertar_der(&LResta, res);
  641.  
  642.             desencolar(&C1);
  643.             desencolar(&C2);
  644.             ptrC1 = C1.inicio;
  645.             ptrC2 = C2.inicio;
  646.         }
  647.     }
  648.     return LResta;
  649. }
  650.  
  651. int main(int argc, char** argv) {
  652.     TLista L1, L2, L3;
  653.     TPila P;
  654.  
  655.     crear_lista(&L1);
  656.     insertar_der(&L1, 1);
  657.     insertar_der(&L1, 8);
  658.     insertar_der(&L1, 0);
  659.     insertar_der(&L1, 0);
  660.  
  661.     crear_lista(&L2);
  662.     insertar_der(&L2, 7);
  663.     insertar_der(&L2, 9);
  664.     insertar_der(&L2, 8);
  665.  
  666.     //merge_sort(&L1);
  667.     //merge_sort(&L2);
  668.  
  669.     imprimir_lista(&L1);
  670.     imprimir_lista(&L2);
  671.  
  672.     //imprimePosiciones(&L1,&L2);
  673.  
  674.     //finalizar_lista(&L1);
  675.     //finalizar_lista(&L2);
  676.  
  677.     //crear_pila(&P);
  678.     //push(&P, 2);
  679.     //push(&P, 5);
  680.     //push(&P, 1);
  681.  
  682.     //pop(&P);
  683.  
  684.     //imprime_pila(&P);
  685.     //finaliza_pila(&P);
  686.  
  687.     TLista LS = suma_listas(&L1, &L2);
  688.     imprimir_lista(&LS);
  689.  
  690.     TLista LR = resta_listas(&L1, &L2);
  691.     imprimir_lista(&LR);
  692.  
  693.     return (EXIT_SUCCESS);
  694. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement