您的位置:首页 > 编程语言 > Java开发

邻接表(Java)

2016-03-11 22:21 344 查看

一、邻接表无线图

无向图的邻接表结构如下所示:



无向图的邻接表的代码实现:

/*
* 邻接表无向图(已提供参数)
* 输入说明:vexs  --  顶点数组
* 		   edges  --  边数组
* 输出说明:邻接表(即每个顶点所连接的点)
*/
package test;
public class ListUDG {
int vlen; // 顶点个数
int elen; // 边个数
VertexNode[] vertexNodeList; // 顶点数组
EdgeNode edgeNode;

/**
* 构造函数
* @param vexs
* @param edges
*/
public ListUDG(char[] vexs, char[][] edges) {
vlen = vexs.length;
elen = edges.length;

// 初始化顶点,建立顶点表
vertexNodeList = new VertexNode[vlen];
for (int i = 0; i < vlen; i++) {
vertexNodeList[i] = new VertexNode();
vertexNodeList[i].vertex = vexs[i];
vertexNodeList[i].firstedge = null;
}

// 初始化边,利用头插法建立邻接表
for (int i = 0; i < elen; i++) {
EdgeNode edgeNode_1 = new EdgeNode();
EdgeNode edgeNode_2 = new EdgeNode();
int vi = getPosition(edges[i][0], vexs);
int vj = getPosition(edges[i][1], vexs);

edgeNode_1.adjvex = edges[i][1];
edgeNode_1.next = vertexNodeList[vi].firstedge;
vertexNodeList[vi].firstedge = edgeNode_1;

edgeNode_2.adjvex = edges[i][0];
edgeNode_2.next = vertexNodeList[vj].firstedge;
vertexNodeList[vj].firstedge = edgeNode_2;
}
}

/**
*  顶点表结点
*/
private class VertexNode {
char vertex; // 顶点域,存储顶点信息
EdgeNode firstedge; // 边表头指针
}

/**
*  边表结点
*/
private class EdgeNode {
char adjvex; // 邻接点域,存储该顶点对应的下标
EdgeNode next; // 链域,指向下一个邻接点
}

/**
*  返回ch位置
*/
private int getPosition(char ch, char[] vexs) {
for (int i = 0; i < vlen; i++)
if (vexs[i] == ch)
return i;
return -1;
}

/**
*  打印邻接表
*/
public void print() {
System.out.printf("AdjList:\n");
for (int i = 0; i < vlen; i++) {
System.out.print(vertexNodeList[i].vertex + "-->");
if (vertexNodeList[i].firstedge != null) {
EdgeNode mEdgeNode = new EdgeNode();
mEdgeNode = vertexNodeList[i].firstedge;
System.out.print(mEdgeNode.adjvex);
while (mEdgeNode.next != null) {
mEdgeNode = mEdgeNode.next;
System.out.print(mEdgeNode.adjvex);
}
System.out.print("\n");
} else {
System.out.print("\n");
}
}
}

/**
* 主函数
* @param args
*/
public static void main(String args[]) {
// 顶点数组
char[] vexs = {
'A', 'B', 'C', 'D'
};
// 边数组
char[][] edges = new char[][] {
{
'A', 'B'
}, {
'A', 'C'
}, {
'A', 'D'
}, {
'B', 'D'
}, {
'C', 'D'
}
};

ListUDG listUDG = new ListUDG(vexs, edges);
listUDG.print();
}
}

代码输出结果:

AdjList:
A-->DCB
B-->DA
C-->DA
D-->CBA

二、邻接表有向图

有向图的邻接表结构如下所示:



有向图的邻接表的代码实现:

/*
* 邻接表有向图(已提供参数)
* 输入说明:vexs  --  顶点数组
* 		   edges  --  边数组
* 输出说明:邻接表(即对每个顶点vi都建立一个链接为vi为弧尾的表)
*/
package test;
public class ListDG {
int vlen; // 顶点个数
int elen; // 边个数
VertexNode[] vertexNodeList; // 顶点数组
EdgeNode edgeNode;

/**
* 构造函数
* @param vexs
* @param edges
*/
public ListDG(char[] vexs, char[][] edges) {
vlen = vexs.length;
elen = edges.length;

// 初始化顶点,建立顶点表
vertexNodeList = new VertexNode[vlen];
for (int i = 0; i < vlen; i++) {
vertexNodeList[i] = new VertexNode();
vertexNodeList[i].vertex = vexs[i];
vertexNodeList[i].firstedge = null;
}

// 初始化边,利用头插法建立邻接表
for (int i = 0; i < elen; i++) {
EdgeNode edgeNode = new EdgeNode();
int vi = getPosition(edges[i][0], vexs);
int vj = getPosition(edges[i][1], vexs);

edgeNode.adjvex = edges[i][1];
edgeNode.next = vertexNodeList[vi].firstedge;
vertexNodeList[vi].firstedge = edgeNode;
}
}

/**
*  顶点表结点
*/
private class VertexNode {
char vertex; // 顶点域,存储顶点信息
EdgeNode firstedge; // 边表头指针
}

/**
*  边表结点
*/
private class EdgeNode {
char adjvex; // 邻接点域,存储该顶点对应的下标
EdgeNode next; // 链域,指向下一个邻接点
}

/**
*  返回ch位置
*/
private int getPosition(char ch, char[] vexs) {
for (int i = 0; i < vlen; i++)
if (vexs[i] == ch)
return i;
return -1;
}

/**
*  打印邻接表
*/
public void print() {
System.out.printf("AdjList:\n");
for (int i = 0; i < vlen; i++) {
System.out.print(vertexNodeList[i].vertex + "-->");
if (vertexNodeList[i].firstedge != null) {
EdgeNode mEdgeNode = new EdgeNode();
mEdgeNode = vertexNodeList[i].firstedge;
System.out.print(mEdgeNode.adjvex);
while (mEdgeNode.next != null) {
mEdgeNode = mEdgeNode.next;
System.out.print(mEdgeNode.adjvex);
}
System.out.print("\n");
} else {
System.out.print("\n");
}
}
}

/**
* 主函数
* @param args
*/
public static void main(String args[]) {
// 顶点数组
char[] vexs = {
'A', 'B', 'C', 'D'
};
// 边数组
char[][] edges = new char[][] {
{
'A', 'B'
}, {
'A', 'C'
}, {
'A', 'D'
}, {
'B', 'D'
}, {
'C', 'D'
}
};

ListDG listDG = new ListDG(vexs, edges);
listDG.print();
}
}
代码输出结果:

AdjList:
A-->DCB
B-->D
C-->D
D-->
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: