编程实现链表:
要求:1.循环输入学生学号和成绩。并将学生信息加入到链表中;
2.链表中的信息按学生成绩的高-->低进行排序;
3.如果输入的学生信息中,学号重复,则仅更新学生成绩,不添加新的节点。
import java.util.Scanner;
public class TestLink {
// 测试主函数
public static void main(String[] args) {
LinkList list = new LinkList();
Scanner sc = new Scanner(System.in);
String ask = "";
do {
System.out.print("请录入学号:");
int no = sc.nextInt();
System.out.print("请录入成绩:");
int num = sc.nextInt();
Student s = new Student(no, num);
list.addAndSet(s);// 调用方法.将学生信息擦人链表
System.out.println("是否继续Y/N");
ask = sc.next();
} while (ask.equals("Y") || ask.equals("y"));
System.out.println("排序前学生成绩一览:");
list.listAll();// 输出学生信息
// 对学生成绩进行排序.(按成绩高-->低)
list.bubbleSort();
System.out.println("\n排序后学生成绩一览:");
list.listAll();// 输出学生信息
}
}
/**
* 学生类
*/
class Student {
private int no;
private int num;
public Student(int no, int num) {
super();
this.no = no;
this.num = num;
}
public int getNo() {
return no;
}
public void setNo(int no) {
this.no = no;
}
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
}
/**
* 链表结点类
*/
class Node {
private Student student;
private Node next; // 链表结点的指针域,指向直接后继结点
public Node() {
next = null;
}
public Node(Student student, Node next) {
this.student = student;
this.next = next;
}
public Student getStudent() {
return student;
}
public void setStudent(Student student) {
this.student = student;
}
public Node getNext() {
return this.next;
}
public void setNext(Node next) {
this.next = next;
}
}
/**
* 链表类
*/
class LinkList {
private Node head = null; // 头结点指针
private int size = 0;
public LinkList() {
head = new Node();
size = 0;
}
public Node getHead() {
return this.head;
}
public void setHead(Node head) {
this.head = head;
}
public int getSize() {
return this.size;
}
public boolean isEmpty() {
return (size == 0);
}
// 插入/修改 学生对象
public boolean addAndSet(Student stu) {
Node node;
// 判断链表是否为空;如果为空则在表头插入
if (size == 0) {
// 定义一个新的节点,并将将新结点的指针指向链表的首结点
node = new Node(stu, this.head.getNext());
// 把节点插入到head后,设置新结点为链表的首结点
this.head.setNext(node);
// 链表长度加1
size++;
return true;
}
// 当链表不为空时候,判断是否有重复的学号.有则替换.无则在结尾插入.
else {
Node n;
for (n = head; n.getNext() != null; n = n.getNext()) {
// 学号相同.更新学生成绩
if (n.getNext().getStudent().getNo() == stu.getNo()) {
n.getNext().getStudent().setNum(stu.getNum());
return true;
}
}
// 如果学号不同,在链表结尾插入
Node temp = head;
while (null != temp.getNext()) {
temp = temp.getNext();
}
node = new Node(stu, temp.getNext());
temp.setNext(node);
size++;
return true;
}
}
// 控制台输出链表所有内容
public void listAll() {
for (Node curr = head.getNext(); curr != null; curr = curr.getNext()) {
System.out.print("\n学号: " + curr.getStudent().getNo() + "\t");
System.out.print("成绩: " + curr.getStudent().getNum() + "\t");
}
System.out.println("");
}
// 链表冒泡排序方法.学生成绩进行排序.(按成绩高-->低)
public void bubbleSort() {
Node p, q;
Student temp;
for (p = head.getNext(); p.getNext() != null; p = p.getNext()) {
for (q = head.getNext(); q.getNext() != null; q = q.getNext()) {
if (q.getStudent().getNum() < q.getNext().getStudent().getNum()) {
temp = q.getStudent();
q.setStudent(q.getNext().getStudent());
q.getNext().setStudent(temp);
}
}
}
}
}
内容可以直接拉入IDE中.右键运行.