我的代码没有显示图表的邻接列表

时间:2016-01-26 19:50:28

标签: java graph linked-list

我是java的新手。我正在尝试读取一个.txt文件,该文件具有Graph的输入,我需要创建另一个文件,该文件将显示该图的输出(对于有向图和无向图的邻接列表和矩阵)。我能够完美地创建Adjacency矩阵的输出,但它没有正确显示列表。 我的.txt文件如下所示:

7

10

0 1 2 4 3 5 6 5 5 3 2 3 5 0 6 2 0 4 1 5

这是我的代码

public class Node{
    int element;
    Node next;

    public Node(int elem, Node n){
        element = elem;
        next    = n;
    }
}

import java.util.*;
import java.io.*;

public class graph {

  public static void main (String[] args) throws IOException{

    Scanner scn = new Scanner(new File("D:/raj.txt"));

    int numVertices = scn.nextInt();
    int numEdges    = scn.nextInt();

    int [][] adMatrix = new int [numVertices][numVertices];
    Node  [] adList   = new Node[numVertices];

    for(int i=0; i<numVertices; i++) 
      adList[i] = new Node(i, null);
    for(int i=0; i<numEdges; i++){
      int u = scn.nextInt();
      int v = scn.nextInt();
      adMatrix[u][v] = 1;
      adMatrix[v][u] = 1;
      Node n;
      for(n=adList[u]; n.next!=null; n=n.next) 
        n.next = new Node(v, null);
      for(n=adList[v]; n.next!=null; n=n.next) 
        n.next = new Node(u, null);
    }

    PrintWriter pw = new PrintWriter(new File("D:/output using Java.txt"));

    pw.print("Adjacency Matrix:");
    pw.println();
    pw.println();
    for(int i=-1; i<numVertices; i++){
      for(int j=-1; j<numVertices; j++){
        if(i==-1 && j==-1) pw.print("     ");
        else if(i==-1 && j!=-1) pw.print(j + "   ");
        else if(i!=-1 && j==-1) pw.print(i + "    ");
        else                    
          pw.print(adMatrix[i][j] + "   ");
      }
      if(i==-1) 
        pw.println();
      pw.println();
    }
    pw.println();

    pw.print("Adjacency List:");
    pw.println();
    pw.println();
    for(int i=0; i<numVertices; i++){
      pw.print(i + " ");
      pw.println();
      pw.print(adList[i].element+ "------>");
       for(Node n = adList[i].next; n!=null; n=n.next){
        pw.print(n.element);
        if(n.next!=null) 
          pw.print("--->");
        else             
          pw.println();
      }

      }

    pw.close();

  }
}

输出文件如下:

Adjacency Matrix:

     0   1   2   3   4   5   6   

0    0   1   0   0   1   1   0   
1    1   0   0   0   0   1   0   
2    0   0   0   1   1   0   1   
3    0   0   1   0   0   1   0   
4    1   0   1   0   0   0   0   
5    1   1   0   1   0   0   1   
6    0   0   1   0   0   1   0   

Adjacency List:
0 
0------>1 
1------>2 
2------>3 
3------>4 
4------>5 
5------>6 
6------>

邻接列表未在输出文件中正确显示。请帮我把邻接列表正确...:)

2 个答案:

答案 0 :(得分:2)

我想你想要:

  for(n=adList[u]; n.next!=null; n=n.next) { /* skipping */ }
    n.next = new Node(v, null);
  for(n=adList[v]; n.next!=null; n=n.next) { /* skipping */ }
    n.next = new Node(u, null);

答案 1 :(得分:1)

此处的代码将为每个节点添加一个新节点,直到它结束。换句话说,每次尝试添加新鼻子时,它都会覆盖已存在的内容。

  for(n=adList[u]; n.next!=null; n=n.next) 
      n.next = new Node(v, null);
  for(n=adList[v]; n.next!=null; n=n.next) 
      n.next = new Node(u, null);

试试这个。要遍历到列表的末尾,循环中唯一的语句应该是前进到下一个项目的语句。此外,while的使用使得循环的意图更加清晰(IMO)。

n = adList[u];
while (n.next!=null) n=n.next;
n.next= new Node(v, null);

此外,似乎这段代码可能没有按照您的期望进行。

  pw.print(i + " ");
  pw.println();
  pw.print(adList[i].element+ "------>");

根据您分享的输出,我想您可能想删除中间的换行符。此外,adList[i].element可能不应与i相同。但它正在发生,因为您正在初始化邻接列表,如下所示:

for(int i=0; i<numVertices; i++) 
    adList[i] = new Node(i, null);

基本上,您正在使用循环到自身的边缘初始化每个顶点。所以你有两个选择。您可以跳过列表中的第一个节点,也可以重写它以在初始化时将adList[i]保留为null。如果您选择第二个选项,那么您将需要处理一些恼人的边缘情况。我建议改为使用

初始化数组
for(int i=0; i<numVertices; i++) 
    adList[i] = new Node(-1, null);

这样你就可以得到一个标题&#39;每个列表上的节点。如果你不小心打印标题节点,它将是显而易见的,因为它是-1。然后,如果你改变这个

  pw.print(i + " ");
  pw.println();
  pw.print(adList[i].element+ "------>");

对此:

  pw.print(i + " ");
  pw.print( "------>");

您将跳过标题节点,它应该按照您希望的方式工作。

------编辑------ 此外,println中的 if(n.next!=null) pw.print("--->"); else pw.println(); } // move it here } 无法保证被调用。

HttpUrlConnection

您应该将其移动到外部循环的末尾。