23.无向图邻接表类
namespace DSList
{
//无向图邻接表类(Undirected Graph Adjacency List Class)
public class GraphAdjList<T> : IGraph<T>
{
//Fields
private ALVexNode<T>[] adjList; //Vertex array
private int[] visited; //Auxiliary array of DFS() or BFS()
//Property
public ALVexNode<T> this[int index]
{
get
{
return adjList[index];
}
set
{
adjList[index] = value;
}
}
public int GetVisited(int index)
{
return visited[index];
}
public void SetVisited(int index,int val)
{
visited[index] = val;
}
//Constructor
public GraphAdjList(GvNode<T>[] nodes)
{
adjList = new ALVexNode<T>[nodes.Length];
for (int i = 0; i < nodes.Length; ++i)
{
adjList[i] = new ALVexNode<T>(nodes[i]);
}
visited = new int[adjList.Length];
for (int i = 0; i < visited.Length; ++i)
{
visited[i] = 0;
}
}
//Base methods
public int GetNumOfVertex()
{
return adjList.Length;
}
public int GetNumOfEdge()
{
int i = 0;
foreach (ALVexNode<T> nd in adjList)
{
AdjListNode<T> p = nd.FirstAdj;
while (p != null)
{
++i;
p = p.Next;
}
}
return i / 2;
}
public bool IsGvNode(GvNode<T> v)
{
foreach (ALVexNode<T> nd in adjList)
{
if (v.Equals(nd.Data))
{
return true;
}
}
return false;
}
public int GetIndex(GvNode<T> v)
{
int i = -1;
for (i = 0; i < adjList.Length; i++)
{
if (adjList[i].Data.Equals(v))
{
return i;
}
}
return i;
}
public void SetEdge(GvNode<T> v1, GvNode<T> v2, int v)
{
if (!IsGvNode(v1) || !IsGvNode(v2))
{
Console.WriteLine("GvNode is not belong to Graph!");
return;
}
if (v == 1)
{
AdjListNode<T> p = new AdjListNode<T>(GetIndex(v2));
if (adjList[GetIndex(v1)].FirstAdj == null)
{
adjList[GetIndex(v1)].FirstAdj = p;
p.Weight = v;
}
else
{
p.Next = adjList[GetIndex(v1)].FirstAdj;
adjList[GetIndex(v1)].FirstAdj = p;
p.Weight = v;
}
p = new AdjListNode<T>(GetIndex(v1));
if (adjList[GetIndex(v2)].FirstAdj == null)
{
adjList[GetIndex(v2)].FirstAdj = p;
p.Weight = v;
}
else
{
p.Next = adjList[GetIndex(v2)].FirstAdj;
adjList[GetIndex(v2)].FirstAdj = p;
p.Weight = v;
}
}
else
{
Console.WriteLine("Weight is not reght!");
return;
}
}
public void DelEdge(GvNode<T> v1, GvNode<T> v2)
{
if (!IsGvNode(v1) || !IsGvNode(v2))
{
Console.WriteLine("GvNode is not belong to Graph!");
return;
}
if (IsEdge(v1, v2) == true)
{
AdjListNode<T> p = adjList[GetIndex(v1)].FirstAdj;
AdjListNode<T> pre = null;
while (p != null && p.AdjVex != GetIndex(v2))
{
pre = p;
p = p.Next;
}
pre.Next = p.Next;
p = adjList[GetIndex(v2)].FirstAdj;
pre = null;
while (p != null && p.AdjVex != GetIndex(v1))
{
pre = p;
p = p.Next;
}
pre.Next = p.Next;
}
else
{
Console.WriteLine("Edge is not existent!");
return;
}
}
public bool IsEdge(GvNode<T> v1, GvNode<T> v2)
{
if (!IsGvNode(v1) || !IsGvNode(v2))
{
Console.WriteLine("GvNode is not belong to Graph!");
return false;
}
AdjListNode<T> p = adjList[GetIndex(v1)].FirstAdj;
while (p != null)
{
if (p.AdjVex == GetIndex(v2))
{
return true;
}
p = p.Next;
}
return false;
}
//无向图的深度优先遍历算法(Depth_First Search)
public void DFS()
{
for (int i = 0; i < visited.Length; ++i)
{
if (visited[i] == 0)
{
DFSAL(i);
}
}
}
//从某个顶点出发进行深度优先遍历
public void DFSAL(int i)
{
//输出遍历的顺序
Console.Write(adjList[i].Data.Data);
visited[i] = 1;
AdjListNode<T> p = adjList[i].FirstAdj;
while (p != null)
{
if (visited[p.AdjVex] == 0)
{
DFSAL(p.AdjVex);
}
p = p.Next;
}
}
//无向图的广度优先遍历算法(Breadth_First Search)
public void BFS()
{
for (int i = 0; i < visited.Length; ++i)
{
if (visited[i] == 0)
{
BFSAL(i);
}
}
}
//从某个顶点出发进行广度优先遍历
public void BFSAL(int i)
{
visited[i] = 1;
CSeqQueue<int> cq = new CSeqQueue<int>(visited.Length);
cq.In(i);
while (!cq.IsEmpty())
{
int k = cq.Out();
//输出遍历的顺序
Console.Write(adjList[k].Data.Data);
AdjListNode<T> p = adjList[k].FirstAdj;
while (p != null)
{
if (visited[p.AdjVex] == 0)
{
visited[p.AdjVex] = 1;
cq.In(p.AdjVex);
}
p = p.Next;
}
}
}
}
}