代码中的嵌套开关有什么问题?



我想在下面的代码中创建 2 个链表——大小写 'F'和大小写 'S' 来创建 2 个链表。

outer:while(true) {
switch(in.next().charAt(0))
{
case 'F':
switch(in.nextInt())  
{
case 1:
ll.insertF(in.nextInt());
break;
case 2:
ll.insertR(in.nextInt());
break;
case 3:
try {
ll.insertP(ll.head, in.nextInt());
}
catch(Exception e)
{
System.out.println("Cannot do");
}
break;
case 4:
ll.display();
break;
case 5:
ll.deleteR();
break;
case 6:
ll.reverse();
break;
case 7:
ll.concat(l2.head);
break;
default:
break;
}
break;
case 'S':
switch(in.nextInt())    
{
case 1:
l2.insertF(in.nextInt());
break;
case 2:
l2.insertR(in.nextInt());
break;
case 3:
try {
l2.insertP(l2.head, in.nextInt());
}
catch(Exception e)
{
System.out.println("Cannot do");
}
break;
case 4:
l2.display();
break;
case 5:
l2.deleteR();
break;
case 6:
l2.reverse();
break;
case 7:
l2.concat(ll.head);
break;
default:
break;
}
break;
default:
System.out.println("Out");
break outer;
}
}

获取输出: F 4 空 1 外

转到外部开关的第一个情况">

F"并选择情况 4 后,它直接转到外部开关并转到外部开关的"默认值"。但我不明白为什么在做一个案例-4个内部开关-"F"后它会从内部开关中消失。

使用的功能有(如果需要(:

public void insertF(int d)
{
Node temp= new Node(d);
temp.next=head;
head= temp;
}
public void insertR(int d)
{
Node temp= new Node(d);
if(head==null)
{
head=temp;
return;
}
Node cur=head;
while(cur.next!=null)
cur=cur.next;
cur.next=temp;
}
public void insertP(Node p,int d)
{
if(p==null) {
System.out.println("No");
return;
}
Node temp= new Node(d);
temp.next=p.next;
p.next=temp;
}
public void deleteR()
{
if(head==null)
{
System.out.println("Empty");
return;
}
if(head.next==null)
{
head=null;
return;
}
Node cur=head;
Node prev=null;
while(cur.next!=null)
{
prev=cur;
cur=cur.next;
}
cur=null;
prev.next=null;
}
public void reverse()
{
if(head==null ||head.next==null)
{
return;
}
Node cur=head;
Node temp=cur.next;
cur.next=null;
Node next;
while(temp.next!=null)
{
next=temp.next;
temp.next=cur;
cur=temp;
temp=next;
}
temp.next=cur;
head= temp;
System.out.println("Reversed");
}
public void concat(Node h2)
{
if((head==null && h2==null)||(h2==null))
{
return;
}
else if(head==null)
{
head=h2;
}
else {
Node cur=head;
while(cur.next!=null)
{
cur=cur.next;
}
cur.next=h2;
}
}
public void display()
{
if(head==null)
{
System.out.println("Empty");
return;
}
Node cur=head;
while(cur!=null)
{
System.out.print(cur.data+" ");
cur=cur.next;
}
System.out.println();
}

我相信问题是您在"F"开关的末尾break;,在这里:

case 'F':
switch(in.nextInt())  
{
case 1:
ll.insertF(in.nextInt());
break;
case 2:
ll.insertR(in.nextInt());
break;
//...
default:
break;
}
break; // here
case 'S':

但是,我强烈建议根据 OOP 原则重构您的代码,例如,不要嵌套开关执行以下操作:

case 'F':
handleF(in.nextInt());
case 'S':
handleS(in.nextInt());

你的代码很难阅读,甚至对你来说可能也是如此。

如果删除提到的break;没有帮助,那么首先考虑重构和提供更多代码,因此实际上可以为其他人编译和测试它 - 例如Node类和用户输入。