如何从用户输入 java 中查找链表中的元素



所以我有一个数据结构类的作业,我已经尝试做尽可能多的工作,但我目前被困在作业的这一部分,我需要一些帮助。作业基本上要求你制作一个 java 程序,它是一个学生记录数据库,它使用链表存储 6 个变量:id、name、subCode、subName、sem 和年份。这就是我到目前为止所做的。

主类:

import java.util.*;
public class Main {
public int id =0;
public String name= "";
public String subCode="";
public String subName="";
public String sem;
public int year;
LinkedList list = new LinkedList();
Scanner scan = new Scanner(System.in);

public void Menu() {
boolean valid = true;

while (valid) {
final  String menu[] = {"Main Menu", 
"1. Register student's subjects",
"2. Retrieve all students' subjects listing",
"3. Retrieve a student's subjects listing", 
"4. Update a student's registered subjects",
"5. Delete a student's registered subjects",
"6. Delete a student registration", 
"7. Exit"};
for (String menuList : menu)
System.out.println(menuList);

switch (scan.nextInt()) {
case 1:
create();
break;
case 2:
list.retrieveAll();
break;
case 3:
//retrieveOne();
break;
case 4:
//update();
break;                      
case 5:
//deleteSub();
break;
case 6:
deleteStud();
break;
case 7:
System.out.println("Have a nice day!");
valid = false;
break;
default:
System.out.println("You have not entered a valid option");
break;
}
}
}
public void create() {
System.out.println();
boolean validate = true;
while(validate) {
try {
System.out.println("Please enter Name");
scan.nextLine();
name = scan.nextLine();
//validate =Validation.validateName(name);

System.out.println("Please enter Student ID");
String tempID=scan.nextLine();
//  validate=Validation.validateId(tempID);
id= Integer.parseInt(tempID);
System.out.println("Please enter student Subject Code"); 
subCode=scan.nextLine();
System.out.println("Please enter Subject's Name");
subName = scan.nextLine();
System.out.println("Please enter Student's semester");
sem = scan.nextLine();
System.out.println("Please enter Student's Year of Study");
year = scan.nextInt();
scan.nextLine();
list.create(id, name, subCode, subName, sem, year);
validate=false;
/*      list.create(17052960, "Samuel Ho", "CSCP 2014", "Programming 2", "Fall 2017", 2);
list.create(17040007, "Jodi Mak", "ENVS 1014", "Enviromental Studies", "Fall 2016", 3);
list.create(17022880, "Yee Hong Chun", "MATH 1024", "Calculus 1", "Fall 2018", 1);
list.retrieveAll();
list.deleteAt(1);
list.retrieveAll();*/

}catch(Exception e) {
validate = true;
}
}
}
public void deleteStud() {
System.out.println("Enter Student ID of the student you wish to delete");
int tempID = scan.nextInt();
scan.nextLine();

}
public static void main(String[] args) {
Main main = new Main();
main.Menu();
}
}

链接列表类:

public class LinkedList {
Node head;
public void create(int id, String name, String subCode, String subName, String sem, int year) {
Node node= new Node();
node.id=id;
node.name=name;
node.subCode=subCode;
node.subName=subName;
node.sem=sem;
node.year=year;
node.next=null;
if (head==null) {
head=node;
}else {
Node n = head;
while (n.next!=null) {
n=n.next;
}
n.next=node;
}
}
public void retrieveAll() {
Node node=head;
while(node.next!=null) {
System.out.printf("%d %3s %10s %3s %14s %3dn", 
node.id, node.name, node.subCode, node.subName, node.sem, node.year );
node=node.next;
}
System.out.printf("%d %3s %10s %3s %14s %3dn", 
node.id, node.name, node.subCode, node.subName, node.sem, node.year );
}
public void deleteAt(int index) {
if (index==0)
head=head.next;
else {
Node n = head;
Node n1=null;
for (int i =0; i<index-1;i++) {
n=n.next;
}
n1=n.next;
n.next = n1.next;
System.out.println("Deleted " + n1.id);
n1=null;
}
}
}

节点类:

class Node {
int id;
String name;
String subCode;
String subName;
String sem;
int year;
Node next;
}

所以这就是我所做的,它远未完成,但我需要快速完成,我被困在 deleteStud(( 方法上。我需要用户输入要删除的学生 ID。然后,它会在链表中搜索并删除学生。我已经实现了删除某个索引,但不知道如何从他们的 id 中搜索和删除学生。这也将有助于我的 retrieveOne(( 方法,我必须从用户输入的 id 中显示学生的记录。

我希望我不要啰嗦,但我真的需要你的帮助。非常感谢。

它不是简单地与你的 deleteAt 函数相同,只是你检查节点。Id 而不是索引?

这是一个解决方案的粗略破解(我没有运行这个或任何东西(。

public void deleteId(int ID){
Node previousNode=head;
Node currentNode=head;
while(currentNode!=null){
if(currentNode.id==ID){
previousNode.next=currentNode.next;
currentNode=currentNode.next;
}else{
previousNode=currentNode;
currentNode=currentNode.next;
}
}
System.out.println("Deleted " + ID);
}

这段代码的本质作用是,它从头部开始遍历所有节点,跟踪您正在检查的当前节点以及您检查的上一个节点。

如果当前节点的 ID 等于您要查找的 ID,我们通过调整前一个节点的下一个指针将该节点从链表中删除。

最新更新