我正在创建一个使用GUI形式的链表存储数据的系统。我在存储和显示链表时遇到了一些问题。看起来在我输入数据之后,它没有存储到链表
我正在做的是一个图书馆系统,所以我需要将图书名称,作者名称,ISBN号和图书副本数量存储到链表中的单个节点中。这些信息来自用户输入,如jTextField1。我的讲师教我如何插入单个数据,但现在我需要插入多个数据。
我在Node类中重新创建了构造函数和getter方法,并在LinkedList类中也进行了更改。但是由于某种原因,数据似乎没有添加到LinkedList中,当我在TextArea中显示列表时,它所显示的都是NULL,而不是我刚刚输入的数据。为什么呢?
这是我的Node类:
public class Node
{
String name;
String author;
int isbn;
int number;
Node next;
Node()
{
name = null;
author = null;
isbn = 0;
number = 0;
next = null;
}
Node(String name, String author, int isbn, int number)
{
this.name = name;
this.author = author;
this.isbn = isbn;
this.number = number;
}
String getName()
{
return name;
}
String getAuthor()
{
return author;
}
int getisbn()
{
return isbn;
}
int getnumber()
{
return number;
}
Node getNext()
{
return next;
}
void setNext(Node next)
{
this.next=next;
}
}
这是我的链表类:
public class LinkedList
{
Node node = new Node();
Node head;
LinkedList()
{
head=null;
}
Node getHead()
{
return head;
}
public void addNode(String name, String author, int isbn, int number)
{
Node newNode = new Node(name, author, isbn, number);
newNode.next = head;
head = newNode;
JOptionPane.showMessageDialog(null,"Node added to the list.");
}
}
public String displayNode()
{
Node current = head;
String output = "";
while(current!= null)
{
output+="Book Name: "+current.getName()+" Author: "+current.getAuthor()+" ISBN Number: "+current.getisbn()+" Number of copies: "+current.getnumber();
current=current.getNext();
}
return(output+"NULL");
}
这就是我在AddBook JFrame:
中的内容public class AddBook extends javax.swing.JFrame {
static String name;
static String author;
static int isbn;
static int number;
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
LinkedList list = new LinkedList();
list.addNode(jTextField2.getText(), jTextField3.getText(), Integer.parseInt(jTextField4.getText()), Integer.parseInt(jTextField1.getText()));
}
}
另一个带有display:
的JFrameprivate void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
LinkedList list = new LinkedList();
jTextArea1.setText(list.displayNode());
}
Data类:
public class Data {
String name;
String author;
int isbn;
int number;
public Data(String name, String author, int isbn, int number)
{
}
}
有谁能帮我吗?谢谢你。 把节点想象成一个可以包含任何数据的桶,而不仅仅是一个简单的数字(正如大多数教程所描述的)。
代替Node
类中的int num
字段,您可以使用任何您想要的引用类型,例如,List<Integer>
:
public class Node {
List<Integer> data;
...
}
在这种情况下,您还需要重写构造函数和getter(分别通过更改参数类型和返回类型)。
另一个不违反单一责任原则的好解决方案是使用包装器类(例如Data
):
class Data {
private Integer i;
private String s;
}
最简单的方法是为数据创建一种"box"类,并将其替换为int num;
,例如:
public class Box {
String name;
String author;
Box(String name, String author) {
this.name = name;
this.author = author;
}
}
在Node和LinkedList中处理它就像处理int一样,但是插入看起来像这样:
yourList.add(new Box("book", "author"));
如果你想将列表用于不同的类型,你必须学习泛型,例如:https://docs.oracle.com/javase/tutorial/java/generics/index.html
您可以添加额外的属性到您的Node
类,如下所示:
public class Node{
String bookName, author;
int isbn, copies;
Node next;
...
现在您可以为每个Node
的所有这些属性使用get()和set()方法。
链表的head
应该指向顶部元素。因此,在addNode
中,您应该修改的是node
属性。
public class LinkedList
{
Node node;
Node head = new Node();
LinkedList()
{
node = null;
}
...
此外,添加一个节点应该使前一个节点的next
指向创建的新节点,以便将新节点连接到链表的其余部分。
带有null
的节点接下来标记为尾部节点,我们将在其中连接新创建的节点。
你可以通过循环遍历列表的节点,直到找到null
next,或者通过将尾节点存储为链表的属性。
public class LinkedList
{
Node node;
Node head = new Node();
Node tail; // add tail as attribute
...
public void addNode(int item)
{
Node newNode = new Node(item, null);
node = newNode; //head = newNode;
tail.setNext(newNode); // connects the new node
tail = newNode; // makes the new node the new tail
JOptionPane.showMessageDialog(null,"Node added to the list.");
}