Graph.cs 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. namespace DrawGraph
  7. {
  8. public class Graph
  9. {
  10. public Node[] Nodes;
  11. public Edge[] Edges;
  12. public string Name;
  13. public bool Direction;
  14. public Graph()
  15. {
  16. Nodes = new Node[0];
  17. Edges = new Edge[0];
  18. Name = "G";
  19. Direction = false;
  20. }
  21. public Graph(Node[] nodes)
  22. {
  23. Nodes = nodes;
  24. Name = "G";
  25. Direction = false;
  26. }
  27. public Graph(Node[] nodes, Edge[] edges)
  28. {
  29. Nodes = nodes;
  30. Edges = edges;
  31. Name = "G";
  32. Direction = false;
  33. }
  34. public Graph(Node[] nodes, Edge[] edges, string name)
  35. {
  36. Nodes = nodes;
  37. Edges = edges;
  38. Name = name;
  39. }
  40. public Graph(Node[] nodes, Edge[] edges, string name, bool isDirected)
  41. {
  42. Nodes = nodes;
  43. Edges = edges;
  44. Name = name;
  45. Direction = isDirected;
  46. }
  47. public void SetGraphName(string name)
  48. {
  49. Name = name;
  50. }
  51. public void Add(Node node)
  52. {
  53. var length = Nodes.Length;
  54. Array.Resize(ref Nodes, Nodes.Length + 1);
  55. Nodes[length] = node;
  56. }
  57. public void AddRange(Node[] node)
  58. {
  59. var startLength = Nodes.Length;
  60. Array.Resize(ref Nodes, Nodes.Length + node.Length);
  61. var j = 0;
  62. for(int i = startLength; i < Nodes.Length; i++)
  63. {
  64. Nodes[i] = node[j];
  65. j++;
  66. }
  67. }
  68. public void Add(Edge edge)
  69. {
  70. var length = Edges.Length;
  71. Array.Resize(ref Edges, Edges.Length + 1);
  72. }
  73. public void AddRange(Edge[] edge)
  74. {
  75. var startLength = Edges.Length;
  76. Array.Resize(ref Edges, Edges.Length + edge.Length);
  77. var j = 0;
  78. for(int i = startLength; i < Edges.Length; i++)
  79. {
  80. Edges[i] = edge[j];
  81. j++;
  82. }
  83. }
  84. public void RemoveNode(int index)
  85. {
  86. Nodes = RemoveAt(Nodes, index);
  87. }
  88. public void RemoveNode(Node node)
  89. {
  90. for(int i = 0; i < Nodes.Length; i++)
  91. {
  92. if(Node.Compare(Nodes[i], node))
  93. {
  94. Nodes = RemoveAt(Nodes, i);
  95. break;
  96. }
  97. }
  98. }
  99. public Node GetNode(int index)
  100. {
  101. return Nodes[index];
  102. }
  103. public Edge GetEdge(int index)
  104. {
  105. return Edges[index];
  106. }
  107. public void RemoveEdge(int index)
  108. {
  109. Nodes = RemoveAt(Nodes, index);
  110. }
  111. public void RemoveEdge(Edge edge)
  112. {
  113. for(int i = 0; i < Edges.Length; i++)
  114. {
  115. if(Edge.Compare(Edges[i], edge))
  116. {
  117. Edges = RemoveAt(Edges, i);
  118. break;
  119. }
  120. }
  121. }
  122. private T[] RemoveAt<T>(T[] source, int index)
  123. {
  124. T[] dest = new T[source.Length - 1];
  125. if (index > 0)
  126. Array.Copy(source, 0, dest, 0, index);
  127. if (index < source.Length - 1)
  128. Array.Copy(source, index + 1, dest, index, source.Length - index - 1);
  129. return dest;
  130. }
  131. }
  132. }