花了一晚上的时间(大约从22点到0点55分)。我总算是写出来了一个用来管理学生成绩信息的系统。用到了双链表。有关双链表的讲解及代码实现请点击此处了解更多详情。
首先讲一下目录结构,目录结构见下图:
我定义了包名为DataStructure.LinearList的java包,在包里定义了双链表的数据组织形式LinkedList1.java,接着又定义了双链表的实现类DoubleLinkedList.java。最后使用语句import DataStructure.LinearList.DoubleLinkedList;并写一个实现类用来实现管理系统。
然后再把焦点转移至实现类的代码上。代码如下所示。这里又额外导入了java.util.Date包用来实现日期显示。导入java.util.Scanner包用来实现接受用户输入。
import DataStructure.LinearList.DoubleLinkedList;
import java.util.Date;
import java.util.Scanner;
class student
{
private int no;
private Double Chinese;
private Double Math;
private Double English;
private Double Score;
private Double Average_Score;
public student(int no,Double Chinese,Double Math,Double English,Double Score,Double Average_Score)
{
this.no=no;
this.Average_Score=Average_Score;
this.Score=Score;
this.English=English;
this.Math=Math;
this.Chinese=Chinese;
}
public student(){}
public void setAverage_Score(Double average_Score) {
Average_Score = average_Score;
}
public void setChinese(Double chinese) {
Chinese = chinese;
}
public void setEnglish(Double english) {
English = english;
}
public void setMath(Double math) {
Math = math;
}
public void setScore(Double score) {
Score = score;
}
public void setNo(int no) {
this.no = no;
}
public Double getAverage_Score() {
return Average_Score;
}
public Double getChinese() {
return Chinese;
}
public Double getMath() {
return Math;
}
public Double getEnglish() {
return English;
}
public Double getScore() {
return Score;
}
public int getNo() {
return no;
}
}
public class test{
public static void main(String[] args) {
DoubleLinkedList manage=new DoubleLinkedList();
manage.InitList();
Scanner sc=new Scanner(System.in);
System.out.println("********************************************");
System.out.println("\t\t\t\t欢迎使用学生成绩统计系统v1.0");
System.out.println("\t\t\t\tAuthor:XXXXXXX");
System.out.println("\t\t\t\tDate:"+new Date());
System.out.println("********************************************");
System.out.println("系统菜单功能如下,请输入数字选择相应的功能。");
System.out.println("1、打印学生的成绩信息 2、输出每门课程的最高分 3、修改学生的成绩");
System.out.println("4、删除某个学生的信息 5、打印学生的平均成绩 6、学生排序");
System.out.println("7、退出系统 8、录入学生信息");
System.out.println("============================================");
int op = 0;
while (op<9)
{
System.out.println("请输入您要操作选项所对应的数字:");
op=sc.nextInt();
switch (op)
{
case 1:
{
System.out.println("您是需要打印全部学生的信息还是只打印某个学生的信息!\n输入0是打印全部,输入1是打印其中1位同学的信息");
int get_op=sc.nextInt();
if (get_op==0)
{
int i=0;
System.out.println(" 学生序号 语文 数学 英语 总成绩 平均成绩 ");
while (i<manage.ListLength())
{
student get_msg=(student)manage.GetElem(i);
System.out.printf("第%d位学生的成绩 %.1f %.1f %.1f %.1f %.1f\n",get_msg.getNo(),get_msg.getChinese(),get_msg.getMath(),get_msg.getEnglish(),get_msg.getScore(),get_msg.getAverage_Score());
i++;
}
}
else
{
System.out.println("请输入要打印学生信息对应的序号:");
int getch=sc.nextInt();
for (int i = 0; i < manage.ListLength(); i++) {
student get_msg=(student)manage.GetElem(i);
if (get_msg.getNo()==getch)
{
System.out.println(" 学生序号 语文 数学 英语 总成绩 平均成绩 ");
System.out.printf("第%d位学生的成绩 %.1f %.1f %.1f %.1f %.1f\n",get_msg.getNo(),get_msg.getChinese(),get_msg.getMath(),get_msg.getEnglish(),get_msg.getScore(),get_msg.getAverage_Score());
}
}
}
break;
}
case 2:
{
if (manage.ListEmpty())
{
break;
}
Double max_chinese=0.0;
int temp=0,temp1=0,temp2=0;
Double max_math=0.0;
Double max_en=0.0;
for (int i = 0; i < manage.ListLength(); i++) {
student get_msg=(student)manage.GetElem(i);
if(max_chinese< get_msg.getChinese())
{
max_chinese=get_msg.getChinese();
temp= get_msg.getNo();
}
if(max_math<get_msg.getMath())
{
max_math=get_msg.getMath();
temp1=get_msg.getNo();
}
if(max_en< get_msg.getEnglish())
{
max_en=get_msg.getEnglish();
temp2=get_msg.getNo();
}
}
System.out.printf("语文最高成绩为:%.1f,是第%d位同学\n",max_chinese,temp);
System.out.printf("数学最高成绩为:%.1f,是第%d位同学\n",max_math,temp1);
System.out.printf("英语最高成绩为:%.1f,是第%d位同学\n",max_chinese,temp2);
break;
}
case 3:
{
System.out.println("请输入要修改学生的序号:");
int getch=sc.nextInt();
Boolean tag=false;
for (int test = 0; test < manage.ListLength(); test++) {
student temp_student=(student) manage.GetElem(test);
if (temp_student.getNo()==getch)
{
tag=true;
}
}
if (!tag)
{
System.out.println("无此学生信息!");
break;
}
int i=0;
while (i<manage.ListLength())
{
student stu=(student)manage.GetElem(i);
if (stu.getNo()==getch)
{
System.out.printf("您要修改序号为%d的学生的成绩.\n",stu.getNo());
System.out.printf("该学生的成绩是:语文:%.1f数学:%.1f英语:%.1f",stu.getChinese(),stu.getMath(),stu.getEnglish());
System.out.println("请输入您要修改的科目:0、全部修改。1、修改语文。2、修改数学。3、修改英语");
int get_op=sc.nextInt();
switch (get_op)
{
case 0:
{
System.out.println("请输入学生的语文成绩:");
Double Chinese=sc.nextDouble();
System.out.println("请输入学生的数学成绩:");
Double Math=sc.nextDouble();
System.out.println("请输入学生的英语成绩:");
Double English= sc.nextDouble();
Double total=Chinese+Math+English;
Double average=total/3;
stu.setChinese(Chinese);
stu.setMath(Math);
stu.setEnglish(English);
stu.setScore(total);
stu.setAverage_Score(average);
break;
}
case 1:
{
System.out.println("请输入学生的语文成绩:");
Double Chinese=sc.nextDouble();
stu.setChinese(Chinese);
Double total=Chinese+stu.getMath()+stu.getEnglish();
Double average=total/3;
stu.setScore(total);
stu.setAverage_Score(average);
break;
}
case 2:
{
System.out.println("请输入学生的数学成绩:");
Double math=sc.nextDouble();
stu.setMath(math);
Double total=stu.getChinese()+math+stu.getEnglish();
Double average=total/3;
stu.setScore(total);
stu.setAverage_Score(average);
break;
}
case 3:
{
System.out.println("请输入学生的英语成绩:");
Double en=sc.nextDouble();
stu.setEnglish(en);
Double total=stu.getChinese()+stu.getMath()+en;
Double average=total/3;
stu.setScore(total);
stu.setAverage_Score(average);
break;
}
default:
{
System.out.println("输入有误,请重新输入吧");
break;
}
}
break;
}
i++;
}
break;
}
case 4:
{
System.out.println("请输入要删除的学生的序号:");
int getch=sc.nextInt();
Boolean tag=false;
for (int test = 0; test < manage.ListLength(); test++) {
student temp_student=(student) manage.GetElem(test);
if (temp_student.getNo()==getch)
{
tag=true;
}
}
if (!tag)
{
System.out.println("无此学生信息!");
break;
}
int i=0;
while (i<manage.ListLength())
{
student stu=(student)manage.GetElem(i);
if (stu.getNo()==getch)
{
System.out.printf("您要删除序号为%d的学生的成绩.\n",stu.getNo());
System.out.printf("该学生的成绩是:语文:%.1f数学:%.1f英语:%.1f\n",stu.getChinese(),stu.getMath(),stu.getEnglish());
manage.DeleteElem(i);
}
i++;
}
break;
}
case 5:
{
for (int i = 0; i < manage.ListLength(); i++) {
student stu=(student)manage.GetElem(i);
System.out.printf("第%d位学生的平均成绩为:%.1f\n",stu.getNo(),stu.getAverage_Score());
}
break;
}
case 6:
{
System.out.println("排序前成绩是:");
int i=0;
System.out.println(" 学生序号 语文 数学 英语 总成绩 平均成绩 ");
while (i<manage.ListLength())
{
student get_msg=(student)manage.GetElem(i);
System.out.printf("第%d位学生的成绩 %.1f %.1f %.1f %.1f %.1f\n",get_msg.getNo(),get_msg.getChinese(),get_msg.getMath(),get_msg.getEnglish(),get_msg.getScore(),get_msg.getAverage_Score());
i++;
}
System.out.println("请输入您要排序的依据:0、按总分排序。1、语文成绩排序。2、数学成绩排序。3、英语成绩排序");
int get_op=sc.nextInt();
System.out.println("请输入您是升序排序还是降序排序:1、升序。2、降序。");
int get_op1=sc.nextInt();
switch (get_op)
{
case 0:
{
student []temp=new student[manage.ListLength()];
for (int j = 0; j < temp.length; j++) {
temp[j]=(student) manage.GetElem(j);
}
if (get_op1==1)
{
for (int j = 0; j < manage.ListLength()-1; j++) {
for (int k = j+1; k < manage.ListLength(); k++) {
student temp_msg;
if (temp[j].getScore()>temp[k].getScore())
{
temp_msg=temp[j];
temp[j]=temp[k];
temp[k]=temp_msg;
}
}
}
System.out.println("排序后成绩是:");
System.out.println(" 学生序号 语文 数学 英语 总成绩 平均成绩 ");
for (int j = 0; j < temp.length; j++) {
System.out.printf("第%d位学生的成绩 %.1f %.1f %.1f %.1f %.1f\n",temp[j].getNo(),temp[j].getChinese(),temp[j].getMath(),temp[j].getEnglish(),temp[j].getScore(),temp[j].getAverage_Score());
}
}
else if(get_op1==2)
{
for (int j = 0; j < manage.ListLength()-1; j++) {
for (int k = j+1; k < manage.ListLength(); k++) {
student temp_msg;
if (temp[j].getScore()<temp[k].getScore())
{
temp_msg=temp[j];
temp[j]=temp[k];
temp[k]=temp_msg;
}
}
}
System.out.println("排序后成绩是:");
System.out.println(" 学生序号 语文 数学 英语 总成绩 平均成绩 ");
for (int j = 0; j < temp.length; j++) {
System.out.printf("第%d位学生的成绩 %.1f %.1f %.1f %.1f %.1f\n",temp[j].getNo(),temp[j].getChinese(),temp[j].getMath(),temp[j].getEnglish(),temp[j].getScore(),temp[j].getAverage_Score());
}
}
else {
System.out.println("输入选项有误,请重新输入!");
}
break;
}
case 1:
{
student []temp=new student[manage.ListLength()];
for (int j = 0; j < temp.length; j++) {
temp[j]=(student) manage.GetElem(j);
}
if (get_op1==1)
{
for (int j = 0; j < manage.ListLength()-1; j++) {
for (int k = j+1; k < manage.ListLength(); k++) {
student temp_msg;
if (temp[j].getChinese()>temp[k].getChinese())
{
temp_msg=temp[j];
temp[j]=temp[k];
temp[k]=temp_msg;
}
}
}
System.out.println("排序后成绩是:");
System.out.println(" 学生序号 语文 数学 英语 总成绩 平均成绩 ");
for (int j = 0; j < temp.length; j++) {
System.out.printf("第%d位学生的成绩 %.1f %.1f %.1f %.1f %.1f\n",temp[j].getNo(),temp[j].getChinese(),temp[j].getMath(),temp[j].getEnglish(),temp[j].getScore(),temp[j].getAverage_Score());
}
}
else if(get_op1==2)
{
for (int j = 0; j < manage.ListLength()-1; j++) {
for (int k = j+1; k < manage.ListLength(); k++) {
student temp_msg;
if (temp[j].getChinese()<temp[k].getChinese())
{
temp_msg=temp[j];
temp[j]=temp[k];
temp[k]=temp_msg;
}
}
}
System.out.println("排序后成绩是:");
System.out.println(" 学生序号 语文 数学 英语 总成绩 平均成绩 ");
for (int j = 0; j < temp.length; j++) {
System.out.printf("第%d位学生的成绩 %.1f %.1f %.1f %.1f %.1f\n",temp[j].getNo(),temp[j].getChinese(),temp[j].getMath(),temp[j].getEnglish(),temp[j].getScore(),temp[j].getAverage_Score());
}
}
else {
System.out.println("输入选项有误,请重新输入!");
}
break;
}
case 2:
{
student []temp=new student[manage.ListLength()];
for (int j = 0; j < temp.length; j++) {
temp[j]=(student) manage.GetElem(j);
}
if (get_op1==1)
{
for (int j = 0; j < manage.ListLength()-1; j++) {
for (int k = j+1; k < manage.ListLength(); k++) {
student temp_msg;
if (temp[j].getMath()>temp[k].getMath())
{
temp_msg=temp[j];
temp[j]=temp[k];
temp[k]=temp_msg;
}
}
}
System.out.println("排序后成绩是:");
System.out.println(" 学生序号 语文 数学 英语 总成绩 平均成绩 ");
for (int j = 0; j < temp.length; j++) {
System.out.printf("第%d位学生的成绩 %.1f %.1f %.1f %.1f %.1f\n",temp[j].getNo(),temp[j].getChinese(),temp[j].getMath(),temp[j].getEnglish(),temp[j].getScore(),temp[j].getAverage_Score());
}
}
else if(get_op1==2)
{
for (int j = 0; j < manage.ListLength()-1; j++) {
for (int k = j+1; k < manage.ListLength(); k++) {
student temp_msg;
if (temp[j].getMath()<temp[k].getMath())
{
temp_msg=temp[j];
temp[j]=temp[k];
temp[k]=temp_msg;
}
}
}
System.out.println("排序后成绩是:");
System.out.println(" 学生序号 语文 数学 英语 总成绩 平均成绩 ");
for (int j = 0; j < temp.length; j++) {
System.out.printf("第%d位学生的成绩 %.1f %.1f %.1f %.1f %.1f\n",temp[j].getNo(),temp[j].getChinese(),temp[j].getMath(),temp[j].getEnglish(),temp[j].getScore(),temp[j].getAverage_Score());
}
}
else {
System.out.println("输入选项有误,请重新输入!");
}
break;
}
case 3:
{
student []temp=new student[manage.ListLength()];
for (int j = 0; j < temp.length; j++) {
temp[j]=(student) manage.GetElem(j);
}
if (get_op1==1)
{
for (int j = 0; j < manage.ListLength()-1; j++) {
for (int k = j+1; k < manage.ListLength(); k++) {
student temp_msg;
if (temp[j].getEnglish()>temp[k].getEnglish())
{
temp_msg=temp[j];
temp[j]=temp[k];
temp[k]=temp_msg;
}
}
}
System.out.println("排序后成绩是:");
System.out.println(" 学生序号 语文 数学 英语 总成绩 平均成绩 ");
for (int j = 0; j < temp.length; j++) {
System.out.printf("第%d位学生的成绩 %.1f %.1f %.1f %.1f %.1f\n",temp[j].getNo(),temp[j].getChinese(),temp[j].getMath(),temp[j].getEnglish(),temp[j].getScore(),temp[j].getAverage_Score());
}
}
else if(get_op1==2)
{
for (int j = 0; j < manage.ListLength()-1; j++) {
for (int k = j+1; k < manage.ListLength(); k++) {
student temp_msg;
if (temp[j].getEnglish()<temp[k].getEnglish())
{
temp_msg=temp[j];
temp[j]=temp[k];
temp[k]=temp_msg;
}
}
}
System.out.println("排序后成绩是:");
System.out.println(" 学生序号 语文 数学 英语 总成绩 平均成绩 ");
for (int j = 0; j < temp.length; j++) {
System.out.printf("第%d位学生的成绩 %.1f %.1f %.1f %.1f %.1f\n",temp[j].getNo(),temp[j].getChinese(),temp[j].getMath(),temp[j].getEnglish(),temp[j].getScore(),temp[j].getAverage_Score());
}
}
else {
System.out.println("输入选项有误,请重新输入!");
}
break;
}
default:
{
System.out.println("输入有误,请重新输入吧!");
break;
}
}
break;
}
case 7:
{
manage.DestoryList();
System.exit(0);
break;
}
case 8:
{
System.out.println("请输入学生的序号:");
int no= sc.nextInt();
System.out.println("请输入学生的语文成绩:");
Double Chinese=sc.nextDouble();
System.out.println("请输入学生的数学成绩:");
Double Math=sc.nextDouble();
System.out.println("请输入学生的英语成绩:");
Double English= sc.nextDouble();
Double total=Chinese+Math+English;
Double average=total/3;
student stu=new student(no,Chinese,Math,English, total,average);
manage.addFirst(stu);
System.out.println("录入成功!");
break;
}
default:
{
System.out.println("输入有误,请重新输入吧");
break;
}
}
}
}
}
需要说明的是。包DataStructure.LinearList.DoubleLinkedList中的方法作用如下:
方法体 | 作用 |
public void InitList() | 初始化双链表 |
public Boolean DestoryList() | 销毁双链表 |
public Boolean ClearList() | 清理双链表 |
public Boolean ListEmpty() | 判断表是否为空 |
public int ListLength() | 返回双链表的长度 |
public Object GetElem(int index) | 使用下标值返回表中元素 |
public int LocateElem(Object elem) | 返回元素在表中的位置 |
public Object PriorElem(Object elem) | 返回指定节点的直接前驱元素 |
public Object NextElem(Object elem) | 返回指定节点的直接后继元素 |
public Boolean ListInsert(Object elem,int index) | 在指定位置插入新节点 |
public void addFirst(Object elem) | 在表头插入元素 |
public void addAfter(Object elem) | 在表尾插入元素 |
public Boolean DeleteElem(int index) | 删除指定位置的节点 |
public void TraverseList() | 遍历双链表 |
public void TraverseListByReverseOrder() | 逆序遍历双链表 |