Java数据结构——图-邻接表
用图-邻接表实现以下功能。有类似需求的也可以参考一下。

结点的关系图如下:

结点类和有参构造方法
/**
* 弧结点,表结点
*/
class arcNode {
String name; //存储相关人物的名字
String relation; //存储相关人物和主人公的关系
arcNode nextNode; //指向下一个结点的地址域
public arcNode(String name, String relation){
this.name = name;
this.relation = relation;
}
}
/**
* 顶点,表头结点
*/
class vexNode {
int E = 0; //表示连接这个顶点的边的数量
String name; //存储主人公名字
arcNode firstArc; //指针域
/**
* 尾插法,为表头结点添加邻接点和边的信息
* @param index:相关人物对应的顶点下标
* @param relation:相关人物和主人公的关系
* **/
public void linkedLast(int index,String relation){
arcNode newNode = new arcNode(vexs[index].name,relation);
if (this.E==0){
this.firstArc = newNode;
}else {
//生成一个临时指针遍历至最后一个表结点
arcNode tempNode = this.firstArc;
while (tempNode.nextNode != null){
tempNode = tempNode.nextNode;
}
//将新结点接到最后一个结点的后面
tempNode.nextNode = newNode;
}
this.E++;
}
}
/**
* 顶点数组
*/
vexNode[] vexs;
/**
* 构造方法,构造出只有顶点的图
* *
* @param vertex:各个顶点对应的名字的数组
*/
public Graph(String[] vertex) {
// 1.设置顶点数组大小
vexs = new vexNode[vertex.length];
// 2.初始化顶点数组
for (int i = 0; i < vexs.length; i++) {
vexs[i] = new vexNode();
vexs[i].name = vertex[i];
vexs[i].firstArc = null;
}
}
Graph类的成员方法
/**
* 给两个相邻顶点添加边
* @param index_1 :人物1对应的顶点下标
* @param index_2 :人物2对应的顶点下标
* @param relation :两个人物之间的关系
* **/
public void addEdge(int index_1, int index_2, String relation){
vexs[index_1].linkedLast(index_2,relation);
vexs[index_2].linkedLast(index_1,relation);
}
/**
* 查找某个人物在顶点数组中的下标,存在则返回其下标,不存在则返回-1
* @param name :要查找的人物的姓名
* **/
public int indexOf(String name){
//存在就返回该联系人的数组下标
for (int i=0;i< vexs.length;i++){
if (vexs[i].name.equals(name)){
return i;
}
}
return -1; //不存在则返回-1
}
/**
* 打印邻接表
* @param index :要打印的人物的顶点下标
* **/
public void printArc(int index){
if (vexs[index].E==0){
System.out.println("对不起,此人物不存在相关人物");
}else {
//遍历打印出信息
System.out.println(vexs[index].name+"的相关人物和关系如下:");
arcNode tempNode = vexs[index].firstArc;
while (tempNode != null){
System.out.println(tempNode.name+"--->"+tempNode.relation);
tempNode = tempNode.nextNode; //后移
}
}
}
/**
* 实现查询某个人物的相关人物和关系
* **/
public void findArc(){
Scanner sc = new Scanner(System.in);
System.out.println("请输入您要查询关系网的人物名字:");
String find_name = sc.next();
//查询到此人对应的顶点数组
int ret = indexOf(find_name);
if (ret != -1){
printArc(ret);
}else {
System.out.println("对不起,此人物不存在!");
}
}
测试数据
public class GraphTest {
public static void main(String[] args) {
//创建人物姓名数组
String[] str_name = {"程家阳","王旭东","文晓华","李雷","张翘楚","乔菲","吴嘉怡","高家明"};
//构造图
Graph graph = new Graph(str_name);
//添加边,即人物关系
graph.addEdge(0,1,"好友");
graph.addEdge(0,2,"初恋");
graph.addEdge(0,3,"同事");
graph.addEdge(0,4,"母亲");
graph.addEdge(0,5,"相爱");
graph.addEdge(1,6,"喜欢");
graph.addEdge(2,5,"情敌");
graph.addEdge(2,7,"一厢情愿");
graph.addEdge(3,5,"同事");
graph.addEdge(4,5,"反对在一起");
graph.addEdge(5,6,"喜欢");
graph.addEdge(5,7,"前男友");
//查询人物关系网
graph.findArc();
}
}
Graph类合并的源码
import java.util.Scanner;
public class Graph {
/**
* 弧结点,表结点
*/
class arcNode {
String name; //存储相关人物的名字
String relation; //存储相关人物和主人公的关系
arcNode nextNode; //指向下一个结点的地址域
public arcNode(String name, String relation){
this.name = name;
this.relation = relation;
}
}
/**
* 顶点,表头结点
*/
class vexNode {
int E = 0; //表示连接这个顶点的边的数量
String name; //存储主人公名字
arcNode firstArc; //指针域
/**
* 尾插法,为表头结点添加邻接点和边的信息
* @param index:相关人物对应的顶点下标
* @param relation:相关人物和主人公的关系
* **/
public void linkedLast(int index,String relation){
arcNode newNode = new arcNode(vexs[index].name,relation);
if (this.E==0){
this.firstArc = newNode;
}else {
//生成一个临时指针遍历至最后一个表结点
arcNode tempNode = this.firstArc;
while (tempNode.nextNode != null){
tempNode = tempNode.nextNode;
}
//将新结点接到最后一个结点的后面
tempNode.nextNode = newNode;
}
this.E++;
}
}
/**
* 顶点数组
*/
vexNode[] vexs;
/**
* 构造方法,构造出只有顶点的图
* *
* @param vertex:各个顶点对应的名字的数组
*/
public Graph(String[] vertex) {
// 1.设置顶点数组大小
vexs = new vexNode[vertex.length];
// 2.初始化顶点数组
for (int i = 0; i < vexs.length; i++) {
vexs[i] = new vexNode();
vexs[i].name = vertex[i];
vexs[i].firstArc = null;
}
}
/**
* 给两个相邻顶点添加边
* @param index_1 :人物1对应的顶点下标
* @param index_2 :人物2对应的顶点下标
* @param relation :两个人物之间的关系
* **/
public void addEdge(int index_1, int index_2, String relation){
vexs[index_1].linkedLast(index_2,relation);
vexs[index_2].linkedLast(index_1,relation);
}
/**
* 查找某个人物在顶点数组中的下标,存在则返回其下标,不存在则返回-1
* @param name :要查找的人物的姓名
* **/
public int indexOf(String name){
//存在就返回该联系人的数组下标
for (int i=0;i< vexs.length;i++){
if (vexs[i].name.equals(name)){
return i;
}
}
return -1; //不存在则返回-1
}
/**
* 打印邻接表
* @param index :要打印的人物的顶点下标
* **/
public void printArc(int index){
if (vexs[index].E==0){
System.out.println("对不起,此人物不存在相关人物");
}else {
//遍历打印出信息
System.out.println(vexs[index].name+"的相关人物和关系如下:");
arcNode tempNode = vexs[index].firstArc;
while (tempNode != null){
System.out.println(tempNode.name+"--->"+tempNode.relation);
tempNode = tempNode.nextNode; //后移
}
}
}
/**
* 实现查询某个人物的相关人物和关系
* **/
public void findArc(){
Scanner sc = new Scanner(System.in);
System.out.println("请输入您要查询关系网的人物名字:");
String find_name = sc.next();
//查询到此人对应的顶点数组
int ret = indexOf(find_name);
if (ret != -1){
printArc(ret);
}else {
System.out.println("对不起,此人物不存在!");
}
}
}
本文介绍如何使用Java实现图的邻接表数据结构,包括结点类的定义、Graph类的成员方法以及测试数据和完整源码展示,适合需要理解图数据结构的开发者参考。

6164

被折叠的 条评论
为什么被折叠?



