java数据结构之DirectGraph

 

1.MyLinkedListWithIterator:给vetex保存邻接边用,

由于要作为邻接边集合,所以开头不能有哨兵节点,即不能有含空data的节点

在构造方法里去掉//first=new MNode<T>();

public MyLinkedListWithIterator(){

clear();

//first=new MNode<T>(); //不要first哨兵,为了给DirectedGraph用

}

调用getNodeAt取最后节点时要减一

package com.jimmy.impl;

import java.util.Iterator;
import java.util.NoSuchElementException;

import com.jimmy.ListInterface;

public class MyLinkedListWithIterator<T> implements ListInterface<T> {
 
 public Iterator getIteratorForLinkedList()
 {
 return new IteratorForLinkedList();
 }
private class IteratorForLinkedList implements Iterator<T>{
 private MNode nextNode;
 private IteratorForLinkedList(){
  nextNode=first;
 }
 @Override
 public boolean hasNext() {
  
  return nextNode!=null;
 }

 @Override
 public T next() {
  if(hasNext())
  {
   MNode returnNode=nextNode;
   nextNode=nextNode.next;
   return (T)returnNode.getData();
  }else
   throw new NoSuchElementException();
 }

 @Override
 public void remove() {
  // TODO Auto-generated method stub
  throw new UnsupportedOperationException("remove is not supported!");
  
 }
 
}

 private MNode<T> first;

 private int length;

 public MyLinkedListWithIterator(){

 clear();

 //first=new MNode<T>();           //不要first哨兵,为了给DirectedGraph用

 }

 

 //默认放到last后头

 public boolean add(Object entry) {

 MNode<T> newNode=new MNode(entry);

 if(isEmpty()){

 first=newNode;

 }

 else{

 MNode<T> lastNode=getNodeAt(length-1);

 lastNode.next=newNode;//放到last后头
 
 

 }

 length++;

 return true;

 }


 public boolean add(int pos, Object entry) {
return true;
 }


 public boolean remove(int pos) {

 MNode pre = null;

 MNode<T> cur=first; //first为哨兵

 

 if(pos>=1&&pos<=length){

 for(int i=0;i<pos;i++){ //从一开始

 

 pre=cur;

 cur=cur.next;

 }

 }

 pre.next=cur.next;

 cur=null;

 length--;

 return true;

 }


 public void clear() {

 first=null;

 MNode<T> pre = null;

 MNode<T> cur=first; //first为哨兵

 

 for(int i=0;i<length;i++){ //从一开始

 

 pre=cur;

 cur=cur.next;

 pre=null;

 }

 length=0;


 }


 public boolean repalce(int pos, Object entry) {

 MNode<T> pre = null;

 MNode<T> cur=first; //first为哨兵

 for(int i=0;i<pos;i++){ //从一开始
 pre=cur;
 cur=cur.next;

 }

 MNode<T> tmp=new MNode(entry);
 pre.next=tmp;
 tmp.next=cur.next;
 cur=null;
 return true;
 }


 public Object getEntry(int pos) {

 MNode<T> cur=first; //first为哨兵

 if(pos>=0&&pos<=length){     //这里从0开始

 for(int i=0;i<pos;i++){ //从一开始
 cur=cur.next;

 }

 }

 return cur.getData();

 }


 public boolean contains(Object entry) {

 MNode<T> cur=first; //first为哨兵

 


 for(int i=0;i<length;i++){ //从一开始

 


 cur=cur.next;

 if(cur.getData().equals(entry));

 {

 System.out.print("list contains "+entry);

 return true;

 }


 }

 return false;

 }


 public int getLength() {


 return length;

 }


 public boolean isEmpty() {

 if(length==0)

 {assert(first==null);

 return true;}

 else

 

 return false;

 }


public void display() {

MNode<T> cur=first; //first为哨兵

System.out.print(cur.getData()+",");

for(int i=0;i<length;i++){ //从一开始

 

cur=cur.next;

if(cur!=null)

System.out.print(cur.getData()+",");

}

System.out.println();

 

 

}


 //外部输入pos,pos从1开始

 

