Advertisement
wandrake

Untitled

Jun 26th, 2011
242
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.80 KB | None | 0 0
  1. /**
  2.  *   \file
  3.  *
  4.  *   \brief definizione di strutture e primitive per lo heap necessario
  5.  *   all'implementazione dell'algoritmo di Dijkstra
  6.  *
  7.  *   \author Alessandro Ambrosano
  8.  *   Si dichiara che il contenuto di questo file è in ogni sua parte
  9.  *   opera originale dell'autore.
  10.  */
  11.  
  12. #ifndef __HEAP_H_
  13. #define __HEAP_H_
  14. #include <stdio.h>
  15. #include <stdlib.h>
  16. #include <errno.h>
  17. #include "macro.h"
  18.  
  19. typedef struct status {
  20.     struct status* padre;
  21.     unsigned short* conf;
  22.     unsigned int distance;
  23. } status_t;
  24.  
  25. /** Elemento dello heap */
  26. typedef struct weighted_status {
  27.     /** Etichetta del nodo */
  28.     status_t* status;
  29.     /** Peso del nodo */
  30.     int weight;
  31. } wstatus_t;
  32.  
  33. /** Struttura contenente lo heap */
  34. typedef struct heap {
  35.     /** Numero di elementi contenuti nello heap */
  36.     int nval;
  37.     /** Numero di elementi massimo nello heap (variabile usata per doubling e halving) */
  38.     int maxval;
  39.     /** Array di puntatori a wnode_t, elementi veri e proprio dello heap */
  40.     wstatus_t** values;
  41. } heap_t;
  42.  
  43. /** crea uno heap
  44.     \retval p puntatore al nuovo heap (se tutto è andato bene)
  45.     \retval NULL se si è verificato un errore (setta errno)
  46.     (errno == ENOMEM se l'allocazione è fallita)
  47. */
  48. heap_t* heap_new();
  49.  
  50. /** aggiunge un nuovo elemento nello heap
  51.     \param h puntatore allo heap in cui aggiungere il nodo pesato
  52.     \param label etichetta del nodo pesato
  53.     \param weight peso del nodo pesato
  54.  
  55.     \retval 0 se tutto è andato bene
  56.     \retval -1 se si è verificato un errore (setta errno)
  57.     (errno == EINVAL se i parametri non sono validi)
  58.     (errno == ENOMEM se l'allocazione è fallita)
  59. */
  60. int heap_add (heap_t* h, wstatus_t* status, int weight);
  61.  
  62. /** modifica un elemento nello heap
  63.     \param h puntatore allo heap in cui modificare il peso del nodo
  64.     \param label nodo di cui modificare l'etichetta
  65.     \param weight nuova etichetta del nodo
  66.  
  67.     \retval 0 uscita senza errori
  68.     \retval -1 se si è verificato un errore (setta errno)
  69.     (errno == EINVAL se i parametri non sono validi (nodo inesistente o valore dell'etichetta non valido))
  70. */
  71. /* int heap_reduce(heap_t* h, int label, double weight); */
  72.  
  73. /** ordina opportunamente i valori all'interno di uno heap
  74.     \param h puntatore allo heap da ordinare
  75.     \param from da dove cominciare a ordinare
  76. */
  77. void heap_heapify (heap_t* h, int from);
  78.  
  79. /** stampa uno heap (funzione di debug)
  80.     \param h puntatore allo heap da stampare
  81. */
  82. void heap_print (heap_t* h);
  83.  
  84. /** estrae il primo elemento dello heap
  85.     \param h puntatore allo heap da cui estrarre
  86.  
  87.     \retval p puntatore al n
  88.     \retval NULL se si è verificato un errore (setta errno)
  89.     (errno == EINVAL se i parametri non sono validi (heap vuoto o h == NULL))
  90. */
  91. wstatus_t* heap_extract(heap_t* q);
  92.  
  93. #endif
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement