链表从文件中读取,排序和关闭一个错误



我必须创建一个链表,读取Strings和相关int的文件,并在读取时按int进行排序。到目前为止,我已经获得了一个向列表中添加元素的方法,以及一个基本的读取方法(但由于某种原因,缺少文件中的最后一个元素(,但每次我尝试向读取方法添加条件时,它都会返回一个空列表。

我的添加方法:

public void addFirst(String name, int rank)
{
    Ship newShip = new Ship(name, rank);
    if (isEmpty())
    {
        newShip.next = null;
        newShip.prev = null;
        last = newShip;
        first = newShip;
    }
    else
    {
        first.next = newShip;
        newShip.prev = first;
        first = newShip;
    }
}

和我的工作(但关闭一个(阅读方法:

public void readFile(String filename) throws IOException
{
    try
    {
    File inFile = new File(filename);           //inst. file import
    Scanner read = new Scanner(inFile);         //inst. scanner object
    while (read.hasNext())                      //reads until end of text
    {
        String name = read.next();              //scanner reads next string, assigns to name
        int rank = read.nextInt();              //reads next int, assigns to rank
        addFirst(name, rank);                   //enqueues ship name and rank into list
    }
    read.close();                               //ends read when empty
    }
    catch(IOException exc)
    {
        System.out.println("Error: file not found");
    }
}

每次我在read方法的while((中添加一个条件时,就像这样(数据文件中有一个"0"(:

    while (read.hasNext())                      //reads until end of text
    {
        String name = read.next();              //scanner reads next string, assigns to name
        int rank = read.nextInt();              //reads next int, assigns to rank
        if (rank == 0)
        {
            addFirst(name, rank);                   //enqueues ship name and rank into list
        }
    }

t似乎根本没有读过这份清单。如果我不能弄清楚add方法被破坏的原因,我就不能开始在插入算法中设置条件。

编辑:添加示例数据集。我只需要从概念上弄清楚我在哪里搞砸了。

发货1 0船2 10船3 27船42船57……

第2版:

好吧,现在放弃了使用链表进行插入,只创建一个基于sentinel的insertion read((方法。谢谢你的帮助。

只是问这里,因为它太大了,无法发表评论:

假设addFirst方法用于添加到链表的头,并且Ships确实具有属性nextprev,您不希望:

if(!isEmpty){
    first.prev = newShip;
    newShip.next = first;
    first = newShip;
}

或者如果你想在链接列表的尾部添加,你不想吗:

if(!isEmpty){
    last.next = newShip;
    newShip.prev = last;
    // take out first = newShip
}

不管怎样,你所拥有的似乎都不对。如果我错了,请纠正我。

我试过使用您的readFile方法,它似乎对我很有效,正确地读取了文件!但您的addFirst(String name, int rank) 中似乎有一个错误

else条件中,您实际要做的是添加newShip作为第二个元素(在第一个元素之后(,但您没有注意到第一个元素后面可能有更多的项!你也不负责newShipnext

例如:如果你的列表是:(尽管使用你的代码,你将无法制作这样的链表!示例只是为了解释(

指向11<-->2<-->3-->NULL first

然后添加新元素4

你的链接看起来像这样::

指向41<-->4<-->DANGLING first

1<--2<-->3-->NULL No pointer through which we can this part of the Linked List!

小心我用过的尖括号,它是指针的方向!

看起来你正试图添加到链接列表的前面!所以,你的代码应该是这样的!!

public void addFirst(String name, int rank)
{
    Ship newShip = new Ship(name, rank);
    if (isEmpty())
    {
        newShip.next = null;
        newShip.prev = null;
        last = newShip;
        first = newShip;
    }
    else
    {
        first.prev = newShip;
        newShip.next = first;
        newShip.prev = NULL; // to ensure there are no dangling pointers
        first = newShip;
    }
}

相关内容

  • 没有找到相关文章

最新更新