karlangadas

hashing casimiro

Dec 2nd, 2016
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 8.20 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include "todo.h"
  4. //Cola
  5. void C_init(TCola *C){
  6.     C->inicio=NULL;
  7.     C->fin=NULL;
  8. }
  9. void C_enqueue(TCola *C, TElemento nuevoElem){
  10.     TNodo *ptr_nuevoNodo;
  11.    
  12.     ptr_nuevoNodo = (TNodo*)malloc(sizeof(TNodo));
  13.    
  14.     if (ptr_nuevoNodo != NULL){
  15.         ptr_nuevoNodo->elem = nuevoElem;
  16.         ptr_nuevoNodo->sig = NULL;
  17.         if (C->inicio == NULL)
  18.             C->inicio = ptr_nuevoNodo;
  19.         else
  20.             C->fin->sig = ptr_nuevoNodo;
  21.  
  22.         C->fin = ptr_nuevoNodo;
  23.     }
  24. }
  25.  
  26. TElemento C_dequeue(TCola *C){
  27.     if (!C_isEmpty(C)){
  28.         TElemento head_info; TNodo *ptr_head;
  29.         ptr_head = C->inicio;
  30.         head_info = ptr_head->elem;
  31.         C->inicio = C->inicio->sig;
  32.         free(ptr_head);
  33.         return head_info;
  34.     }
  35.     return '\n';
  36. }
  37. int C_isEmpty(TCola *C){
  38.     return (C->inicio == NULL);
  39. }
  40. void C_finalize(TCola *C){
  41.     while(!C_isEmpty(C)){
  42.         C_dequeue(C);
  43.     }
  44. }
  45.  
  46. //Pila
  47. void Stack_Create(TPila *P){
  48.     P->top=NULL;
  49. }
  50. void Stack_Push(TPila *P, TElemento nuevoElem){
  51.     TNodo *ptr_nuevoElem;
  52.    
  53.     ptr_nuevoElem = malloc(sizeof(TNodo));
  54.    
  55.     if (ptr_nuevoElem){
  56.         ptr_nuevoElem->elem = nuevoElem;
  57.         ptr_nuevoElem->sig = P->top;
  58.         P->top = ptr_nuevoElem;
  59.     }
  60. }
  61.  
  62. TElemento Stack_Pop(TPila *P){
  63.     TElemento top_info; TNodo *ptr_top;
  64.     if (!Stack_IsEmpty(*P)){
  65.         ptr_top = P->top;
  66.         top_info = ptr_top->elem;
  67.         P->top = P->top->sig;
  68.         free(ptr_top);
  69.         return top_info;
  70.     }
  71.     return '0';
  72. }
  73.  
  74. int Stack_IsEmpty(TPila P){
  75.     return (P.top==NULL);
  76. }
  77. TElemento Stack_Top(TPila P){
  78.     return P.top->elem;
  79. }
  80.  
  81. //Lista
  82.  
  83. void Lista_Crear(TLista *L){
  84.     L->inicio = NULL;
  85.     L->fin = NULL;
  86.     L->numElem = 0;
  87. }
  88.  
  89. void Lista_Finalizar(TLista *L){
  90.     while (!Lista_EstaVacia(*L)){
  91.         Lista_Eliminar(L,L->inicio->elem);
  92.     }
  93. }
  94.  
  95. int Lista_EstaVacia(TLista L){
  96.     return (L.numElem==0);
  97. }
  98.  
  99. void Lista_Insertar(TLista *L, char nombre[20],char numero[20]){
  100.     if (!Lista_EstaEnLista(*L,e)){
  101.         TNodo *nodo = malloc(sizeof(TNodo));
  102.         nodo->key=nombre;
  103.         nodo->valor=numero;
  104.         nodo->sig=NULL;
  105.         if (Lista_EstaVacia(*L)){
  106.             L->inicio = nodo;
  107.         }
  108.         else{
  109.             L->fin->sig = nodo;
  110.         }
  111.         L->fin = nodo;
  112.         (L->numElem)++;
  113.     }
  114. }
  115.  
  116. int Lista_Insertar2(TLista *L, TElemento e,int tipo){
  117.     if (!Lista_EstaEnLista(*L,e)){
  118.         TNodo *nodo = malloc(sizeof(TNodo));
  119.         nodo->elem=e;
  120.         nodo->tipo=tipo;
  121.         nodo->sig=NULL;
  122.         if (Lista_EstaVacia(*L)){
  123.             L->inicio = nodo;
  124.         }
  125.         else{
  126.             L->fin->sig = nodo;
  127.         }
  128.         L->fin = nodo;
  129.         (L->numElem)++;
  130.         return 1;
  131.     }
  132.  
  133.     TNodo *crtNodo= L->inicio;
  134.     while(crtNodo!=NULL && crtNodo->elem != e)
  135.         crtNodo=crtNodo->sig;
  136.     return (crtNodo->tipo==tipo);
  137.    
  138. }
  139.  
  140. void Lista_Eliminar(TLista *L, TElemento e){
  141.         if (!Lista_EstaVacia(*L)){
  142.         TNodo *ptrActual = L->inicio;
  143.         TNodo *ptrAnt = NULL;
  144.         while (ptrActual != NULL ){
  145.             if (ptrActual->elem == e)
  146.                 break;
  147.             ptrAnt = ptrActual;
  148.             ptrActual = ptrActual->sig;
  149.         }
  150.         if (ptrActual != NULL){// Lo encontró
  151.             // Es el primer elemento de la lista
  152.             if (ptrAnt == NULL){ // ptrActual == L->inicio
  153.                 L->inicio = L->inicio->sig;
  154.             }
  155.             // Es el último elemento
  156.             if (ptrActual->sig == NULL){ // ptrActual == L->fin
  157.                 if (ptrAnt != NULL) ptrAnt->sig = NULL;
  158.                 L->fin = ptrAnt;
  159.             }else{
  160.             // Es un elemento del medio
  161.                 if (ptrAnt != NULL) ptrAnt->sig = ptrActual->sig;
  162.             }
  163.             free(ptrActual);
  164.             (L->numElem)--;
  165.         }
  166.     }
  167. }
  168.  
  169. int Lista_Tamanho(TLista L){
  170.     return (L.numElem);
  171. }
  172. int Lista_EstaEnLista(TLista L, TElemento e){
  173.     TNodo *crtNodo= L.inicio;
  174.     while(crtNodo!=NULL && crtNodo->elem != e)
  175.         crtNodo=crtNodo->sig;
  176.     return (crtNodo!=NULL);
  177. }
  178.  
  179. void Lista_Imprimir(TLista L){
  180.     if (!Lista_EstaVacia(L)){
  181.         TNodo *crtNodo=L.inicio;
  182.         while (crtNodo!=NULL){
  183.             printf("%d %d ",crtNodo->elem,crtNodo->tipo);
  184.             crtNodo=crtNodo->sig;
  185.         }
  186.         printf("\n");
  187.            
  188.     }
  189. }
  190.  
  191. void Lista_insertarEnOrden(TLista *L, TElemento nuevoElem) {
  192.     TNodo *ptrNuevo;
  193.     ptrNuevo = malloc(sizeof (TNodo));
  194.  
  195.     if (ptrNuevo) {
  196.         ptrNuevo->elem = nuevoElem;
  197.         ptrNuevo->sig = NULL;
  198.  
  199.         TNodo* ptrRec, *ptrAnt;
  200.         ptrAnt = NULL;
  201.         ptrRec = L->inicio;
  202.         // Buscar la posición en la cual debo insertar
  203.         while (ptrRec && ptrRec->elem < nuevoElem) {
  204.             ptrAnt = ptrRec;
  205.             ptrRec = ptrRec->sig;
  206.         }
  207.         if (ptrAnt == NULL)
  208.             L->inicio = ptrNuevo;
  209.         else {
  210.             ptrAnt->sig = ptrNuevo;
  211.             if (ptrAnt == L->fin) L->fin = ptrNuevo;
  212.         }
  213.         ptrNuevo->sig = ptrRec;
  214.         (L->numElem)++;
  215.     }
  216. }
  217. //Grafos
  218. void grafo_init(TGrafo *grafo){
  219.     grafo->nvertices=0;
  220.     grafo->ini=NULL;
  221.     grafo->fin=NULL;
  222. }
  223.  
  224. int grafo_empty(TGrafo *grafo){
  225.     return (grafo->nvertices==0);
  226. }
  227. int grafo_existeV(TGrafo *grafo,TElemento vert){
  228.     TVertice *ptrRec=grafo->ini;
  229.     while(ptrRec){
  230.         if (ptrRec->info==vert){
  231.             return 1;
  232.         }
  233.         ptrRec=ptrRec->sig;
  234.     }
  235.     return 0;
  236. }
  237.  
  238. void grafo_insertV(TGrafo *grafo,TElemento vert){
  239.     if (!grafo_existeV(grafo,vert)){
  240.         TVertice *nuevo=malloc(sizeof(TVertice));
  241.         nuevo->info=vert;
  242.         Lista_Crear(&nuevo->lstAdyacentes);
  243.        
  244.         nuevo->sig=NULL;
  245.         if (grafo->nvertices==0)
  246.             grafo->ini=nuevo;
  247.         else
  248.             grafo->fin->sig=nuevo;
  249.         grafo->fin=nuevo;
  250.         (grafo->nvertices)++;
  251.     }
  252. }
  253. void grafo_insertA(TGrafo *grafo,TElemento ini,TElemento fin){
  254.     if (grafo_existeV(grafo,ini) && grafo_existeV(grafo,fin)){
  255.         TVertice *ptrRec=grafo->ini;
  256.         while(ptrRec){
  257.             if (ptrRec->info==ini){
  258.                 if (!Lista_EstaEnLista(ptrRec->lstAdyacentes,fin))
  259.                     Lista_insertarEnOrden(&ptrRec->lstAdyacentes,fin);
  260.             }
  261.             ptrRec=ptrRec->sig;
  262.         }
  263.         //Digrafo
  264.         ptrRec=grafo->ini;
  265.         while(ptrRec){
  266.             if (ptrRec->info==fin){
  267.                 if (!Lista_EstaEnLista(ptrRec->lstAdyacentes,ini))
  268.                     Lista_insertarEnOrden(&ptrRec->lstAdyacentes,ini);
  269.             }
  270.             ptrRec=ptrRec->sig;
  271.         }
  272.     }
  273. }
  274. void grafo_deleteV(TGrafo *grafo,TElemento vert){
  275.     if (grafo_existeV(grafo,vert)){
  276.         TVertice *ptrActual = grafo->ini;
  277.         TVertice *ptrAnt = NULL;
  278.         while (ptrActual != NULL ){
  279.             Lista_Eliminar(&ptrActual->lstAdyacentes,vert);
  280.             if (ptrActual->info == vert){
  281.                 break;
  282.             }
  283.             ptrAnt = ptrActual;
  284.             ptrActual = ptrActual->sig;
  285.         }
  286.  
  287.         if (ptrAnt == NULL){ // ptrActual == L->inicio
  288.             grafo->ini = grafo->ini->sig;
  289.         }
  290.         if (ptrActual->sig == NULL){ // ptrActual == L->fin
  291.             if (ptrAnt != NULL) ptrAnt->sig = NULL;
  292.             grafo->fin = ptrAnt;
  293.         }else{
  294.             if (ptrAnt != NULL) ptrAnt->sig = ptrActual->sig;
  295.         }
  296.         ptrAnt=ptrActual->sig;
  297.         free(ptrActual);
  298.         (grafo->nvertices)--;
  299.         //Terminamos de eliminar rastro del vertice
  300.         while (ptrAnt != NULL){
  301.             Lista_Eliminar(&ptrAnt->lstAdyacentes,vert);
  302.             ptrAnt=ptrAnt->sig;
  303.         }
  304.     }
  305.  
  306. }
  307. void grafo_deleteA(TGrafo *grafo,TElemento ini,TElemento fin){
  308.     if (grafo_existeV(grafo,ini) && grafo_existeV(grafo,fin)){
  309.        
  310.         TVertice *ptrRec=grafo->ini;
  311.         while(ptrRec){
  312.             if (ptrRec->info==ini){
  313.                 Lista_Eliminar(&ptrRec->lstAdyacentes,fin);    
  314.                 break;
  315.             }
  316.             ptrRec=ptrRec->sig;
  317.         }
  318.         //Digrafo
  319.         ptrRec=grafo->ini;
  320.         while(ptrRec){
  321.             if (ptrRec->info==fin){
  322.                 if (Lista_EstaEnLista(ptrRec->lstAdyacentes,ini))
  323.                     Lista_Eliminar(&ptrRec->lstAdyacentes,ini);
  324.             break;
  325.             }
  326.             ptrRec=ptrRec->sig;
  327.         }
  328.     }
  329.  
  330. }
  331. void grafo_print(TGrafo *grafo){
  332.     TVertice *ptrRec=grafo->ini;
  333.         while(ptrRec){
  334.             printf("%c: ",ptrRec->info);
  335.             Lista_Imprimir(ptrRec->lstAdyacentes);
  336.             ptrRec=ptrRec->sig;
  337.         }
  338. }
  339. void grafo_finalize(TGrafo *grafo){
  340.     while (grafo->ini){
  341.         grafo_deleteV(grafo,grafo->ini->info);
  342.     }
  343. }
Advertisement
Add Comment
Please, Sign In to add comment