我是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------>
邻接列表未在输出文件中正确显示。请帮我把邻接列表正确...:)
答案 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
您应该将其移动到外部循环的末尾。