Advertisement
Guest User

Set.c

a guest
Nov 25th, 2015
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.30 KB | None | 0 0
  1. #include "set.h"
  2. #include <stdlib.h>
  3.  
  4. // Tipo de dado set (Conjunto).
  5. // Para garantir o ecapsulamento, 'struct SetStruct' só é definido em set.c.
  6. struct SetStruct{
  7.     SetType *v;
  8.     int size;
  9.     int capacity;
  10. };
  11.  
  12. // Cria um conjunto vazio.
  13. set new_set(){
  14.     set s = malloc(sizeof(struct SetStruct));
  15.     s->size = 0;
  16.     s->capacity = 20;
  17.     s->v = (SetType *)malloc(sizeof(SetType) * s->capacity);
  18.    
  19.     return s;
  20. }
  21.  
  22. // Testa se o cojunto está vazio.
  23. int empty(set s){
  24.     return s->size > 0 ? 1 : 0;
  25. }
  26.  
  27. // Retorna o número de elementos no conjunto.
  28. int size(set s){
  29.     return s->size;
  30. }
  31.  
  32. // Retorna um iterador para o primeiro (menor) elemento do conjunto.
  33. // Caso o conjunto esteja vazio, rentorna um ponteiro para end(s).
  34. iterator begin(set s){
  35.     return size(s) ? &s->v[0] : end(s);
  36. }
  37.  
  38. // Retorna um iterador para o "marcador de fim" do conjunto.
  39. iterator end(set s){
  40.     return &s->v[size(s)];
  41. }
  42.  
  43. // Retorna um iterador para o elemento seguinte ao indicado por x no conjunto.
  44. // Se x aponta para o último elemento do conjunto, retorna end(s);
  45. // Precondição: x aponta para um dos elementos do conjunto.
  46. iterator next(iterator x){
  47.     (SetType*)x;
  48.     return x++;
  49. }
  50.  
  51. // Retorna um iterador para o elemento anterior ao indicado por x no conjunto.
  52. // Precondição: x aponta para um dos elementos do cojunto (exceto o primeiro),
  53. // ou para end(s).
  54. iterator prev(iterator x){
  55.     (SetType*)x;
  56.     return x--;
  57. }
  58.  
  59. // Retorna a chave do elemento indicado por x.
  60. SetType key(iterator x){
  61.     return *((SetType*)x);
  62. }
  63.  
  64. // Retorna um iterador para o elemento k,
  65. // ou um iterador para end(s) caso k não pertença ao conjunto.
  66. // OBS: Note que esta função NÃO retorna {0, 1}. Para testar se um elemento 'a'
  67. // pertence a um conjunto 's', você deve escrever "if (find(a, &s) != end(&s))".
  68. iterator find(SetType k, set s){
  69.     for(iterator i = begin(s); i != end(s); i = next(i)){
  70.         if(key(i) == k) return i;
  71.     }
  72.     return end(s);
  73. }
  74.  
  75. // Insere k no conjunto.
  76. // Caso k já pertença ao conjunto, um novo elemento NÃO é inserido no
  77. // conjunto.
  78. void insert(SetType k, set s){
  79.     if(find(k,s) == end(s)){
  80.         printf("%d insert\n",k);
  81.         if(s->size == s->capacity){
  82.             reserve(s->capacity*2, s);         
  83.         }
  84.         s->v[s->size] = k;
  85.         s->size++;     
  86.     }
  87. }
  88.  
  89. void reserve(int m, set s){
  90.     SetType *aux;
  91.     aux = (SetType*)malloc(sizeof(SetType) * m);
  92.     for(int i = 0; i < s->size; i++){
  93.         aux[i] = s->v[i];
  94.     }
  95.     s->capacity = m;
  96.     s->v = aux;
  97. }
  98.  
  99. // Remove k do conjunto (caso lá ele esteja).
  100. void erase(SetType k, set s){
  101.     iterator x = find(k,s);
  102.     if(x != end(s)){
  103.         for(iterator i = x; i != end(s); i = next(i)){
  104.             *(SetType*)i = *(SetType*)next(i);
  105.         }
  106.         s->size--;
  107.     }
  108. }
  109.  
  110. // Remove todos os elementos do conjunto.
  111. void clear(set s){
  112.     iterator i = begin(s);
  113.     iterator aux;
  114.     while(!empty(s)){
  115.         aux = next(i);
  116.         erase(key(i),s);
  117.         i = aux;
  118.     }
  119. }
  120.  
  121. // Faz com que o conjunto q contenha exatamente os mesmos elementos
  122. // do cojunto s.
  123. void copy(set q, set s){
  124.     clear(q);
  125.    
  126.     for(iterator x = begin(s); x != end(s); x = next(x)){
  127.         insert(key(x),q);
  128.     }
  129. }
  130.  
  131. // Troca o conteúdo do conjunto q com o do conjunto s.
  132. void swap(set q, set s){
  133.     set aux = s;
  134.     s = q;
  135.     q = aux;
  136. }
  137.  
  138. // Libera toda a memória alocada para o conjunto.
  139. void delete_set(set s){
  140.     free(s->v);
  141. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement