图(一)——实现用邻接表表示图

本文介绍了一种使用邻接表表示有向图的方法,并提供了详细的Java代码实现。通过定义顶点、链表节点及图类,实现了图的构建、边的添加及查询功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

现在在看图。说是邻接表是用来表示图的标准方法,我照着自己的理解写了一个用来表示一个有向图,只是用来表示图而已,没有做任何其它的工作。也不知道规范不规范。

[java]  view plain copy
  1. /** 
  2.  * 图的顶点 
  3.  */  
  4. package com.mygraph;  
  5.   
  6. public class Vertex {  
  7.       
  8.     private Object num; //顶点的名称  
  9.     public Link  link;  //链表,用来存放从该顶点出发的边的信息  
  10.       
  11.     public Vertex(Object num){  
  12.           
  13.         this.num=num;  
  14.         link=new Link();          
  15.     }  
  16. }  

 

[java]  view plain copy
  1. /** 
  2.  * 链表的节点 
  3.  */  
  4. package com.mygraph;  
  5.   
  6. public class Node {  
  7.   
  8.     private Object verNum;   //顶点的名称  
  9.     private int weight;      //到顶点verNum的边的权重  
  10.     public Node next;  
  11.       
  12.     public Node(Object verNum,int weight){  
  13.           
  14.         this.verNum=verNum;  
  15.         this.weight=weight;  
  16.         next=null;  
  17.     }  
  18.   
  19.     public Object getVerNum() {  
  20.         return verNum;  
  21.     }  
  22.   
  23.     public int getWeight() {  
  24.         return weight;  
  25.     }  
  26. }  


 

[java]  view plain copy
  1. /** 
  2.  * 链表,存放边的信息 
  3.  */  
  4. package com.mygraph;  
  5.   
  6. public class Link {  
  7.       
  8.     Node current;  
  9.     Node first;  
  10.       
  11.     public Link(){  
  12.         current=null;  
  13.         first=null;  
  14.     }  
  15.     //增加节点  
  16.     public void add(Object num,int weight){  
  17.           
  18.         Node tempNode=new Node(num, weight);  
  19.         if(current==null){  
  20.             current=tempNode;  
  21.             first=tempNode;  
  22.         }     
  23.         else {  
  24.             current.next=tempNode;  
  25.             current=tempNode;  
  26.         }  
  27.           
  28.     }  
  29.     //遍历该链表    即遍历从某顶点出发的所有边  
  30.     public void trackLink(int from){  
  31.           
  32.         Node cursor=first;  
  33.         if(cursor==null)  
  34.             System.out.println("从顶点\""+from+"\"出发没有边!");  
  35.         while(cursor!=null)  
  36.         {  
  37.             System.out.println("边:<"+from+","+cursor.getVerNum()+"> 权="+cursor.getWeight());  
  38.             cursor=cursor.next;  
  39.         }  
  40.     }  
  41. }  


 

[java]  view plain copy
  1. /** 
  2.  * 图 
  3.  */  
  4. package com.mygraph;  
  5.   
  6. public class Graph {  
  7.   
  8.     //图的顶点  
  9.     Vertex[] vertexs;  
  10.     //构建图,nums图中顶点的个数  
  11.     public Graph(int nums){  
  12.           
  13.         vertexs=new Vertex[nums+1];  
  14.         for(int i=1;i<=nums;i++)  
  15.             vertexs[i]=new Vertex(i);     
  16.     }  
  17.     //增加边  
  18.     public void addEdge(int from,int to,int weight){  
  19.           
  20.         vertexs[from].link.add(to, weight);  
  21.           
  22.     }  
  23.     //查找从某顶点出发的所有边  
  24.     public  void queryEdges(int VetexNum){  
  25.           
  26.         vertexs[VetexNum].link.trackLink(VetexNum);  
  27.     }  
  28.       
  29.     public static void main(String[] args){  
  30.           
  31.         Graph graph=new Graph(7);  
  32.         graph.addEdge(123);  
  33.         graph.addEdge(135);  
  34.         graph.addEdge(146);  
  35.         graph.addEdge(246);  
  36.         graph.addEdge(253);  
  37.         graph.addEdge(361);  
  38.         graph.addEdge(434);  
  39.         graph.addEdge(466);  
  40.         graph.addEdge(473);  
  41.         graph.addEdge(545);  
  42.         graph.addEdge(577);  
  43.         graph.addEdge(764);  
  44.           
  45.         for(int i=1;i<=7;i++)  
  46.         {  
  47.             System.out.println("顶点"+i);  
  48.             graph.queryEdges(i);  
  49.             System.out.println("**********************");  
  50.         }           
  51.     }  
  52. }  


        代码里试图表示的是下面这个有向图:

运行结果:

顶点1
边:<1,2> 权=3
边:<1,3> 权=5
边:<1,4> 权=6
**********************
顶点2
边:<2,4> 权=6
边:<2,5> 权=3
**********************
顶点3
边:<3,6> 权=1
**********************
顶点4
边:<4,3> 权=4
边:<4,6> 权=6
边:<4,7> 权=3
**********************
顶点5
边:<5,4> 权=5
边:<5,7> 权=7
**********************
顶点6
从顶点"6"出发没有边!
**********************
顶点7
边:<7,6> 权=4
**********************

        应该算是把这个有向图表示出来了吧。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值