Pages: [1]   Go Down
Print
Author Topic: Liste Circolari.....non funziona il getNext()!!  (Read 836 times)
0 Members e 1 Utente non registrato stanno visualizzando questa discussione.
callo
Forumista
***
Offline Offline

Gender: Male
Posts: 564


"Quanto manca alla vetta?";"Tu sali e non pensare"


« on: 18-01-2011, 10:30:54 »

Ragazzi ho implementato una lista circolare e la sto provando ad eseguire.......il programma funziona però non riesco a spiegarmi il motivo per il quale quando cerco di sapere il nodo successivo a quello selezionato mi da sempre lo stesso Nodo iniziale!!Di seguito il codice:
Classe Node
Code:


public class Node
{
private Node next;
private String element;
public Node (String element,Node next)
{
this.element=element;
this.next=next;
}
public String getElement()
{
return element;
}
public Node getNext()
{
return next;
}
public void setNext(Node next)
{
this.next=next;
}
public void setElement(String element)
{
this.element=element;
}
}

Classe CircularList
Code:

public class CircularList
{
private Node cursor;
private int size;
public CircularList()
{
size=0;
cursor=null;
}
public Node getCursor()
{
return cursor;
}
public int getSize()
{
return size;
}
public void Advance()
{
cursor=cursor.getNext();
}
public boolean isEmpty()
{
return(size==0);
}
public void Add(Node newNode)
{
if(isEmpty())//Lista vuota
{
newNode.setNext(newNode);
cursor=newNode;
}
else
{
newNode.setNext(cursor.getNext());
cursor.setNext(newNode);
}
size++;
}
public Node Remove()
{
Node nodeR=cursor.getNext();
if(nodeR==cursor)//vuol dire che ho solo un elemento nella lista
cursor=null; //Lista vuota
else
{
cursor.setNext(nodeR.getNext());
nodeR.setNext(null);
}
size--;
return nodeR;
}
public String toString()
{
String s="[";
if(isEmpty())
return s+="]";
else
while(size!=0)
{
s+=cursor.getElement();
s+=",";
Advance();
size--;
}
return s+="]";
}
}

Main
Code:

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.util.Scanner;
import java.io.FileReader;
import java.io.FileWriter;

public class ProvaLista {
public static void main(String[] args)throws Exception
{
CircularList lista= new CircularList();
Node nodo=new Node(null,null);
FileReader in=null;
FileWriter out=null;
BufferedReader br=null;
BufferedWriter bw=null;
String str="";
Scanner s=new Scanner(System.in);
System.out.println("Inserisci il nome del file di input:");
str=s.next();
try
{
in=new FileReader("Medicinali.txt");
out=new FileWriter(str);
br= new BufferedReader(in);
bw= new BufferedWriter(out);
String scan="";
while((scan=br.readLine())!=null)
{
nodo=new Node(scan,nodo.getNext());
lista.Add(nodo);
lista.Advance();
bw.write("il medicinale è:"+nodo.getElement());
bw.newLine();
bw.write("il cursore è:"+lista.getCursor().getElement());
bw.newLine();
bw.write("l'elemento successivo è:"+nodo.getNext().getElement());
bw.newLine();
}
System.out.println(lista.toString());
}
finally
{
br.close();
bw.close();
in.close();
out.close();
}
}

}

Il file che vado a richiamare è una normale lista di medicinali chiamato,appunto, Medicinali.txt:
Code:

ARNICA
AUGMENTIN
BIOCHETASI
BUSCOPAN
CALIPTOL
CELEBREX CPS
CICATRENE
CORTISON CHEMICETINA
DANZEN
DEBRIDAT
DEBRUM
DICLOREUM
DICLOREUMFL.
DICLOREUMGEL

Se ci fate caso il primo nodo della lista è "Arnica" e ogni volta che voglio sapere il nodo successivo a qualunque altro nodo...il risultato è Arnica!!Dove sto sbagliando??Grazie a tutti.
Logged

"A cavallina....a cavallina.....a chi era bedda quannu  curreva" [Cit.  Dal Tenerissimo via plebiscito]
LexaIdo
Apprendista Forumista
**
Offline Offline

Gender: Male
Posts: 110



« Reply #1 on: 18-01-2011, 11:37:12 »

da quello che ho capito ti da sempre il primo nodo perché sposti il cursore dopo ogni aggiunta di un nuovo nodo. In questo modo il nodo inserito è sempre l'ultimo e quindi, essendo circolare la lista, il suo successivo è sempre il primo nodo, cioè "Arnica"  boh
Logged
mr.ben
Apprendista Forumista
**
Offline Offline

Gender: Male
Posts: 131


« Reply #2 on: 18-01-2011, 12:05:35 »

Code:

try
{
in=new FileReader("Medicinali.txt");
out=new FileWriter(str);
br= new BufferedReader(in);
bw= new BufferedWriter(out);
String scan="";
                         //costruzione della lista
while((scan=br.readLine())!=null)
{
nodo=new Node(scan,nodo.getNext());
lista.Add(nodo);
lista.Advance();
}

                        //-----rieseguo il ciclo while; adesso funziona---
int i=0;
while(i<=lista.getSize())
{
lista.Advance();
bw.write("il medicinale è:"+lista.getCursor().getElement());
bw.newLine();
bw.write("il cursore è:"+lista.getCursor().getElement());
bw.newLine();
bw.write("l'elemento successivo è:--->"+lista.getCursor().getNext().getElement());
bw.newLine();
i++;
}



Il codice che hai scritto va benissimo ok; il problema, secondo me, deriva dal fatto che durante la costruzione della lista, vuoi conoscere il successivo( quando questo non è stato ancora settato).

Spero ti sia stato utile.

 
Logged
callo
Forumista
***
Offline Offline

Gender: Male
Posts: 564


"Quanto manca alla vetta?";"Tu sali e non pensare"


« Reply #3 on: 18-01-2011, 12:12:36 »

Grazie tante ragazzi......in effetti ho fatto un errore veramente sciocco!!
Logged

"A cavallina....a cavallina.....a chi era bedda quannu  curreva" [Cit.  Dal Tenerissimo via plebiscito]
Pages: [1]   Go Up
Print
Jump to: