排序链接列表Java

时间:2015-02-11 01:01:13

标签: java linked-list sorted

我正在为我的Data Structures类工作。我们必须使用我们自己的基于排序链接的列表adt创建一个地址簿。现在add方法有效,但它似乎使所有节点都指向第一个节点。每当我尝试在for循环中使用getEntry()输出列表时,它每次都会给我最后添加的条目。我已经尝试过使用toArray,但它做了同样的事情。你能看到任何问题吗?

public class GTSortedLinkedBasedList implements GTListADTInterface {
private Node firstNode;
private int  numberOfEntries;

public GTSortedLinkedBasedList(){
    //firstNode = new Node(null);
    numberOfEntries = 0;
}

public void setNumberOfEntries(int x){
    numberOfEntries = x;
}

public void add(ExtPersonType newEntry){
   //firstNode = null;
   Node newNode = new Node(newEntry);
   Node nodeBefore = getNodeBefore(newEntry);
   if (isEmpty() || (nodeBefore == null))
   {
      // Add at beginning
      newNode.setNextNode(firstNode);
      firstNode = newNode;
   }
   else
   {
      // Add after nodeBefore
      Node nodeAfter = nodeBefore.getNextNode();
      newNode.setNextNode(nodeAfter);
      nodeBefore.setNextNode(newNode);
   } // end if
   numberOfEntries++;
}

private Node getNodeBefore(ExtPersonType anEntry){
    Node currentNode = getFirstNode();
    Node nodeBefore = null;
    while ((currentNode != null) &&
    (anEntry.getFirstName().compareTo(currentNode.getData().getFirstName()) > 0))
    {
    nodeBefore = currentNode;
    currentNode = currentNode.getNextNode();
    } // end while
    return nodeBefore;
}

private class Node {

    private ExtPersonType data;
    private Node next;

    public Node(ExtPersonType dataValue) {
        next = null;
        data = dataValue;
    }

    public Node(ExtPersonType dataValue, Node nextValue) {
        next = nextValue;
        data = dataValue;
    }

    public ExtPersonType getData(){
        return data;
    }
    public void setData(ExtPersonType newData){
        data = newData;
    }
    public Node getNextNode(){
        return next;
    }
    public void setNextNode(Node newNode){
        next = newNode;
    }

}


public ExtPersonType getEntry(int givenPosition) {
    if ((givenPosition >= 1) && (givenPosition <= numberOfEntries)){
      assert !isEmpty();
      return getNodeAt(givenPosition).getData();
   }
   else{
      throw new IndexOutOfBoundsException("Illegal position given to getEntry operation.");
   }
}

public void loadData(GTSortedLinkedBasedList contacts) throws FileNotFoundException{
    //int index = 0;
    ExtPersonType person = new ExtPersonType();
    DateType tempDate = new DateType();
    AddressType tempAddress = new AddressType();
    Scanner file = new Scanner(new FileInputStream("Programming Assignment 1 Data.txt"));
    while(file.hasNext()){
        person.setFirstName(file.next());
        person.setLastName(file.next());
        tempDate.setMonth(file.nextInt());
        tempDate.setDay(file.nextInt());
        tempDate.setYear(file.nextInt());
        person.setDOB(tempDate);
        tempAddress.setStreetAddress(file.nextLine());
        if(tempAddress.getStreetAddress().isEmpty()){
            tempAddress.setStreetAddress(file.nextLine());
        }
        tempAddress.setCity(file.nextLine());
        tempAddress.setState(file.nextLine());
        tempAddress.setZipCode(file.nextLine());
        person.setAddress(tempAddress);
        person.setPhoneNumber(file.nextLine());
        person.setPersonStatus(file.nextLine());
        if(person.getPersonStatus().isEmpty()){
            person.setPersonStatus(file.nextLine());
        }
        contacts.add(person);
        System.out.println(contacts.getEntry(contacts.getLength()).getFirstName());
        //index++;

    }
}

public static void main(String[] args) throws FileNotFoundException {
    AddressBook ab = new AddressBook();

    ab.loadData(ab);
   ExtPersonType people = new ExtPersonType();
    //people = ab.toArray(people);
    System.out.println(ab.getLength());
    for(int cnt = 1; cnt <= ab.getLength(); cnt++){
        people = ab.getEntry(cnt);
        System.out.println(people.getFirstName());
    }

}

编辑:add方法用新添加的对象覆盖每个先前的对象。如果我做一个排序列表或只是一个基本列表似乎也没关系。

2 个答案:

答案 0 :(得分:0)

我不会躺在这里,我不完全确定我理解你的代码,但我想我明白了什么是错的。在getNodeBefore()方法的代码中,将currentNode()始终设置为firstNode()。我认为这是导致问题的原因。我看到你试图以递归的方式遍历列表以找到正确的节点,但我不认为每个递归调用都会导致列表中的移动。我建议你在代表前向和后向节点的对象中添加属性。

像这样......

private T data;
private Node nodeBefore;
private Node nodeAfter;

在创建对象时,您可以在之前和之后分配属性,然后您需要的所有信息都包含在对象本身中。

要递归遍历列表,您只需添加类似currentNode = currentNode.nodeAfter的语句。

你的getNodeBefore()方法只返回currentNode.nodeBefore,getNodeAfter()将返回currentNode.nodeAfter。

答案 1 :(得分:0)

您没有代码可以处理添加的节点将成为列表中的第一个节点的情况,但该列表也不为空。在这种情况下,getNodeBefore返回null,您的代码将覆盖根节点。

尝试

   if (isEmpty() && (nodeBefore == null))
   {
     // Add at beginning
     newNode.setNextNode(firstNode);
     firstNode = newNode;
   }
   else if(nodeBefore == null)
   {
     Node temp = new Node();
     temp.setNextNode(first.next);
     temp.setData(first.data);
     newNode.setNextNode(temp);
     firstNode = newNode;
   }