图的邻接表存储结构表示法

package graph2;

import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
import java.util.Stack;

class Var<AnyType>
{
	
	char data;
	Arc first;
	boolean visit;
	int du;
	public Var(char data)
	{
		this.data=data;
		this.first=null;
		this.visit=false;
		this.du=0;
	}
	
}
class Arc<AnyType>
{
	int data;
	Arc next;
	public Arc(int data)
	{
		this.data=data;
		this.next=null;
	}
}

public class Graph<AnyType> {

	Scanner sc=new Scanner(System.in);
	int num=0;
	Var var[];
	public int firstAdjex(int pos)
	{
		if(var[pos].first==null)
			return -1;
		return var[pos].first.data;
	}
	//v相对于w的下一个节点
	public int nextAdjex(int v,int w)
	{
		Arc p=var[v].first;
		while(p.data!=w)
		{
			p=p.next;
			
		}
		if(p.next==null)
		{
			return -1;
		}
		return p.next.data;
	}
	
	//建图,真难,shit
	public Var[] create()
	{
		Queue<Var> qv=new LinkedList();
		System.out.println("欢迎使用邻接表的存储的存储矩阵方法");
		System.out.println("请输入图的结点个数: ");
		num=sc.nextInt();
		var=new Var[num];
		System.out.println("请逐个输入顶点数据");
		String verpoint=sc.next();
		char verpoint2[]=verpoint.toCharArray();
		for(int i=0;i<num;i++){
			var[i]=new Var(verpoint2[i]);
			qv.add(var[i]);
		}
		System.out.println("请输入边的条数,是数字啦");
		int d=sc.nextInt();
		System.out.println("请输入各边");
		int i;
		String[] f=new String[d];
		for(i=0;i<d;i++)
		{
		  f[i]=sc.next(); //a:ac ab; b:bc ba c:ca:cb;
		}
		/*for(i=0;i<d;i++)
		{
			System.out.println(" "+f[i]);
		}*/
		while(!qv.isEmpty()){
		
			Var v=qv.remove();
			int h=0;
			char ap[]=new char[1000];
			for(i=0;i<d;i++)
			{
				char b[]=f[i].toCharArray();
				if(b[0]==v.data)
				{
					ap[h]=b[1];
					h++;
				}
			}
			if(h==0)
				continue;
			v.du=v.du+h;
			int j;
			for(i=0;i<num;i++)
			{
				for(int r=0;r<h;r++)
				{
					if((var[i].data==ap[r]))
					{
						
						var[i].du++;
						System.out.println(var[i].data+"度 "+var[i].du);
						break;
					}
				}
			}
			//String apoint=sc.next();
			//char ap[]=apoint.toCharArray();
			//System.out.println("hh "+h);
			//for(i=0;i<h;i++)
			//System.out.println("ap  "+ap[i]);
			int y;
			int ap_int[]=new int[1000];       //存放邻接点下标
			if(h==0)
				continue;//ap_int[0]=-1;
			else{
			  for(int t=0;t<h;t++){          //获取邻接点下标
				   y=0;
				  while(var[y].data!=ap[t]&&y<var.length){
					 y++;
				  }
				  ap_int[t]=y;
			  }
			}
			//for(i=0;i<h;i++)
		    //System.out.println("aaa"+ap_int[i]);
			//if(ap_int[0]==-1)
			//continue;
			v.first=new Arc(ap_int[0]);           //第一个连接点
			Arc<?> p=v.first;
             
			for(int e=1;e<h;e++){        //其他邻接点
				p.next=new Arc(ap_int[e]);
				p=p.next;
			}
			//p=null;
		}
		
	
		
		return var;
	}
	void du(Var[] v)
	{
		for(int i=0;i<num;i++)
		{
			System.out.println(var[i].data+"的度为:"+var[i].du);
		}
		
	}
	/*public void du(Var[] v){
		int count=0;
		for(int i=0;i<v.length;i++){
			Arc p=v[i].first;
			
			while(p!=null){
				count++;
				p=p.next;
			}
			System.out.println(v[i].data+"的度为:"+count);
			count=0;
		}
	}*/
	/*void DFS(int v)
	{
		var[v].visit=true;
		int w;
		
		for(w=firstAdjex(v);w>=0;w=nextAdjex(v,w))
		{
			if(var[w].visit==false)
			{
				DFS(w);
			}
		}
		
		
	}*/
	

	Stack<Integer> s=new Stack<Integer>();
	public void DFS()
	{
		for(int i=0;i<var.length;i++)
		{
			var[i].visit=false;
		}
		for(int i=0;i<var.length;i++)
		if(var[i].visit==false)
		{
			var[i].visit=true;
			System.out.println(var[i].data);
         	s.push(i);
			while(!s.empty())
			{
				int v=s.peek();
				int w;
				for(w=firstAdjex(v);w>=0;w=nextAdjex(v,w))
				{
					if(var[w].visit==false)
					{
						  System.out.println(var[w].data);
						  var[w].visit=true;
						  s.push(w);
						  break;
					}
				}
				if(w<0)
					s.pop();
				
			}
			
			
			
			
		}
		
		
		
	}
	
	
	
	
	//广度优先遍历
	public void BFS(){
		int w;
		Queue<Integer> q=new LinkedList<Integer>();
		for(int i=0;i<var.length;i++){
			var[i].visit=false;
		}
		for(int i=0;i<var.length;i++)
			if(var[i].visit==false){
				var[i].visit=true;
				System.out.println(var[i].data);
				q.add(i);
				while(!q.isEmpty()){
					int v=q.remove();
					for(w=firstAdjex(v);w>=0;w=nextAdjex(v,w))
					{
						if(var[w].visit==false)
						{
							System.out.println(var[w].data);
							var[w].visit=true;
							q.add(w);
							
						}
					}
				}
			
			}
		
	}
	/*
	 * 
	 */
	
	
	
	
	public static void main(String[]args)
	{
		Graph  g=new Graph();
		//g.create();
		g.du(g.create());
		System.out.println("DFS的遍历结果是");
		g.DFS();
		System.out.println("BFS的遍历结果是");
		g.BFS();
	}
	
	
}

 

这个程序中包含了图的邻接表的存储结构,包含了度,DFS,BFS等功能,个人表示不容易。


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值