edge.c 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202
  1. /*!
  2. Temelia - Graph Edge implementation source file.
  3. Copyright (C) 2008, 2009 Ceata (http://ceata.org/proiecte/temelia).
  4. @author Dascalu Laurentiu
  5. This program is free software; you can redistribute it and
  6. modify it under the terms of the GNU General Public License
  7. as published by the Free Software Foundation; either version 3
  8. of the License, or (at your option) any later version.
  9. This program is distributed in the hope that it will be useful,
  10. but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. GNU General Public License for more details.
  13. You should have received a copy of the GNU General Public License
  14. along with this program; if not, write to the Free Software
  15. Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  16. */
  17. #include "include/edge.h"
  18. #include <stdio.h>
  19. #include <stdlib.h>
  20. DECLSPEC char DFS_edge_Types[4][10] =
  21. { "tree", "forward", "back", "cross" };
  22. DECLSPEC char BFS_edge_Types[10][5] =
  23. { "tree", "back", "cross" };
  24. struct _edge_t
  25. {
  26. /*! vertices */
  27. vertex_t vertex1, vertex2;
  28. /*! cost */
  29. double cost;
  30. /*! label */
  31. char *label;
  32. /*! type */
  33. int type;
  34. /*! user's key */
  35. void *key;
  36. };
  37. edge_t edge_new(vertex_t vertex1, vertex_t vertex2, double cost, char *label,
  38. void *key)
  39. {
  40. edge_t edge;
  41. edge = (struct _edge_t *) _new(sizeof(struct _edge_t));
  42. edge->label = label;
  43. edge->vertex1 = vertex1;
  44. edge->vertex2 = vertex2;
  45. edge->cost = cost;
  46. edge->key = key;
  47. edge->type = 0;
  48. return edge;
  49. }
  50. void edge_delete(edge_t edge)
  51. {
  52. _ASSERT(edge, ==, NULL, NULL_POINTER,);
  53. edge->cost = 0;
  54. edge->label = NULL;
  55. edge->vertex1 = edge->vertex2 = NULL;
  56. edge->key = NULL;
  57. _delete(edge);
  58. }
  59. vertex_t edge_get_vertex1(edge_t edge)
  60. {
  61. _ASSERT(edge, ==, NULL, NULL_POINTER, NULL);
  62. return edge->vertex1;
  63. }
  64. vertex_t edge_get_vertex2(edge_t edge)
  65. {
  66. _ASSERT(edge, ==, NULL, NULL_POINTER, NULL);
  67. return edge->vertex2;
  68. }
  69. vertex_t edge_complementary_vertex(edge_t edge, vertex_t vertex)
  70. {
  71. _ASSERT(edge, ==, NULL, NULL_POINTER, NULL);
  72. if (edge->vertex1 == vertex)
  73. return edge->vertex2;
  74. else if (edge->vertex2 == vertex)
  75. return edge->vertex1;
  76. return NULL;
  77. }
  78. double edge_get_cost(edge_t edge)
  79. {
  80. _ASSERT(edge, ==, NULL, NULL_POINTER, TEMELIA_INFINITY);
  81. return edge->cost;
  82. }
  83. int edge_get_type(edge_t edge)
  84. {
  85. _ASSERT(edge, == , NULL, NULL_POINTER, -1);
  86. return edge->type;
  87. }
  88. void *edge_get_key(edge_t edge)
  89. {
  90. _ASSERT(edge, ==, NULL, NULL_POINTER, NULL);
  91. return edge->key;
  92. }
  93. char *edge_get_label(edge_t edge)
  94. {
  95. _ASSERT(edge, ==, NULL, NULL_POINTER, NULL);
  96. return edge->label;
  97. }
  98. void edge_set_vertex1(edge_t edge, vertex_t vertex)
  99. {
  100. _ASSERT(edge, ==, NULL, NULL_POINTER,);
  101. edge->vertex1 = vertex;
  102. }
  103. void edge_set_vertex2(edge_t edge, vertex_t vertex)
  104. {
  105. _ASSERT(edge, ==, NULL, NULL_POINTER,);
  106. edge->vertex2 = vertex;
  107. }
  108. void edge_set_cost(edge_t edge, double cost)
  109. {
  110. _ASSERT(edge, ==, NULL, NULL_POINTER,);
  111. edge->cost = cost;
  112. }
  113. void edge_set_type(edge_t edge, int type)
  114. {
  115. _ASSERT(edge, ==, NULL, NULL_POINTER,);
  116. edge->type = type;
  117. }
  118. void edge_set_key(edge_t edge, void *key)
  119. {
  120. _ASSERT(edge, ==, NULL, NULL_POINTER,);
  121. edge->key = key;
  122. }
  123. void edge_set_label(edge_t edge, char *label)
  124. {
  125. _ASSERT(edge, ==, NULL, NULL_POINTER,);
  126. edge->label = label;
  127. }
  128. void edge_debug(edge_t edge, void *stream)
  129. {
  130. _ASSERT(edge, ==, NULL, NULL_POINTER,);
  131. if (stream == NULL)
  132. stream = stdout;
  133. fprintf(stream,
  134. "vertex1 %u, vertex2 %u, label %s, cost %lf, type %d, key %p\n",
  135. vertex_get_identifier(edge->vertex1), vertex_get_identifier(
  136. edge->vertex2), edge->label, edge->cost, (int) edge->type,
  137. edge->key);
  138. }
  139. void edge_switch_vertices(edge_t edge)
  140. {
  141. vertex_t aux;
  142. _ASSERT(edge, ==, NULL, NULL_POINTER,);
  143. aux = edge->vertex1;
  144. edge->vertex1 = edge->vertex2;
  145. edge->vertex2 = aux;
  146. }