我会诚实地站在这里。这是家庭作业,但我已经变得绝望,我正在寻找任何人来帮助我。我已经连续工作了一个多月,并多次去找我的导师。基本上,该程序需要创建和排序在每个节点中具有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;
}
}