1

使用文件和链表。我从文件中读取双数并应该将其添加到“链接列表”的代码。当它显示数字时,它要求用户输入一个双数字。在输出中,它不会将键入的数字添加到链接列表中。不知道如何将这些数字添加到链接列表中,因此我可以对其进行操作,例如(添加/删除)。

public class LinkList
{
  public static void main(String [] args) 
  {
    linkedListNumbers numbers= new linkedListNumbers();
    numbers.newLinkList();   
    numbers.addElementToList();
  }
}

class NumNode 
{
  private double num;
  private NumNode next;

  public NumNode()
  { 
    next = null;
  }

  public NumNode(double num)
  {
    this.num = num;
    next = null;
  }

  public void setNum(double num)
  {
    this.num = num;
  }

  public double getNum()
  {
    return num;
  }

  public void setNext(NumNode next)
  {
    this.next = next;
  }

  public NumNode getNext()
  {
    return next;
  }

  public String toString()
  {
    String str = "" + num;
    return str;
  }
}

class linkedListNumbers
{
  private NumNode head;
  private int count;
  NumNode aNode = new NumNode();

  public void newLinkList()
  {
    Scanner scan = new Scanner(System.in);

    Scanner fileScan;
    boolean validName = false;
    double num = 0.0;
    boolean validNumber = false;

    NumNode current = null;
    NumNode previous = null;

    do
    {
      System.out.print("Enter file name: ");
      String str = scan.nextLine();
      try 
      {
        fileScan = new Scanner(new File(str));
        validName = true;

        double count = 0;
        while(fileScan.hasNextLine())
        {
          try
          {
            str = fileScan.nextLine();
            num = Double.parseDouble(str);
            validNumber = true;
            count++;
            System.out.print(String.format("\t%6.2f", num));
          }
          catch (NumberFormatException nfe) 
          {
            //System.out.println("is not a Double number");
          }   
        }

        System.out.println("\nNumber of nodes = " + count);
        System.out.println(aNode);
      }
      catch (FileNotFoundException fnfe)
      {
        System.out.println("Invalid File name: enter again");
      }
    } while(!validName);
  }

  public void printList()
  {
    NumNode current = head;
    int reading = 0;
    while(current!= null)
    {
      System.out.printf("\t%6.2f", ++reading, current.toString());
    }
  }

  public void addElementToList()
  {
    Scanner scan = new Scanner(System.in);
    boolean validN = false;
    double num = 0.0;
    NumNode current = null;
    NumNode previous = null;
    double numToAdd = 0.0;

    double count =0;
    do
    {
      System.out.println("Enter double number");
      String str = scan.nextLine();

      try
      {
        num = Double.parseDouble(str);
        aNode.setNext(head);
        head = aNode;
        count++;
      }
      catch (NumberFormatException nfe) 
      {
        System.out.println("is not a Double number");
      }   
    } while(!validN && count<1);

    System.out.println(aNode.toString());
  }

}
4

2 回答 2

1

这不能回答你的问题;我只是有一些关于设计的不请自来的建议:linkedListNumbers 类应该只控制数据结构而不依赖任何 I/O 操作。我建议您首先修改addElementToList()以获取一个参数,该参数是要添加到列表中的元素。这个方法应该只关心那个特定的任务:向你的链表添加一个元素。所有的 I/O 逻辑都应该在某个地方的单独方法中。同样,该newLinkedList()方法不应包含任何 I/O 逻辑。

于 2012-11-29T01:52:02.917 回答
1

首先,一些一般性建议:

  1. 正如 Code-Guru 所说,您的 LinkedListNumbers 类应该只控制数据结构——不要在这里搞乱文件 I/O。
  2. 从小处着手,然后努力。在编写处理文件 I/O 的代码之前,设计/编写代码以将项目添加到 LinkedList 。使用小数据集进行增量测试。以后可以省去很多麻烦;我保证。 :)

通常,LinkedList 有一个head节点,该节点存储在主程序级别的变量中。 head存储对 LinkedList 中第一个节点的引用。

另一个节点,称为tail也被存储;tail存储对 LinkedList 中最近添加的节点的引用。

每个节点有两个属性:

  1. 在您的实现中称为子节点next
  2. 节点的值,在您的实现中称为num.

要将项目添加到 LinkedList,过程是:

  1. 使用新值创建一个临时节点。(我将调用此节点tempNode。)
  2. 将当前tail的孩子设置为tempNode.
  3. 更新tail节点以指向 LinkedList 中的(新的)最后一个节点——这个新的最后一个节点恰好是tempNode.

因此,让我们创建一个名为的子例程add(double num),将一个值添加到 LinkedList 的末尾。(我正在用半伪代码编写——你必须处理经过微调的 Java。)

add(double num) {
  //Step 1 from above
  NumNode tempNode = new NumNode(num)

  //Step 2
  tail.child = tempNode

  //Step 3
  tail = tempNode
}

现在,在伪代码中,填充链表的程序:

//These should be declared globally so the add method can access them...
NumNode head
NumNode tail

//The first node is different--here you set the head.
head = new NumNode(firstReadValue)
tail = head

//Now loop through
while (There remains lines to read) {
  add(nextReadValue)
}

让我知道这是否需要更多解释。

于 2012-11-29T02:04:30.357 回答