图的邻接表存储 java_邻接表存储图,DFS遍历图的java代码实现

import java.util.*;public classMain{static int MAX_VERTEXNUM = 100;static int [] visited = new int[MAX_VERTEXNUM];public static voidmain(String [] args){

Graph G= newGraph();

creatGraph(G);

output(G);for(int i=0;i

visited[i]=0;

System.out.println("DFS遍历的结果是:");

dfs(G,0);//从G.node_list[0]开始DFS遍历

}static voidcreatGraph(Graph G){

Scanner in= newScanner(System.in);

System.out.println("请输入顶点数v和边数e,(v e):");

G.vertex_num=in.nextInt();

G.edge_num=in.nextInt();

System.out.println("请输入各顶点信息:");for(int i=0;i

G.node_list[i]= newVertexNode();

G.node_list[i].date=in.next();

G.node_list[i].first_edge= null; //很重要

}

System.out.println("请输入各边信息(以空格隔开):");for(int i=0;i

EdgeNode p= newEdgeNode();

String str1=in.next();

String str2=in.next();int v1 =locateVex(G,str1);int v2 =locateVex(G,str2);

p.vertex=v1;

p.next=G.node_list[v2].first_edge;

G.node_list[v2].first_edge=p;

EdgeNode q= new EdgeNode();//如果是有向图,则不存在下面的代码(上面的代码的存储顺序可能有变化)

q.vertex =v2;

q.next=G.node_list[v1].first_edge;

G.node_list[v1].first_edge=q;

}

}static intlocateVex(Graph G,String s){for(int i=0;i

}return -1;

}static voidoutput(Graph G){

System.out.println("输出邻接表存储情况:");

EdgeNode p= newEdgeNode();for(int i=0;i

System.out.print(G.node_list[i].date);

p=G.node_list[i].first_edge;while(p!=null){

System.out.print("->"+G.node_list[p.vertex].date);

p=p.next;

}

System.out.println();

}

}static void dfs(Graph G,intk){

System.out.println(G.node_list[k].date);

visited[k]=1;

EdgeNode p= newEdgeNode();

p=G.node_list[k].first_edge;while(p!=null){if(visited[p.vertex]!=1)

dfs(G,p.vertex);

p=p.next;

}

}

}//顶点存储

classVertexNode{

String date;

EdgeNode first_edge= newEdgeNode();

}//边存储

classEdgeNode{intvertex;

EdgeNode next;

}//图存储

classGraph{

VertexNode [] node_list= new VertexNode[100];intvertex_num,edge_num;

}

//输出结果:注意:(邻接表的保存顺序与输入边的顺序有关)

db2442fa4b8de21dad9c3e5439c7296f.png

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值