Liba

final.h

Jul 22nd, 2014
248
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 11.09 KB | None | 0 0
  1. /**
  2.  * CÓDIGO DESENVOLVIDO PELOS ALUNOS CÉZAR DONIZETE MENDES JUNIOR E LIBÉRIO MARTINS SILVA.
  3.  *
  4.  * UFLA 2014, Desenvolvimento do 3º trabalho de AED III.
  5.  *
  6.  * Cadastro de voos com índice organizado em Árvore B e passageiros em árvore AVL
  7.  *  
  8.  * Este trabalho consiste em implementar um sistema para armazenar e buscar informações sobre
  9.  * voos. O sistema seria utilizado por operadores de aeroportos para controlar voos e que
  10.  * passageiros estão neles. A busca por passageiros em um voo em diversos momentos, bem como
  11.  * a busca por voos são operações críticas, e portanto, devem ser realizadas com a maior eficiência.
  12.  *
  13.  * @author Cézar Donizete Mendes Júnior
  14.  * @author Libério Martins Silva
  15. */
  16. /**
  17.  * Variável estática que define a ordem das páginas da árvore B (árvore
  18.  * de voos).
  19.  */
  20. #define ORDER 2
  21. /**
  22.  * Variável estática que define o tamanho máximo das posições das
  23.  * páginas da ávore B. Este valor é dado pelo dobro da ordem da árvore.
  24.  */
  25. #define MAX_INDEX ORDER*2
  26.  
  27. /**
  28.  * Estrutura de armazenamento das informações de um passageiro. Contém
  29.  * um passaporte, que será a chave do registro, o nome, poltrona e
  30.  * código do voo do passageiro.
  31.  */
  32. struct Passager {
  33.     char pass[11]; /* Chave. */
  34.     char name[101];
  35.     char chair[4];
  36.     char code_Plane[16];
  37. } Passager;
  38.  
  39. /**
  40.  * Estrutura de armazenamento das informações de um voo. Contém o código
  41.  * do mesmo, que será sua chave, o aeroporto de partida e de destino, o
  42.  * tempo de voo e a empresa aérea.
  43.  */
  44. struct Plane {
  45.     char code_Plane[16]; /* chave */
  46.     char arrival_Airport[4];
  47.     char dest_Airport[4];
  48.     char plane_Time[6];
  49.     char enterprise[3];
  50. } Plane;
  51.  
  52. /**
  53.  * Estrutura de armazenamento dos dados de um passageiro na árvore AVL
  54.  * correspondente (voo na qual a mesma está alocada), juntamente com
  55.  * ponteiros que indicam seus nós filhos. Nesta estrutura há também uma
  56.  * variável do tipo inteiro que armazena o fator de balanceamento de
  57.  * cada nó.
  58.  */
  59. typedef struct Nodo {
  60.     struct Nodo* pRight;
  61.     struct Nodo* pLeft;
  62.     int factor_Balance;
  63.     struct Passager info;
  64. } Nodo;
  65.  
  66. /**
  67.  * Estrutura de índices de um voo na árvore B. Possui um campo que
  68.  * armazena a posição onde o voo está dentro do arquivo de dados e
  69.  * um vetor de caracteres que armazena a chave do voo.
  70.  */  
  71. struct Index {
  72.     long RRN_Plane;
  73.     char key_Plane[16];
  74. }Index;
  75.  
  76. /**
  77.  * Estrutura que contém os dados de uma página gerada na árvore B.
  78.  * Contém um campo com o número de voos guardados dentro desta página,
  79.  * um vetor que armazena os voos contidos nela e um outro vetor que
  80.  * armazena o RNN das suas páginas filhas.
  81.  */
  82. struct Page {
  83.     short num_Plane;
  84.     struct Index planes[MAX_INDEX];
  85.     long RRN_Son[MAX_INDEX + 1];
  86. }Page;
  87.  
  88. /**
  89.  * Método de carrega a raiz da árvore de índices.
  90.  * @param FILE *p: Arquivo onde está armazenada a árvore de índices
  91.  * @return Long contendo o RRN da raiz da árvore de índices.
  92.  */
  93. long load_RRN_Root(FILE *p);
  94.  
  95. /**
  96.  * Método que salva os dados de um voo no arquivo de dados.
  97.  * @param char data[]: String contendo as informações do voo
  98.  */
  99. void save_Plane (char data[]);
  100.  
  101. /**
  102.  * Método que separa a string de dados de voo recebida em seus
  103.  * respectivos campos, chama o método inserir e verifica se há uma
  104.  * promoção. Se houver, cria uma nova página para o elemtno promovido.
  105.  * @param char data[]: String contendo as informações do voo
  106.  */
  107. void insert_Plane_Driver(char data[]);
  108.  
  109. /**
  110.  * Método de inserção de um novo voo.
  111.  * @param FILE *p: Arquivo contendo a árvore de índices.
  112.  * @param long RRN_Atual_Page: Contém a página atual onde o voo será inserido (inicialmente é a página raiz).
  113.  * @param struct Index key_to_Insert: Chave que será inserida.
  114.  * @param char data[]: Dados do voo que será inserido.
  115.  * @param struct Index **promoter: Índice que será promovido (usado apenas em casos de inserção em página cheia).
  116.  * @param long **right_Son_Page: RRN do filho à direita do índice promovido.
  117.  * @return Um inteiro que identifica se houve promoção, não promoção ou erro.
  118.  */
  119. int insert_Plane(FILE *p, long RRN_Atual_Page, struct Index key_to_Insert, char data[], struct Index **promoter, long **right_Son_Page);
  120.  
  121. /**
  122.  * Método que busca um determinado voo dentro da árvore de índices.
  123.  * @param FILE *p: Arquivo de índices
  124.  * @param long RRN_Atual_Page: Página atual (inicialmente a raiz). Chama recursivamente até achar a página onde está contida a chave do voo buscado.
  125.  * @param char key_Plane[]: Chave do voo buscado
  126.  * @return Um inteiro indicando se houve sucesso (1) ou erro (0) na busca.
  127.  */
  128. int search_Plane(FILE *p, long RRN_Atual_Page, char key_Plane[]);
  129.  
  130. /**
  131.  * Método que chama o método remoção. Caso haja underflow, ele chama
  132.  * o método agreement (junção de páginas).
  133.  * @param char key_Plane[]: Chave do voo que será removido.
  134.  */
  135. void remove_Plane_Driver(char key_Plane[]);
  136.  
  137. /**
  138.  * Método de remoção de um voo da árvore de índices.
  139.  * @param FILE *p: Arquivo contendo a árvore de índices.
  140.  * @param long RRN_Atual_Page: Contém a página atual do voo que será removido (inicialmente é a página raiz).
  141.  * @param struct Index key_to_Insert: Chave que será removida.
  142.  * @param int changing: Verifica se haverá troca.
  143.  * @param struct Index *changer_Plane: Grava os dados do menor da esquerda, que será "promovido" caso haja remoção de um nó pai.
  144.  * @param int *underflow: Verifica se haverá underflow.
  145.  * @return Um inteiro que identifica se houve sucesso ou erro.
  146.  */
  147. int remove_Plane(FILE *p, long RRN_Atual_Page, char key_Plane[], int changing, struct Index *changer_Plane, int *underflow);
  148.  
  149. /**
  150.  * Método que imprime os dados de um voo, armazenados no arquivo de dados.
  151.  * @param long RRN: Posição no arquivo de dados do voo que será exibido.
  152.  */
  153. void print_Index_Plane(long RRN);
  154.  
  155. /**
  156.  * Função que irá dividir uma página que não cabe
  157.  * mais indices em duas páginas, criando assim uma nova.
  158.  * E vai mandar um elemento promovido.
  159.  * @param struct Page *atual_Page: Página atual que estava cheia passada por referência.
  160.  * @param struct Page *new_Page: Nova página que será criada passada por referência.
  161.  * @param struct Index promoter: Indice que será promovido no split.
  162.  * @param long long right_Son_Page: FIlho a direita do elemento que será promovido.
  163.  * @return
  164.  */
  165. void split(struct Page *atual_Page, struct Page *new_Page, struct Index promoter, long right_Son_Page);
  166.  
  167. /**
  168.  * Função que será utilizada para pegar uma página raiz
  169.  * e suas filhas e fazer uma única página a fim de evitar
  170.  * o underflow.
  171.  * @param struct Index father: Indice que está na página raiz.
  172.  * @param struct Page right_Son: Página fiha a direita.
  173.  * @param struct Page left_Son: Página fiha a esquerda.
  174.  * @param struct Page *newbie_Page: Página passada por referência que será a nova página após a união das 3.
  175.  * @return
  176.  */
  177. void agreement(struct Index father, struct Page right_Son, struct Page left_Son, struct Page *newbie_Page);
  178.  
  179. /**
  180.  * Função que irá salvar uma página da memoria
  181.  * no disco.
  182.  * @param FILE *p: Ponteiro do arquivo de indices.
  183.  * @param long RRN_Page: RRN de onde a página será salva no disco.
  184.  * @param struct Page *page: Página que terá seus valores salvados do disco.
  185.  * @return
  186.  */
  187. void save_Page(FILE *p, long RRN_Page, struct Page *page);
  188.  
  189. /**
  190.  * Função que irá carregar uma página do disco
  191.  * e colocar a mesma em uma página da memória
  192.  * que será passada por referência.
  193.  * @param FILE *p: Ponteiro do arquivo de indices.
  194.  * @param long RRN_Page: RRN da página no disco.
  195.  * @param struct Page *page: Página passada por referência que terá seus valores carregados do disco.
  196.  * @return
  197.  */
  198. void load_Page(FILE *p, long RRN_Page, struct Page *page);
  199.  
  200. /**
  201.  * Função que irá inicializar uma nova página com valores
  202.  * padrões afim de evitar erros futuros.
  203.  * @param struct Page *page: Página passada por referência que terá seus valores alterados.
  204.  * @return
  205.  */
  206. void createNewPage(struct Page *page);
  207.  
  208. /**
  209.  * Função que irá imprimir toda a árvore de indices
  210.  * obdecendo todas as especificações.
  211.  * @param FILE *p: Ponteiro do arquivo de indices.
  212.  * @param long RRN: RRN da página atual que será imprimida.
  213.  * @return
  214.  */
  215. void print_Index_Tree(FILE *p, long RRN);
  216.  
  217. /**
  218.  * Função auxiliar para conservar alguns dados que são perdidos
  219.  * durante algumas operações no programa.
  220.  * @param FILE *p: Ponteiro do arquivo de indices.
  221.  * @return
  222.  */
  223. void pino(FILE *p);
  224.  
  225. /**
  226.  * Função que desaloca toda a árvore AVL da memória.
  227.  * @param struct Nodo* pNodo: Nodo atual que deseja ser desalocado.
  228.  */
  229. void cut_Tree (struct Nodo* pNodo);
  230.  
  231. /**
  232.  * Função para buscar qual o maior Nodo a esquerda de um Nodo dado
  233.  * como partida.
  234.  * @param struct Nodo* pNodo: Nodo atual na busca.
  235.  * @return
  236.  */
  237. struct Nodo* search_Biggest_Left(struct Nodo* pNodo);
  238.  
  239. /**
  240.  * Função que remove um passageiro da árvore AVL através
  241.  * de uma chave passada.
  242.  * @param char key_Pas[]: Chave que será removida.
  243.  * @param struct Nodo** pNodo: Nodo que será usado para a remoção.
  244.  * @return Retorna o maior Nodo a esquerda da ávore AVL.
  245.  */
  246. int remove_Pas(char key_Pas[], struct Nodo** pNodo);
  247.  
  248. /**
  249.  * Função que inseri um passageiro na árvore AVL a partir
  250.  * de um determinado Nodo.
  251.  * @param char data[]: Dados da chave a ser inserida.
  252.  * @param struct Nodo** pNodo: Nodo que será usado para a inserção.
  253.  * @return Retorna 1 em sucesso e 0 em erro.
  254.  */
  255. int insert_Pas (char data[], struct Nodo** pNodo);
  256.  
  257. /**
  258.  * Função que gira a árvoe AVL no sentido ant horário a fim de deixá-la
  259.  * balanceada, como é a caracteristica de uma árvore AVL.
  260.  * @param struct Nodo** pNodo: Nodo que será usado como ponto de partida para a rotação.
  261.  * @return Retorna 1 em sucesso e 0 em erro.
  262.  */
  263. void balance_AntiHorario(struct Nodo** pNodo);
  264.  
  265. /**
  266.  * Função que gira a árvoe AVL no sentido horário a fim de deixá-la
  267.  * balanceada, como é a caracteristica de uma árvore AVL.
  268.  * @param struct Nodo** pNodo: Nodo que será usado como ponto de partida para a rotação.
  269.  * @return
  270.  */
  271. void balance_Horario(struct Nodo** pNodo);
  272.  
  273. /**
  274.  * Função que busca um passageiro através de uma chave na árvore
  275.  * AVL que contem todos os passageiros de um determinado voo.
  276.  * @param char key_Pas[]: String com a chave do passageiro que será buscado.
  277.  * @param struct Nodo* pNodo: Ponteiro de Nodo do nodo atual na busca.
  278.  * @return
  279.  */
  280. struct Nodo* search_Pas(char key_Pas[], struct Nodo* pNodo);
  281.  
  282. /**
  283.  * Função que salva os dados de um passageiro
  284.  * no arquivo de passageiros.
  285.  * @param char data[]: String com os dados do passageiro como passaporte, nome, poltrona e passaporte.
  286.  * @return Retorna o passageiro encontrado, caso não encontrado retorna vazio.
  287.  */
  288. void save_Pas(char data[]);
  289.  
  290. /**
  291.  * Função que imprime todos os dados de
  292.  * um voo armazenado no arquivo de voos.
  293.  * @param long RRN: RNN(endereço) que indica em que lugar do arquivo de dados o voo está localizado.
  294.  * @return
  295.  */
  296. void print_Plane(long RRN);
Advertisement
Add Comment
Please, Sign In to add comment