程序丢失 Java 个链表指针
Program losing Java linked list pointers
我遇到了一个问题,我花了几个小时试图修复我的程序。我的链表有效,我可以向它添加对象,并且这些对象在创建时都有以前的指针,但是当我尝试通过按一个按钮遍历列表时,指针似乎不起作用。它将转到前一个节点,但随后会毫无例外地完全停止工作。我真的不明白哪里出了问题,但我敢打赌这是非常简单的事情,比如一行代码放在错误的地方之类的。
引擎class:
public TeamList tl = new TeamList();
public Team[] t = new Team[0];
private int x = 0;
public void createTeams() {
x++;
System.out.println("Enter team name:");
String teamName;
teamName = GUI.EditTeams.jTextField1.getText();
t = Arrays.copyOf(t, (t.length + 1));
t[x - 1] = new Team(x, teamName); /
if (t[x - 1].getTeamNumber() == 1) {
tl.addTeam(t[x - 1]);
tl.current = t[x - 1];
} else {
tl.addTeam(t[x - 1]);
t[x - 1].setPrev(t[x - 2]);
tl.current = t[x - 1];
}
printAllTeams(t);
EditTeams.jTextField1.setText("");
EditTeams.jTextField3.setText(t[x - 1].getTeamName());
System.out.println("Team added!");
}
GUI class 上一个团队按钮按下时执行的操作:
try {
sm.prevTeam();
} catch (InterruptedException ex) {
Logger.getLogger(EditTeams.class.getName()).log(Level.SEVERE, null, ex);
}
prevTeam():
public void prevTeam() throws InterruptedException {
if (t.length == 0 || tl.current.getPrev() == null) {
EditTeams.jTextField3.setText("Error: No more teams available");
Thread.sleep(2000);
EditTeams.jTextField3.setText("");
} else {
tl.traverse('p', t[x - 1]);
EditTeams.jTextField3.setText(tl.current.getTeamName());
}
}
链表如下:
public class TeamList {
public Team head;
public Team current;
public void addTeam(Team newTeam) // Method to add an item
{
if (head == null) // If the head is null then head becomes the new item
{
head = newTeam;
} else { // Else the current is the head
current = head;
while (current.getNext() != null) // While the next node is not null, set the current node as the next node
{
current = current.getNext();
current.setNext(newTeam); // Once at the end, the current node becomes the new item
}
}
}
public void traverse(char nextOrPrev, Team team)
{
if (nextOrPrev == 'n') {
current = team.getNext();
} else if (nextOrPrev == 'p') {
current = team.getPrev();
}
//team.position = current;
//current. = p;
}
}
抱歉,如果我做错了什么,我不是 Whosebug 专业人士,也不是编程专业人士(请不要嘲笑我编写的代码)。我看到有人说应该将东西标记为家庭作业帮助。这是作业帮助。非常感谢。
我看到了几个问题。首先,在将团队添加到引擎 class 中的 Teamlist t1
之前,您永远不会设置以前的团队。
其次,您在 addTeam(newTeam)
方法中完全重置了每个团队的下一个团队。你需要移动线
current.setNext(newTeam);
到你的 for 循环之外,这样它只会在你到达终点时按照你说的执行。
第三,当你遍历你的团队时,你根本就没有遍历任何东西。相反,您给它一个向前和向后的字符键,然后将当前设置为输入组并继续前进。遍历方法通常有一个循环,从 head
开始遍历整个列表,并对每个 Team
执行一些操作。事实上,我不确定您的遍历方法应该完成什么。
我将回答我自己的问题,以供所有查看此内容的人使用。问题出在调用 prevTeam 方法中的 traverse 方法。
下面一行:
tl.traverse('p', t[x - 1]);
应该是:
tl.traverse('p',tl.current);
基本上我每次都是说从最近加入的队开始遍历,所以如果有两队,就一直往1队走,因为1队是t[x-1的前队].我使用的是最新的数组对象而不是链表。
我遇到了一个问题,我花了几个小时试图修复我的程序。我的链表有效,我可以向它添加对象,并且这些对象在创建时都有以前的指针,但是当我尝试通过按一个按钮遍历列表时,指针似乎不起作用。它将转到前一个节点,但随后会毫无例外地完全停止工作。我真的不明白哪里出了问题,但我敢打赌这是非常简单的事情,比如一行代码放在错误的地方之类的。
引擎class:
public TeamList tl = new TeamList();
public Team[] t = new Team[0];
private int x = 0;
public void createTeams() {
x++;
System.out.println("Enter team name:");
String teamName;
teamName = GUI.EditTeams.jTextField1.getText();
t = Arrays.copyOf(t, (t.length + 1));
t[x - 1] = new Team(x, teamName); /
if (t[x - 1].getTeamNumber() == 1) {
tl.addTeam(t[x - 1]);
tl.current = t[x - 1];
} else {
tl.addTeam(t[x - 1]);
t[x - 1].setPrev(t[x - 2]);
tl.current = t[x - 1];
}
printAllTeams(t);
EditTeams.jTextField1.setText("");
EditTeams.jTextField3.setText(t[x - 1].getTeamName());
System.out.println("Team added!");
}
GUI class 上一个团队按钮按下时执行的操作:
try {
sm.prevTeam();
} catch (InterruptedException ex) {
Logger.getLogger(EditTeams.class.getName()).log(Level.SEVERE, null, ex);
}
prevTeam():
public void prevTeam() throws InterruptedException {
if (t.length == 0 || tl.current.getPrev() == null) {
EditTeams.jTextField3.setText("Error: No more teams available");
Thread.sleep(2000);
EditTeams.jTextField3.setText("");
} else {
tl.traverse('p', t[x - 1]);
EditTeams.jTextField3.setText(tl.current.getTeamName());
}
}
链表如下:
public class TeamList {
public Team head;
public Team current;
public void addTeam(Team newTeam) // Method to add an item
{
if (head == null) // If the head is null then head becomes the new item
{
head = newTeam;
} else { // Else the current is the head
current = head;
while (current.getNext() != null) // While the next node is not null, set the current node as the next node
{
current = current.getNext();
current.setNext(newTeam); // Once at the end, the current node becomes the new item
}
}
}
public void traverse(char nextOrPrev, Team team)
{
if (nextOrPrev == 'n') {
current = team.getNext();
} else if (nextOrPrev == 'p') {
current = team.getPrev();
}
//team.position = current;
//current. = p;
}
}
抱歉,如果我做错了什么,我不是 Whosebug 专业人士,也不是编程专业人士(请不要嘲笑我编写的代码)。我看到有人说应该将东西标记为家庭作业帮助。这是作业帮助。非常感谢。
我看到了几个问题。首先,在将团队添加到引擎 class 中的 Teamlist t1
之前,您永远不会设置以前的团队。
其次,您在 addTeam(newTeam)
方法中完全重置了每个团队的下一个团队。你需要移动线
current.setNext(newTeam);
到你的 for 循环之外,这样它只会在你到达终点时按照你说的执行。
第三,当你遍历你的团队时,你根本就没有遍历任何东西。相反,您给它一个向前和向后的字符键,然后将当前设置为输入组并继续前进。遍历方法通常有一个循环,从 head
开始遍历整个列表,并对每个 Team
执行一些操作。事实上,我不确定您的遍历方法应该完成什么。
我将回答我自己的问题,以供所有查看此内容的人使用。问题出在调用 prevTeam 方法中的 traverse 方法。
下面一行:
tl.traverse('p', t[x - 1]);
应该是:
tl.traverse('p',tl.current);
基本上我每次都是说从最近加入的队开始遍历,所以如果有两队,就一直往1队走,因为1队是t[x-1的前队].我使用的是最新的数组对象而不是链表。