2013-01-18 3 views
4

Ok .. alors j'ai décidé d'essayer des listes liées à Java plutôt que l'habituel C++ que je suis habitué aux références pointeurs dans un ..multi-dimensionnelle liste chaînée Quad-directionnel

Traversal peut être vers le haut, vers le bas , Gauche, Droite pour un nœud central. Pour les noeuds dans les coins, ils ne se déplacent que deux directions et les nœuds sur les bords peuvent se déplacer 3 directions .. Tous les autres peuvent se déplacer 4.

Problème:

Quand mon programme quitte le constructeur, mes noeuds sont supprimés en quelque sorte : S Quand j'utilise le get/set, il ne peut pas traverser les liens car ils sont nuls .. A l'exception du premier nœud.

Mon noeud est:

package linkedlist; 

public class Node { 
    public Node Up, Down, Left, Right; 
    public int Value; 

    public Node() { 
     Value = -1; 
     Up = Down = Left = Right = null; 
    } 
} 

Je fais la mise en œuvre comme:

package linkedlist; 

public class Matrix { 
    private int Width, Height; 
    private Node Reference; 

    public Matrix(int Width, int Height) { 
     Reference = new Node(); 
     this.Width = Width; this.Height = Height; 
     Node RowIterator = Reference, ColumnIterator = Reference; 

     for (int I = 0; I < Height; ++I) { 
      for (int J = 0; J < Width; ++J) { 
       if (I == 0) { 
        if (J < Width - 1) { 
         RowIterator.Right = new Node(); 
         RowIterator.Right.Left = RowIterator; 
         RowIterator = RowIterator.Right; 
        } 
       } 
       else { 
        if (I < Height - 1) { 
         ColumnIterator.Down = new Node(); 
        } 

        RowIterator = ColumnIterator; 
        RowIterator.Right = new Node(); 
        RowIterator.Up = ColumnIterator; 
        RowIterator.Up.Down = RowIterator; 
        RowIterator.Right.Left = RowIterator; 
        RowIterator.Right.Up = RowIterator.Up.Right; 
        RowIterator = RowIterator.Right; 

        ColumnIterator = ColumnIterator.Down; 
       } 
      } 
     } 
    } 

    public void SetValue(int I, int J, int Value) { 
      //Same as get except it sets rather than returns.. 
    } 

    public int GetValue(int I, int J) { 
     RowIterator = ColumnIterator = Reference; 
     for (int K = 0; K < J; ++K) { 
      for (int L = 0; L < I; ++L) { 
       RowIterator = RowIterator.Right; 
      } 

      ColumnIterator = ColumnIterator.Down; 
      RowIterator = ColumnIterator; 
     } 

     return RowIterator.Value; 
    } 
} 

Et la principale comme:

package linkedlist; 

public class LinkedList { 
    public static void main(String[] args) { 
     Matrix M = new Matrix(6, 6); 

     M.SetValue(3, 3, 10); 
    } 
} 

Alors, quand je tente de définir la valeur au milieu proche de la matrice, il jette une erreur de pointeur null .. Si je tente de le définir dans le constructeur, cela fonctionne très bien .. Ainsi, mes noeuds doivent être som ehow Nettoyage des ordures nettoyées ..

Répondre

3

Vous parcourez la rangée autant de fois que vous parcourez la colonne. C'est-à-dire, dans votre exemple, le nœud réel auquel vous accédez est (9, 3), hors des limites de votre Matrix. Au lieu de cela, vous devez effectuer une itération une fois sur la ligne, puis une fois dans la colonne.

for (int K = 0; K < J; ++K) { 
    Iterator = Iterator.Down; 
} 

for (int L = 0; L < I; ++L) { 
    Iterator = Iterator.Right; 
} 

Une raison particulière pour laquelle vous n'utilisez pas un tableau à deux dimensions?

+0

Je ne comprends pas .. La matrice est 6 x 6 qui a 36 éléments .. I Itérer 3 x 3 qui devrait être le centre ?? : S Votre exemple est logique, mais je ne vois pas pourquoi le mien est faux .. Je n'ai pas utilisé un tableau bidimensionnel parce que mon professeur a décidé de me mettre au défi et m'a demandé de faire une matrice en utilisant Nodes/Linked-Lists seulement – Brandon

+1

@CantChooseUsernames Dans votre solution, vous allez à droite 3 éléments, puis en bas 1, puis à droite 3 éléments, puis en bas 1, puis à droite 3 éléments, puis en bas 1. –

+0

Omg .. Je vois! Ahaha Merci d'avoir ouvert mes yeux. Je vais accepter votre réponse. – Brandon