 public MNode<T> getNodeAt(int pos)

 {


 MNode<T> cur=first; //first为哨兵
 if(pos>=0&&pos<=length){

 for(int i=0;i<pos;i++){

 cur=cur.next;

 }

 }

 return cur;

 }

 public static void main(String as[]){

 MyLinkedListWithIterator<Integer> ll=new MyLinkedListWithIterator<Integer>();

 ll.add(1);

 

 

 ll.add(5);

 ll.add(3);

 ll.display();                                 //1,5,3

 ll.repalce(2,new Integer(9));  //1,9,3


 ll.display();

 Integer a=(Integer)ll.getEntry(2);     //注意这里getEntry()查找二的显示9,即符合中文习惯,第一个为1

 System.out.println("a="+a);

 System.out.println("length="+ll.length);

 System.out.println(ll.contains(new Integer(9)));

 }

 }

 

 

package com.jimmy.impl;

import java.util.HashMap;

import java.util.Iterator;

import com.jimmy.GraphInterface;

import com.jimmy.QueueInterf;

import com.jimmy.VetexInterface;

public class DirectedGraph<T> implements GraphInterface<T>{

/**

* @param args

*/

public static void main(String[] args) {

DirectedGraph g=new DirectedGraph();

String a=new String("A");

String b=new String("B");

String c=new String("C");

String d=new String("D");

String e=new String("E");

String f=new String("F");

String gg=new String("G");

String h=new String("H");

String i=new String("I");

g.addVetex(a);

g.addVetex(b);

// g.addVetex(c);

g.addVetex(d);

g.addVetex(e);

// g.addVetex(f);

g.addVetex(gg);

g.addVetex(h);

// g.addVetex(i);

g.addEdge(a, b,2);

g.addEdge(a, d,5);

g.addEdge(a, e,4);

g.addEdge(b, e,1);

g.addEdge(d, gg,2);

// g.addEdge(e, f,3);

g.addEdge(e, h,6);

g.addEdge(gg, h,1);

// g.addEdge(h,i,1);

// g.addEdge(i, f,1);

// g.addEdge(f, c,4);

// g.addEdge(c, b,3);

g.getBreadthFirstTranversal(a);

}

private int edgeCount;

private HashMap<T,VetexInterface<T>> vertics;

public DirectedGraph()

{

this.edgeCount=0;

vertics=new HashMap<T,VetexInterface<T>>();

}

public boolean addVetex(T label)

{

VetexInterface<T> isDuplicate=vertics.put(label, new Vetex(label));

return isDuplicate==null;

}

public boolean addEdge(T begin,T end,double edgeWeight){

boolean result=false;

VetexInterface<T> beginV=vertics.get(begin);

VetexInterface<T> endV=vertics.get(end);

if(beginV!=null&&endV!=null)

{

result=beginV.connect(endV,edgeWeight);

}

if(result)

{

edgeCount++;

}

return result;

}

public boolean addEdge(T begin,T end){

return addEdge(begin,end,0);

}

public boolean isEmpty()

{

return vertics.isEmpty();

}

public void clear()

{

vertics.clear();

}

public int getNumOfVetics()

{

return vertics.size();

}

public int getNumOfEdge()

{

return this.edgeCount;

}

public boolean hasEdge(T begin,T end){

boolean found=false;

VetexInterface<T> beginV=vertics.get(begin);

VetexInterface<T> endV=vertics.get(end);

if(beginV!=null&&endV!=null)

{

Iterator<VetexInterface<T>> neighbors=beginV.getNeighborIterator();

while(!found&&neighbors.hasNext())

{

VetexInterface<T> neighbor=neighbors.next();

if(endV.equals(neighbor))

found=true;

}

}

return found;

}

public void resetVertics()

{

Iterator<VetexInterface<T>> vt=vertics.values().iterator();

while(vt.hasNext())

{

VetexInterface<T> nextV=vt.next();

nextV.unvisit();

nextV.setCost(0);

nextV.setPredecessor(null);

}

}

public QueueInterf<VetexInterface<T>> getBreadthFirstTranversal(T orgin)

{

resetVertics();

QueueInterf<VetexInterface<T>> vq=new LinkedQueue<VetexInterface<T>>(); //存放邻接点的新队列

QueueInterf<VetexInterface<T>> tranverseOrder=new LinkedQueue<VetexInterface<T>>(); //存放遍历顺序的新队列

VetexInterface<T> orginV=vertics.get(orgin);

orginV.visit();

tranverseOrder.enqueue(orginV);

vq.enqueue(orginV);

while(!vq.isEmpty()) //开始从A起,A出列后加入了BDE

{

VetexInterface<T> fv=vq.dequeue(); //A出列,

Iterator<VetexInterface<T>> edges=fv.getNeighborIterator();//edges表示A的邻接边BDE

System.out.print("fv ="+fv.getLabel()+" its neighbor:");

while(edges.hasNext()) //遍历A的邻接边BDE

{

VetexInterface<T> neighbor=edges.next();

System.out.print(neighbor.getLabel());

if(!neighbor.isVisit()){

neighbor.visit();

tranverseOrder.enqueue(neighbor); //循环访问A的邻接边BDE

vq.enqueue(neighbor); //同时把A的邻接点BDE放到vq做为新的邻接点

}

}

System.out.println();

LinkedQueue vqq=(LinkedQueue)vq;

System.out.print("display vetexQueue(显示当前队列的节点):");

vqq.display(); //显示A的邻接边BDE

System.out.println();

}

return tranverseOrder;

}

}

2.顶点接口

 

public interface VetexInterface<T> {

public T getLabel();

public void visit();

public boolean isVisit();

public void unvisit();

public boolean connect(VetexInterface<T> end,double edgeWeight);

public boolean connect(VetexInterface<T> end);

public boolean hasNeighbor();

public Iterator<VetexInterface<T>> getNeighborIterator();

public VetexInterface<T> getUnvisitedNeighbor();

public void setPredecessor(VetexInterface<T> predecessor);

public VetexInterface<T> getPredecessor();

public boolean hasPredecessor();

public void setCost(double newCost);

public double getCost();

}

 

2.顶点类,内含属性边类

Edge ,内又含顶点

 

package com.jimmy.impl;

import java.io.Serializable;
import java.util.Iterator;
import java.util.NoSuchElementException;

import com.jimmy.VetexInterface;

public class Vetex<T> implements VetexInterface<T> {

 private double cost;
 private T label;
 private boolean visited;
 public  MyLinkedListWithIterator edgeList=new MyLinkedListWithIterator();
 private VetexInterface<T> pre;
 
 private class neighborIterator implements Iterator<VetexInterface<T>>{

  private Iterator<Edge> edges;
  private neighborIterator()
  {
   edges=edgeList.getIteratorForLinkedList();
  }
  public boolean hasNext() {
   
   return edges.hasNext();
  }

  @Override
  public VetexInterface<T> next() {
   VetexInterface<T> neighbor=null;
   if(edges.hasNext())
   {
    Edge edgreToNextNeighbor=edges.next();
    neighbor=edgreToNextNeighbor.getVet();
   }else
   {
    throw new NoSuchElementException();
    
   }
   
   return neighbor;
  }

  @Override
  public void remove() {
   throw new UnsupportedOperationException();
   
  }
  
 }
 
 protected class Edge implements Serializable {
  /**
   *
   */
  private static final long serialVersionUID = 1L;
  private VetexInterface<T> vet;
  private double weight;

  protected Edge(VetexInterface<T> end, double edgeWeight) {
   vet = end;
   weight = edgeWeight;

  }

  public VetexInterface<T> getVet() {
   return vet;
  }

  public void setVet(VetexInterface<T> vet) {
   this.vet = vet;
  }

  public double getWeight() {
   return weight;
  }

  public void setWeight(double weight) {
   this.weight = weight;
  }
 }

 public Vetex(T label) {
  edgeList=new MyLinkedListWithIterator<Edge>();
  this.label = label;
  visited = false;
  pre = null;
  cost = 0;
 }

 @Override
 public T getLabel() {
  
  return this.label;
 }

