【问题标题】:The data is not added into linked list and display correctly. Why?数据未添加到链表并正确显示。为什么?
【发布时间】:2017-03-27 05:47:29
【问题描述】:

我正在创建一个使用 GUI 形式的链表存储数据的系统。 我在存储和显示链表时遇到了一些问题。貌似我输入数据后,并没有存入链表

我正在做的是一个图书馆系统,所以我需要将书名、作者姓名、ISBN 号和书本数存储到链表中的单个节点中。这些信息来自用户输入,例如 jTextField1。我的讲师教我如何插入单个数据,但现在我需要插入多个数据。

我在 Node 类中重新创建了构造函数和 getter 方法,并在 LinkedList 类中也对其进行了更改。但是由于某种原因,数据似乎没有添加到 LinkedList 中,当我在 TextArea 中显示列表时,它显示的只是 NULL,但不是我刚刚输入的数据。这是为什么?

这是我的节点类:

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()));        
}          
}

另一个带显示的 JFrame:

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
    LinkedList list = new LinkedList();
    jTextArea1.setText(list.displayNode());
}  

数据类:

public class Data {
    String name;
    String author;
    int isbn;
    int number;

    public Data(String name, String author, int isbn, int number)
    {

    }
}

谁能帮我解决这个问题?谢谢。

【问题讨论】:

    标签: java linked-list


    【解决方案1】:

    将节点想象成一个桶,它可以包含任何数据,而不仅仅是一个简单的数字(正如大多数教程所描述的那样)。

    除了Node 类中的int num 字段,您可以使用任何您想要的引用类型,例如List<Integer>

    public class Node  {
        List<Integer> data;
        ...
    }
    

    在这种情况下,您还需要重写构造函数和getter(分别更改参数类型和返回类型)。

    另一个不会破坏the single responsibility principle 的好解决方案是使用包装类(例如Data):

    class Data {
        private Integer i;
        private String s;
    }
    

    【讨论】:

    • 我明白了,但是我的数据中有字符串和整数,节点是否也包含它们?或者它必须是相同的数据类型?谢谢!
    • 是的,它会,但这不是一个好主意。最好创建一个像 Data 这样的包装类并将它们保留在那里
    • 节点只负责保存引用和数据,但数据本身可以包含任何信息(单一职责原则)
    • 我明白了,我重写了构造函数和getter,它会添加但是当显示有问题时,它就像它没有添加到链表中一样......我将更新代码。谢谢
    • 代码已更新。如果可以的话,请帮我看看代码有什么问题。谢谢!
    【解决方案2】:

    链表的head 应该指向顶部元素。因此,在addNode 中,您应该修改的是node 属性。

    public class LinkedList
    {
       Node node;
       Node head = new Node();
    
       LinkedList()
       {
          node = null;
       }
    ...
    

    此外,添加节点应该使前一个节点的next 指向新创建的节点,以便将新节点连接到链表的其余部分。

    下一个带有null的节点标记了尾节点,我们将在其中连接新创建的节点。

    您可以通过循环遍历列表的节点来做到这一点,直到找到 null 下一个, 或者通过将尾节点存储为链表的属性。

    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.");
    }
    

    【讨论】:

    • 知道了,但是现在我有显示问题,好像数据没有添加到链表中,你介意帮我看看有什么问题吗?我已经编辑了这个问题。谢谢!
    【解决方案3】:

    您可以向Node 类添加额外的属性,如下所示:

        public class Node{
    
        String bookName, author;
        int isbn, copies;
        Node next;
       ...
    

    现在您可以为每个 Node 的所有这些属性使用 get() 和 set() 方法。

    【讨论】:

      【解决方案4】:

      最简单的方法是为数据创建 sme 类型的“盒子”类并将其替换为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

      【讨论】:

      • 我明白了,但是我必须从用户输入中检索数据到 jTextField,所以在插入时我可以这样做:yourList.add(new Box(jTextField1.getText(), jTextField2.getText ())); ?谢谢。
      • @Acetamide 是的,你可以。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-06-10
      • 1970-01-01
      • 1970-01-01
      • 2013-01-18
      • 2012-10-30
      • 2020-11-18
      • 1970-01-01
      相关资源
      最近更新 更多