Sto provando a fare la stampa di queste visite in un grafo orientato implementato con liste di adiacenza, ma quando invoco la procedura mi restituisce sempre una stringa vuota, posto i codici con dei commenti, trascurate quelli relativi a cosa non indispensabili per le visite perché l' esercizio voleva altro:
La coda che mi serve per la BFS
codice:public class Queue { private GNode front; private GNode rear; private int size; public Queue() { front=rear=null; size=0; } public GNode getFront(){return front;} public GNode getRear(){return rear;} public int getSize(){return size;} public void enqueue(GNode node) { GNode nuovo=node; if(size==0) front=rear=nuovo; else{ rear.setNext(nuovo); rear=nuovo; } size++; } public GNode dequeue() { if(size==0) return null; GNode tmp=getFront(); front=tmp.getNext(); tmp.setNext(null); size--; return tmp; } }
La lista linkata dove inserirņ i nodi del mio grafo:
codice:public class LinkedList { protected int size; protected GNode head; public LinkedList() { head=null; size=0; } public int getSize(){return size;} public GNode getHead(){return head;} public boolean isEmpty(){return (size==0);} public void addFirst(GNode node) //inserimento in testa { if(isEmpty()) head=node; else { node.setNext(head); head=node; } size++; } }
La classe GNode del grafo:
La classe arco:codice:public class GNode { protected int label; protected Edge adiacent; protected int degree; protected GNode next; protected int color; protected int level; protected GNode parent; //servirą per la visita BFS public GNode(int label) { this.label=label; adiacent=null; degree=0; next=null; color=0; level=-1; parent=null; } public void setParent(GNode node){parent=node;} public GNode getParent(){return parent;} public int getLevel(){return level;} public void setLevel(int i){level=i;} public int getColor(){return color;} public void setColor(int i){color=i;} public int getLabel(){return label;} public void setLabel(int label){this.label=label;} public int getDegree(){return degree;} public GNode getNext(){return next;} public void setNext(GNode next){this.next=next;} public void addAdiacent(GNode u) { Edge arco=new Edge(this, u); arco.setNext(adiacent); adiacent=arco; degree++; } public Edge getAdiacent(){return adiacent;} public String toString() { String ret=""; return ret+=this.getLabel()+" "; } }
E infine la classe Grafo:codice:public class Edge { private GNode origine; private GNode destinazione; private Edge next; public Edge(GNode origine, GNode destinazione) { this.origine=origine; this.destinazione=destinazione; next=null; } public GNode getOrigine(){return origine;} public GNode getDestinazione(){return destinazione;} public Edge getNext(){return next;} public void setNext(Edge next){this.next=next;} }
codice:public class Grafo { protected LinkedList list; protected int node; protected int edges; protected String archi; //APPOSITAMENTE PER QUESTO CASO protected Queue coda; //Supporto per BFS protected String dfs=""; //Stamperņ la DFS protected String bfs=""; public Grafo() { coda=new Queue(); list=new LinkedList(); node=0; edges=0; archi=""; //APPOSITAMENTE PER QUESTO CASO } public int node(){return node;} public int edges(){return edges;} public void addEdge (GNode u, GNode v){ u.addAdiacent(v); edges++; } public boolean isAdj(GNode u, GNode v) //verifica se sono adiacenti { Edge arco=u.getAdiacent(); while(arco!=null) { if(arco.getDestinazione()==v) return true; arco=arco.getNext(); } return false; } public int degree(GNode u){return u.getDegree();} public void addNode(GNode nodo) { list.addFirst(nodo); node++; } public boolean isPresent(GNode nodo) //verifica se un nodo č contenuto { GNode tmp=list.head; while(tmp!=null) { if(tmp.getLabel()==nodo.getLabel()) return true; tmp=tmp.getNext(); } return false; } public void BFSVisit(GNode node) { GNode nodo=list.head; while(nodo!=null) //per tutti i nodi del grafo setto questi parametri { nodo.setColor(0); nodo.setLevel(-1); nodo.setParent(null); nodo=nodo.getNext(); } node.setLevel(0); //questo sarą il nodo da cui voglio iniziare la visita e setto cosģ node.setColor(1); node.setParent(null); coda.enqueue(node); //inserisco in coda while(coda.getSize()>0){ //qui tolgo l' elemento GNode s=coda.dequeue(); //System.out.println(s.toString()); bfs+=s.toString(); //lo aggiungo alla stringa che mi stamperą la visita Edge arc=s.getAdiacent(); //prendo un arco while(arc!=null){ //finchč arc non č null ho altri nodi adiacenti GNode dest=arc.getDestinazione(); //prendo il nodo adiacente e lo memorizzo in dest if(dest.getColor()==0) { coda.enqueue(dest); dest.setParent(s); dest.setLevel(s.getLevel()+1); dest.setColor(1); } arc=arc.getNext(); //avanzo per cercare gli altri archi e quindi i nodi adiacenti } s.setColor(1); } } public void DFS() { GNode nodo=list.head; //Grafo corrente=this; while(nodo!=null) //per ogni nodo setto di default { nodo.setColor(0); nodo.setParent(null); nodo=nodo.getNext(); } GNode nodo1=list.head; while(nodo1!=null) { if(nodo1.getColor()==0) DFSVisit(/*corrente,*/nodo1); nodo1=nodo1.getNext(); } } public void DFSVisit(/*Grafo g, */GNode s) { dfs+=s.toString(); //concateno la stringa che conterrą i valori s.setColor(1); Edge arc=s.getAdiacent(); while(arc!=null) //anche qui finchč ho nodi adiacenti se arc non uguale a null { GNode dest=arc.getDestinazione(); //trovo quello adiacente if(dest.getColor()==(0)) { dest.setParent(s); DFSVisit(/*g,*/dest); } arc=arc.getNext(); //vado sugli altri archi cioč per cercare nodi adiacenti } s.setColor(2); } public String toStringDFS() { return dfs; } public String toStringBFS() { return bfs; } }
Perņ in questo main ottengo due stringhe vuote come stampa:
codice:public class GrafoOrientato { public static void main(String []args) { Grafo gr=new Grafo(); GNode nodo1=new GNode(10); GNode nodo2=new GNode(20); GNode nodo3=new GNode(30); GNode nodo4=new GNode(40); gr.addNode(nodo1); gr.addNode(nodo2); gr.addNode(nodo3); gr.addNode(nodo4); gr.addEdge(nodo4,nodo3); gr.addEdge(nodo3,nodo2); gr.addEdge(nodo2,nodo1); //System.out.println(gr.list.getHead().toString()); System.out.println(gr.toStringBFS()); System.out.println(gr.toStringDFS()); } }
Come mai mi stampa due stringhe vuote? Ho il sospetto che le chiamate ricorsive sovrascrivino male....come faccio a stampare?

Rispondi quotando