 @Override
 public void visit() {
 // System.out.println(this.getLabel());
  visited = true;

 }

 @Override
 public boolean isVisit() {
  
  return visited==true;
 }

 @Override
 public void unvisit() {
  visited=false;

 }
  public Iterator<VetexInterface<T>> getNeighborIterator()
  {
   return new neighborIterator();
  }

 @Override
 public boolean connect(VetexInterface<T> end, double edgeWeight) {

  boolean result = false;
  if (!this.equals(end)) {
   Iterator<VetexInterface<T>> neighbors=this.getNeighborIterator();
 boolean duplicateEdge=false;
  while(!duplicateEdge&&neighbors.hasNext())
   {
   VetexInterface<T> neighbor=neighbors.next();
   if(end.equals(neighbor))
    {duplicateEdge=true;
    break;
    }
   
   }
  if(!duplicateEdge)
  {
   edgeList.add(new Edge(end,edgeWeight));
   result=true;
   
  }
  }

  return result;
 }

 @Override
 public boolean connect(VetexInterface<T> end) {
  
  return connect(end,0);
 }

 @Override
 public boolean hasNeighbor() {
  
  return !edgeList.isEmpty();
 }

 @Override
 public VetexInterface<T> getUnvisitedNeighbor() {
  VetexInterface<T> result=null;
  Iterator<VetexInterface<T>> neighbors=this.getNeighborIterator();
  while(neighbors.hasNext()&&(result!=null))
  {
   VetexInterface<T> nextNeighbor=neighbors.next();
   if(!nextNeighbor.isVisit())
    result=nextNeighbor;
   
  }
  return result;
 }

 @Override
 public boolean equals(Object obj) {
  boolean result;
  if((obj==null)||getClass()!=obj.getClass())
    result=false;
  else
  {
   Vetex<T> other=(Vetex<T>)obj;
   result=label.equals(other.label);
  }
  return result;
 }

 @Override
 public void setPredecessor(VetexInterface<T> predecessor) {
  // TODO Auto-generated method stub

 }

 @Override
 public VetexInterface<T> getPredecessor() {
  
  return this.pre;
 }

 @Override
 public boolean hasPredecessor() {
  // TODO Auto-generated method stub
  return false;
 }

 public void setCost(double newCost) {
  cost = newCost;
 }

 public double getCost() {
  // TODO Auto-generated method stub
  return cost;
 }
 public String toString()
 {
  //System.out.println(this.label);
  return this.label.toString();
 }

 

}

3.有向图

package com.jimmy.impl;

import java.util.HashMap;

import java.util.Iterator;

import com.jimmy.GraphInterface;

import com.jimmy.QueueInterf;

import com.jimmy.VetexInterface;

