如何使用对象和私有变量对链表进行排序

时间:2016-01-02 05:26:10

标签: java sorting linked-list private setter

我会诚实地站在这里。这是家庭作业,但我已经变得绝望,我正在寻找任何人来帮助我。我已经连续工作了一个多月,并多次去找我的导师。基本上,该程序需要创建和排序在每个节点中具有int,string和double的链表。它需要能够按每种数据类型排序以及按输入顺序打印,但一旦我找到一个,我就可以将它转移到其他数据类型。请,一切都需要“手工制作”,请不要使用任何内置命令,因为我需要根据我的教师的要求创建一切。

我尝试制作链表然后对其进行排序,但是我遇到了问题所以我决定尝试在创建列表时对列表进行排序。

例如:输入第一个节点,然后在第一个节点的前面/后面输入下一个节点,然后将下一个节点放在需要的位置......等等。

这是我的代码(我只专注于字符串):

    String repeat = "y";
    list1 fChr = null;
    list1 p = fChr;
    list1 copy = null;
    //list1 dCopy = null;
    //list1 iCopy = null;
    list1 fd = fChr;//front of the double list
    list1 fi = fChr;//front of the integer list
    list1 fStr = fChr;//front of the string list~
    list1 pStr = fStr;
    boolean inserted = false;
    int iii = 0;
    String sss = "";
    double ddd = 0.0;
    while(repeat.equals("y"))//while the user agrees to adding a new node
    {            
        if(fChr == null)// if the front is empty
        {
            fChr = new list1();//create a new node by calling object and sets it as the front
            p = fChr;
            copy = fChr;
            sss = fChr.GetS();
            iii = fChr.GetI();
            ddd = fChr.GetD();
            copy.SetS(sss);
            copy.SetI(iii);
            copy.SetD(ddd);
            System.out.println("(1)");
        }
        else
        {
            System.out.println("(2)");
            if(p!=null)
            {
                System.out.println("p = "+ p.GetS());
                if(p.next != null)
                {
                    System.out.println("p.next = "+ p.next.GetS());
                    System.out.println("p.next.next = "+ p.next.next.GetS());
                }
            }

            p = fChr;
            while(p.next != null)//finds the end of the Linked list
            {
                System.out.println("(3)");
                p = p.next;//moves the pointer p down the list
            }
            list1 NextNode = new list1();//
            p.next = NextNode;
            sss = NextNode.GetS();
            iii = NextNode.GetI();
            ddd = NextNode.GetD();
            copy = NextNode;
            String gg = "hi";//tests to see if the setter is actually   changing the value inside copy(it is not, it prints b) 
            copy.SetS(gg);
            copy.SetI(iii);
            copy.SetD(ddd);
            System.out.println(copy.GetS());
            System.out.println("p = "+ p.GetS());

        }

        pStr = fStr;
        //System.out.println(copy.GetS()+"*");
        inserted = false;
        if(fStr == null)
        {
            System.out.println("(4)");
            fStr = copy;//fStr = fChr;
            inserted = true;
            //System.out.println("p.next.next = "+ p.next.next.GetS());
        }
        else if(copy.GetS().compareTo(fStr.GetS()) < 0)
        {
            System.out.println("(5)");
            //System.out.println("1)p.next.next = "+ p.next.next.GetS());
            copy.next = fStr;//ERROR ON THIS LINE
            System.out.println("2)p.next.next = "+ p.next.next.GetS());
            System.out.println("fChr.next: "+fChr.next.GetS());
            fStr = copy;
            System.out.println("3)p.next.next = "+ p.next.next.GetS());
            inserted = true;
            System.out.println("p = "+ p.GetS());
            System.out.println("p.next = "+ p.next.GetS());
            System.out.println("4)p.next.next = "+ p.next.next.GetS());
        }
        else if(fStr.next == null && fStr != null)
        {
            System.out.println("(6)");
            fStr.next = copy;
            inserted = true;
        }
        else
        {
            System.out.println("(7)");
            pStr = fStr;
            System.out.println("RIP (8)");
            while(pStr.next != null && inserted == false)
            {
                System.out.println("(9)");
                System.out.println("RIP");
                if(copy.GetS().compareTo(pStr.next.GetS()) < 0)//if it goes between 2 nodes
                {
                    System.out.println("(10)");
                    copy.next = pStr.next;
                    pStr.next = copy;
                    inserted = true;
                }
                else 
                {
                    System.out.println("(11)");
                    pStr = pStr.next;
                }
                if(pStr.next == null && inserted == false)// it goes at the end(not necessary bc of the (in order) part)
                {
                    System.out.println("(12)");
                    pStr.next = copy;
                } 

            }
        }
        repeat = JOptionPane.showInputDialog("Would you like to add a node [y/n]");
        System.out.println("End of Loop");
    }
    System.out.println(fStr.GetS());
    PrintMenu(fChr, fi, fd, fStr);// sends the user to the menu screen
}

从我的所有印刷声明中,我(我认为)发现了问题。此代码运行两次,并在第三次点击“y”时,在无限循环中打印“(3)”。我发现(比如字符串的输入是“c”然后是“b”)“p”等于“c”,p.next等于“b”而p.next.next等于“c” ”。所以,p处于无限循环中。我不知道它为什么这样做,我有一个理论认为它可能是因为前面(fChr)改变然后“p”指向它并且只是有点药物。我也意识到我试图将“copy”设置为等于“NextNode”是不成功的,copy只是将值保存在p.next(即NextNode)中。这似乎是正确的,但是当我尝试将其他内容放入其中时,它不起作用。我可能会错误地测试这个,在这种情况下,setter是正确的。设置是我似乎遇到的主要问题之一。如果有人的话,我会尽可能多地回答问题。

此处还有对象以防您希望看到它。感谢您的时间,任何帮助将不胜感激。如果可能的话,请尽量保持相对简单,这是一项高中任务,我非常接近,并且很难解决问题。另外,您可能已经注意到了,但我必须使用私有变量。我不是要求某人给我一个有效的程序,我只是问你是否知道为什么会发生什么问题,如果你知道如何解决它。衷心感谢你!

    import javax.swing.JOptionPane;
    public class list1
    {
    private int i;
    private String s;
    private double d;
    private String ss = null;
    private int ii = 0;
    private double dd = 0.0;
    list1 next = null; 
        public list1()
        {
        String str;
        s=JOptionPane.showInputDialog("Enter a String");
        String temp =JOptionPane.showInputDialog("Enter an Integer");
        i = Integer.parseInt(temp);
        String temp2 =JOptionPane.showInputDialog("Enter a Double");
        d = Double.parseDouble(temp2);

        }

        public double GetD()
        {  
            return d;
        }

        public String GetS()
        {   
            return s;
        }

        public int GetI()
        {
            return i;
        }

        public void SetS(String x)
        {
            ss = x;
        }

        public void SetI(int y)
        {
            ii = y;
        }

        public void SetD(double z)
        {
            dd = z;
        }
    }

0 个答案:

没有答案