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等功能,个人表示不容易。