/// <summary> /// 获取边数 /// </summary> /// <returns></returns> public int GetNumOfEdge() { int sum = 0; for (int i = 0; i < vertexNodeList.Length; i++) { //当前邻接节点 VertexNode <T> current = vertexNodeList[i]; if (current.FirstAdjacentListNode != null) { sum++; AdjacentListNode adjNode = current.FirstAdjacentListNode.Next; //如果下一个邻接节点不为空,那么就有一条边 while (adjNode != null) { sum++; adjNode = adjNode.Next; } } } return(sum / 2); }
/// <summary> /// 是否是图的顶点 /// </summary> public bool IsNode(Node <T> v) { bool result = false; for (int i = 0; i < vertexNodeList.Length; i++) { VertexNode <T> current = vertexNodeList[i]; if (current.Data.Equals(v)) { result = true; break; } } return(result); }
/// <summary> /// 构造函数 /// </summary> /// <param name="nodes"></param> public GraphAdjacentList(Node <T>[] nodes) { //初始化临界点数组 vertexNodeList = new VertexNode <T> [nodes.Length]; for (int i = 0; i < nodes.Length; i++) { vertexNodeList[i] = new VertexNode <T>(nodes[i]); } //初始化已访问数据 visited = new int[nodes.Length]; //初始化遍历路线 path = new List <string>(); }
/// <summary> /// 顶点 v1,v2之间是否存在边 /// </summary> /// <param name="v1"></param> /// <param name="v2"></param> /// <returns></returns> public bool IsEdge(Node <T> v1, Node <T> v2) { bool result = false; //首先判断v1,v2是否是图的顶点 if (!IsNode(v1) || !IsNode(v2)) { return(result); } //获取v1,v2的顶点索引 int index1 = GetNodeIndex(v1); int index2 = GetNodeIndex(v2); //获取v1,v2对应的邻接点 VertexNode <T> vertexNode1 = this[index1]; VertexNode <T> vertexNode2 = this[index2]; /* * //对于大图来说,可以考虑多线程查找。 * //同时开始v1的邻接点是否包含v2; * /同时开始v2的邻接点是否包含v1; * 任何一个找到则停止查找 */ if (vertexNode1.FirstAdjacentListNode != null) { //查询vertexNode1第一个邻接点是不是v2 if (vertexNode1.FirstAdjacentListNode.AdjacentVertexNodeIndex == index2) { return(true); } //依次查找第一个邻接点的下一个节点是不是v2 AdjacentListNode p = vertexNode1.FirstAdjacentListNode.Next; while (p != null) { if (p.AdjacentVertexNodeIndex == index2) { return(true); } p = p.Next; } } return(result); }
/// <summary> /// 删除相邻接节点v1中的节点node /// </summary> /// <param name="v1">邻接节点</param> /// <param name="node">节点</param> /// <remarks> /// 邻接节点vertexNode1删除 node /// 1判断FirstAdjacentNode是不是空,如果是空,直接返回 /// 2 判断node是不是FirstAdjacentNode, /// (a)如果是,VertextNode需要调整FirstAdjacentNode与FirstAdjacentNode的Next; /// (b)如果否,VetrextNode需要调整FirstAdjacentNode的Next节点 /// </remarks> private void DeleteNodeToVertexNode(VertexNode <T> v1, Node <T> node) { int index2 = GetNodeIndex(node); if (v1.FirstAdjacentListNode == null) { return; } AdjacentListNode p = v1.FirstAdjacentListNode; if (p.AdjacentVertexNodeIndex == index2) { if (p.Next != null) { AdjacentListNode firstAdj = new AdjacentListNode(p.Next.AdjacentVertexNodeIndex, p.Next.Next); v1.FirstAdjacentListNode = firstAdj; } else { v1.FirstAdjacentListNode = null; } } else { AdjacentListNode front = v1.FirstAdjacentListNode; //查找node位置 while (p != null) { if (p.AdjacentVertexNodeIndex == index2) { break; } front = p; p = p.Next; } if (p != null) { //为什么front=p.next是错误的??? front.Next = p.Next; } } }
/// <summary> /// 相邻接节点添加节点 /// </summary> /// <param name="v1">邻接节点</param> /// <param name="node">节点</param> /// <remarks> /// 邻接节点vertexNode1添加 node /// 1判断FirstAdjacentNode是不是空,如果是空直接把node设为FirstAdjacentNode,返回 /// 2如果不为空判断node插入位置是不是FirstAdjacentNode, /// (a)如果是,VertextNode需要调整FirstAdjacentNode与FirstAdjacentNode的Next; /// (b)如果否,VetextNode需要调整FirstAdjacentNode的Next节点 /// </remarks> private void AddNodeToVertexNode(VertexNode <T> v1, Node <T> node) { int index2 = GetNodeIndex(node); if (v1.FirstAdjacentListNode == null) { v1.FirstAdjacentListNode = new AdjacentListNode(index2); return; } if (v1.FirstAdjacentListNode.AdjacentVertexNodeIndex > index2) { AdjacentListNode firstAdj = new AdjacentListNode(index2, v1.FirstAdjacentListNode); v1.FirstAdjacentListNode = firstAdj; } else { AdjacentListNode p = v1.FirstAdjacentListNode; AdjacentListNode front = v1.FirstAdjacentListNode; //查找插入位置 while (p != null) { if (p.AdjacentVertexNodeIndex > index2) { break; } front = p; p = p.Next; } //插入最后 if (p == null) { front.Next = new AdjacentListNode(index2); } //插入中间 else { front.Next = new AdjacentListNode(index2, p); } } }
/// <summary> /// 深度优先遍历图当前邻接点 /// </summary> /// <param name="vertexNode">当前邻接点</param> public void DeepFirstSearch(int currentIndex, ref string currenNodeData) { visited[currentIndex] = 1; VertexNode <T> currentVertextNode = vertexNodeList[currentIndex]; currenNodeData += currentVertextNode.Data.Data.ToString(); currenNodeData += pathSplitchar; AdjacentListNode p = currentVertextNode.FirstAdjacentListNode; while (p != null) { if (visited[p.AdjacentVertexNodeIndex] == 0) { DeepFirstSearch(p.AdjacentVertexNodeIndex, ref currenNodeData); } p = p.Next; } }