public class DirectedGraph<T> implements GraphInterface<T>{

public static void main(String[] args) {

DirectedGraph g=new DirectedGraph();

String a=new String("A");

String b=new String("B");

String c=new String("C");

String d=new String("D");

String e=new String("E");

String f=new String("F");

String gg=new String("G");

String h=new String("H");

String i=new String("I");

g.addVetex(a);

g.addVetex(b);

// g.addVetex(c);

 

g.addVetex(d);

g.addVetex(e);

// g.addVetex(f);

 

g.addVetex(gg);

g.addVetex(h);

// g.addVetex(i);

 

g.addEdge(a, b,2);

g.addEdge(a, d,5);

g.addEdge(a, e,4);

g.addEdge(b, e,1);

g.addEdge(d, gg,2);

// g.addEdge(e, f,3);

 

g.addEdge(e, h,6);

g.addEdge(gg, h,1);

// g.addEdge(h,i,1);

 

// g.addEdge(i, f,1);

 

// g.addEdge(f, c,4);

 

// g.addEdge(c, b,3);

 

g.getBreadthFirstTranversal(a);

}

private int edgeCount;

private HashMap<T,VetexInterface<T>> vertics;

public DirectedGraph()

{

this.edgeCount=0;

vertics=new HashMap<T,VetexInterface<T>>();

}

public boolean addVetex(T label)

{

VetexInterface<T> isDuplicate=vertics.put(label, new Vetex(label));

return isDuplicate==null;

}

public boolean addEdge(T begin,T end,double edgeWeight){

boolean result=false;

VetexInterface<T> beginV=vertics.get(begin);

VetexInterface<T> endV=vertics.get(end);

if(beginV!=null&&endV!=null)

{

result=beginV.connect(endV,edgeWeight);

}

if(result)

{

edgeCount++;

}

return result;

}

public boolean addEdge(T begin,T end){

return addEdge(begin,end,0);

}

public boolean isEmpty()

{

return vertics.isEmpty();

}

public void clear()

{

vertics.clear();

}

public int getNumOfVetics()

{

return vertics.size();

}

public int getNumOfEdge()

{

return this.edgeCount;

}

public boolean hasEdge(T begin,T end){

boolean found=false;

VetexInterface<T> beginV=vertics.get(begin);

VetexInterface<T> endV=vertics.get(end);

if(beginV!=null&&endV!=null)

{

Iterator<VetexInterface<T>> neighbors=beginV.getNeighborIterator();

while(!found&&neighbors.hasNext())

{

VetexInterface<T> neighbor=neighbors.next();

if(endV.equals(neighbor))

found=true;

}

}

return found;

}

public void resetVertics()

{

Iterator<VetexInterface<T>> vt=vertics.values().iterator();

while(vt.hasNext())

{

VetexInterface<T> nextV=vt.next();

nextV.unvisit();

nextV.setCost(0);

nextV.setPredecessor(null);

}

}

public QueueInterf<VetexInterface<T>> getBreadthFirstTranversal(T orgin)

{

resetVertics();

QueueInterf<VetexInterface<T>> vq=new LinkedQueue<VetexInterface<T>>(); //存放邻接点的新队列,动态变化

 

QueueInterf<VetexInterface<T>> tranverseOrder=new LinkedQueue<VetexInterface<T>>(); //存放遍历顺序的新队列  一直增长到ABDEGFHCI

 

VetexInterface<T> orginV=vertics.get(orgin);

orginV.visit();

tranverseOrder.enqueue(orginV);

vq.enqueue(orginV);

while(!vq.isEmpty()) //开始从A起,A出列后加入了BDE

{

VetexInterface<T> fv=vq.dequeue(); //A出列,

 

Iterator<VetexInterface<T>> edges=fv.getNeighborIterator();//edges表示A的邻接边BDE

 

System.out.print("fv ="+fv.getLabel()+" its neighbor:");

while(edges.hasNext()) //遍历A的邻接边BDE

 

{

VetexInterface<T> neighbor=edges.next();

System.out.print(neighbor.getLabel());

if(!neighbor.isVisit()){

neighbor.visit();

tranverseOrder.enqueue(neighbor); //循环访问A的邻接边BDE

 

vq.enqueue(neighbor); //同时把A的邻接点BDE放到vq做为新的邻接点

}

}

System.out.println();

LinkedQueue vqq=(LinkedQueue)vq;

System.out.print("display vetexQueue(显示当前队列的节点):");

vqq.display(); //显示A的邻接边BDE

System.out.println();

 

}

return tranverseOrder;

}

}

 

打印:

//访问A,即A出列

fv =A its neighbor:BDE                    //A的邻接点BDE

display vetexQueue(显示当前队列的节点):B,D,E,

 

//访问B,即B出列

fv =B its neighbor:E                      // B的邻接E

display vetexQueue(显示当前队列的节点):D,E,    //B出队列后剩下DE 本来压入B的邻接点E,但是E已经访问,已在队列里了

fv =D its neighbor:G                  // D的邻接点G

display vetexQueue(显示当前队列的节点):E,G,       //D出队列后剩下E,同时压入D的邻接点G ,所以就是EG

fv =E its neighbor:H                         E的邻接点H

display vetexQueue(显示当前队列的节点):G,H,

fv =G its neighbor:H

display vetexQueue(显示当前队列的节点):H,

fv =H its neighbor:

display vetexQueue(显示当前队列的节点):

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值