Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
Collezione esempi Grafi - myLib.h

myLib.h

Caricato da: Bonny
Scarica il programma completo

  1. //strutture e operatori di supporto per manipolare il grafo
  2.  
  3. typedef int tipoelem;
  4. //definizione del tipo di dato lista
  5. typedef struct cella * lista;
  6. typedef struct cella * posizione;
  7.  
  8. struct cella{
  9.     posizione successivo;
  10.     tipoelem val;
  11.     posizione precedente;      
  12. };
  13. //operatori sulle liste
  14. lista CREALISTA(){
  15.    lista l;
  16.    l = malloc(sizeof(struct cella));
  17.    l->successivo = l;
  18.    l->precedente = l;
  19.    return l;
  20. }
  21.  
  22. int LISTAVUOTA(lista L){
  23.    return (((L->successivo == L && L->precedente ==L)) ? 1 : 0);
  24. }
  25.  
  26. posizione PRIMOLISTA(lista L){
  27.    return L->successivo;
  28. }
  29.  
  30. posizione SUCCLISTA(posizione P){
  31.    return P->successivo;
  32. }
  33.  
  34. int FINELISTA(posizione P,lista L){
  35.    return ((P == L) ? 1 : 0);
  36. }
  37.  
  38. tipoelem LEGGILISTA(posizione P){
  39.    return P->val;
  40. }
  41.  
  42. void INLISTA(tipoelem el,posizione *p){
  43.    posizione tmp;
  44.    tmp = malloc(sizeof(struct cella));
  45.    tmp->val = el;
  46.    tmp->precedente = (*p)->precedente;
  47.    tmp->successivo = *p;
  48.    ((*p)->precedente)->successivo = tmp;
  49.    (*p)->precedente = tmp;
  50.    *p = tmp;
  51. }
  52.  
  53. void CANCLISTA(posizione *p){
  54.  
  55.      posizione tmp;
  56.  
  57.      tmp = *p;
  58.  
  59.      ((*p)->precedente)->successivo = (*p)->successivo;
  60.      ((*p)->successivo)->precedente = (*p)->precedente;
  61.      
  62.      *p = (*p)->successivo;
  63.  
  64.      free(tmp);
  65. }
  66.  
  67. int APPARTLISTA(tipoelem el,lista L){
  68.        
  69.   int rt = 0;
  70.  
  71.   if(!LISTAVUOTA(L)){
  72.        
  73.         posizione pos = PRIMOLISTA(L);
  74.        
  75.         while(!FINELISTA(pos,L) && rt == 0){
  76.                        
  77.                    if(LEGGILISTA(pos) == el){rt = 1;}  
  78.                    
  79.                    pos = SUCCLISTA(pos);
  80.                 }
  81.     }
  82.  
  83.   return rt;
  84. }
  85.  
  86. lista REVERSELISTA(lista L){
  87.        
  88.    lista lr = CREALISTA();     
  89.    posizione p = PRIMOLISTA(L);
  90.    posizione pr = PRIMOLISTA(lr);
  91.    
  92.    while (!FINELISTA(p,L)){
  93.            
  94.      INLISTA(LEGGILISTA(p),&pr);
  95.      p = SUCCLISTA(p);
  96.      pr = PRIMOLISTA(lr);
  97.    }
  98.    return lr;
  99. }
  100.  
  101. //tipo di dato coda implementato tramite liste
  102.  
  103. typedef lista coda;
  104.  
  105. coda CREACODA(){
  106.     lista L = CREALISTA();
  107.     return L;
  108. }
  109.  
  110. int CODAVUOTA(coda Q){
  111.     return LISTAVUOTA(Q);
  112. }
  113.  
  114. void DISTRUGGICODA(coda Q){
  115.         posizione tmp;
  116.         posizione pos = PRIMOLISTA(Q);
  117.        
  118.         while(!FINELISTA(pos, Q)){
  119.                 tmp = pos;
  120.                 pos = SUCCLISTA(pos);
  121.                 CANCLISTA(&tmp);
  122.         }
  123. }
  124.  
  125. void FUORICODA(coda Q){
  126.        
  127.         posizione pos = PRIMOLISTA(Q);
  128.         CANCLISTA(&pos);
  129. }
  130.  
  131. tipoelem LEGGICODA(coda Q){
  132.        
  133.         tipoelem el;
  134.         posizione pos = PRIMOLISTA(Q);
  135.         el = pos->val;
  136.         return el;
  137. }
  138.  
  139. void INCODA(tipoelem el,coda Q){
  140.        
  141.         posizione pos = PRIMOLISTA(Q);
  142.        
  143.         while(!FINELISTA(pos, Q)){
  144.  
  145.                 pos = SUCCLISTA(pos);
  146.        
  147.         }      
  148.        
  149.         INLISTA(el, &pos);
  150.  
  151. }
  152.  
  153. coda REVERSECODA(coda Q){
  154.  
  155.     coda P = CREACODA();
  156.     posizione pos = PRIMOLISTA(Q);
  157.    
  158.     while(!FINELISTA(pos, Q)){
  159.         INCODA(pos->val, P);
  160.         CANCLISTA(&pos);
  161.         }      
  162.     P = REVERSELISTA(P);
  163.     return P;
  164. }
  165.  
  166. int APPARTCODA(tipoelem el,coda P){
  167.        
  168.         int flag = 0;
  169.         coda Q = CREACODA();
  170.        
  171.         while(!CODAVUOTA(P)){
  172.                 if(el == LEGGICODA(P)){
  173.                    flag = 1;
  174.                  }
  175.                    INCODA(LEGGICODA(P), Q);
  176.                    FUORICODA(P);
  177.     }
  178.  
  179.      while(!CODAVUOTA(Q)){
  180.            INCODA(LEGGICODA(Q), P);    
  181.            FUORICODA(Q);
  182.           }
  183.    
  184.     DISTRUGGICODA(Q);
  185.        
  186.   return flag;
  187. }