JAVA LinkList插入排序

来源:互联网 发布:淘宝网怎么找厂家店 编辑:程序博客网 时间:2024/06/05 18:37
 

 

编程实现链表:

      要求: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中.右键运行.

原创粉丝点击