数据结构课程实践

这篇博客介绍了多个数据结构相关的任务,包括商品管理系统、学生成绩管理系统、航班订票系统和景区景点查询系统的实现。重点讨论了二叉树的中序、前序和后序遍历(递归和非递归),以及快速排序、堆排序、直接插入排序等算法的实现。此外,还涵盖了单链表逆置、最小生成树、循环队列、一元多项式计算和猴子选大王问题等数据结构和算法题目。

一.任务清单
  1. 实现商品管理系统,要求具有以下功能:
    (1) 查询所有书籍信息 (2) 按书籍编号查询 (3) 购买书籍 (4) 取消购买 (5) 查询购买情况 (6) 退出
    注:一人一辆购物车,购物车中保存被购买的书籍以及书籍的购买数量,购物车中保存的书籍不能重复,如果一本书籍被购买多次,购物车中的数量需发生变化。(难度系数为 5)
  2. 实现学生成绩管理系统,要求具有以下功能:
    (1)、信息录入,包括记录的追加和插入 (2) 信息删除 (3) 信息修改 (4)信息排序和查询 (5)、信息的保存和加载 (6)简单的说明和帮助。(难度系数为5)
  3. 实现航班订票系统,要求具有以下功能:
    (1) 录入:可以录入航班情况(数据可以存储在一个数据文件中,数据结构、具体数据自定) (2) 查询:可以查询某个航线的情况(如,输入航班号,查询起降时间,起飞抵达城市,航班票价,票价折扣,确定航班是否满仓) (3) 可以输入起飞抵达城市,查询飞机航班情况;(4) 订票:(订票情况可以存在一个数据文件中,结构自己设定)可以订票,如果该航班已经无票,可以提供相关可选择航班 (5)退票: 可退票,退票后修改相关数据文件 (6) 修改航班信息:当航班信息改变可以修改航班数据文件 (7)客户资料有姓名,证件号,订票数量及航班情况,订单要有编号(难度系数为5)
    4.实现景区景点查询及导游系统,要求具有以下功能:
    (1)景区介绍 (2)相关信息录入及显示 (3)景区相关景点等信息查询 (4)根据景区游客的实际需求为游客提供景区导游功能 (5) 景区活动等查询(难度系数为5)
  4. 数据结构相关操作及算法实现
    (1)、建立二叉树实现中序遍历 (含递归和非递归算法实现)。要求:二叉树中结点的值存放于一个一维数组T[n]中,T[0]开始顺序读出各结点的值,建立该二叉树的二叉链表表示。 或能够从键盘上输入树的各个结点值,建立二叉树的二叉链表存储表示,输出中序遍历结果。(难度系数为2)
    (2)、快速排序。任务:用程序实现线性表基础上的冒泡和快速排序,并输出排序结果,数据可通过随机函数随机生成。(难度系数为3)
    (3)、堆排序
    任务:编程实现线性表基础上的堆排序,并输出排序结果数据可通过随机函数随机生成。(难度系数为3)
    (4)、直接插入排序
    任务:编程序实现线性表基础上的排序,并输出排序结果。数据可通过随机函数随机生成,也可通过键盘直接输入。(难度系数为2)
    (5)、建立二叉树实现后序遍历(含递归和非递归算法实现)。要求:二叉树中结点的值存放于一个一维数组T[n]中,T[0]开始顺序读出各结点的值,建立该二叉树的二叉链表表示。 或能够从键盘上输入树的各个结点值,建立二叉树的二叉链表存储表示,输出后序遍历结果。(难度系数为3)
    (6)、建立二叉树,实现中序线索二叉树存储结构,并实现在此基础上的中序遍历。
    要求:二叉树中结点的值存放于一个一维数组T[n]中,T[0]开始顺序读出各结点的值,建立该二叉树的线索化的二叉链表表示。 或能够从键盘上输入树的各个结点值,建立二叉树的线索二叉链存储表示,并输出中序遍历结果。(难度系数为3)
    (7)、连通网络的最小生成树
    要求:通过输入图的顶点和边的信息,建立连通网络的邻接表或邻接矩阵存储结构,求出其最小生成树。 (难度系数为3)
    (8)、拓扑排序
    任务:编写函数实现图的拓扑排序。(难度系数为2)
    (9)、实现Dijkstra算法
    要求:对有向网络用Dijkstra算法求出单源最短路径。(难度系数为3)
    (10)、实现单链表上的选择排序。(难度系数为2)
    (11)、单链表的逆置
    要求:逆置后的单链表是一个新的单链表,但表中的结点不是新生成的,而是从原链表中得到。(难度系数为2)
    (12)、有向图采用邻接矩阵存储,编写算法求出图中各个顶点的入度和出度。(难度系数为3)
    (13)、建立顺序存储的循环队列,并实现其上的in入队、出队以及输出队列中的所有元素等操作。(难度系数为2)
    (14)、建立二叉树,实现层次遍历。 要求:二叉树中结点的值存放于一个一维数组T[n]中,T[0]开始顺序读出各结点的值,建立该二叉树的二叉链表表示。 或能够从键盘上输入树的各个结点值,建立二叉树的二叉链存储表示,输出层次遍历结果。(难度系数为2)
    (15)、一元多项式计算。 要求:能够按照指数降序排列建立并输出多项式;能够完成两个多项式的相加、相减,并将结果输出;(难度系数为2)
    (16)、joseph环。 任务:编号是1,2,……,n的n个人按照顺时针方向围坐一圈,每个人只有一个密码(正整数)。一开始任选一个正整数作为报数上限值m,从第一个人开始顺时针方向自1开始顺序报数,报到m时停止报数。报m的人出列,将他的密码作为新的m值,从他在顺时针方向的下一个人开始重新从1报数,如此下去,直到所有人全部出列为止。设计一个程序来求出出列顺序。要求:利用单向循环链表存储结构模拟此过程,按照出列的顺序输出各个人的编号。(难度系数为2)
    (17)、猴子选大王。任务:一堆猴子都有编号,编号是1,2,3 …m ,这群猴子(m个)按照1-m的顺序围坐一圈,从第1开始数,每数到第N个,该猴子就要离开此圈,这样依次下来,直到圈中只剩下最后一只猴子,则该猴子为大王。要求:输入m, n,其中 m, n 为整数,n<m,按照m个猴子,数n 个数的方法,输出为大王的猴子的编号。(难度系数为2)
    (18)、已知有序表中的元素以值递增有序排列,并以带头结点的单链表作存储结构。试编写算法删除表中所有值大于mink且小于maxk的元素,同时释放被删结点空间,并分析算法的时间复杂度。(难度系数为2)
    (19)、将两个有序的单链表合并成一个有序的单链表。(难度系数为2)
    (20)、背包问题求解
    假设有一个能装入总体积为T的背包和n件体积分别为w1 、w2、w3、w4、w5…wn的物品,能否从n件物品中挑选若干件恰好填满背包,即使w1 +w2+w3+w4+w5+wn =T,要求找出所有满足上述条件的解。(难度系数为3)
    (21)、假设哈希表长为m,哈希函数为H(x),用链地址法处理冲突,使编写输入一组关键字并建造哈希表的算法。(难度系数为2)
    (22)、以排序为主题相关排序算法。(难度系数为7,最少包含直接插入排序、简单选择排序、冒泡排序、堆排序、快速排序、归并排序)
    (23)、以树为主题的树相关算法。(难度系数为10,最少包含树的二叉链表存储、树的三种递归遍历算法、树的中序非递归遍历算法、二叉排序树的建立和二叉排序树上的静态查找)
    (24)、以图为主题的图相关算法。(难度系数为10,最少包含图的一种存储方式、图的深度或广度优先遍历、图的最小生成树、有向图的拓扑排序)
二.代码实现
2. 实现学生成绩管理系统,要求具有以下功能:(5)
(1)、信息录入,包括记录的追加和插入  (2)  信息删除   (3) 信息修改   (4)信息排序和查询  (5)、信息的保存和加载       (6)简单的说明和帮助。(难度系数为5)
package com.课程实践;

import java.util.Objects;

public class StudentNode implements Comparable<StudentNode>{
   
   
    private String name;
    private Integer score;
    private Integer StudentNo;
    private Integer age;
    private char sex;
    private StudentNode next;

    public StudentNode(String name,  int studentNo, int age, char sex,int score, StudentNode next) {
   
   
        this.name = name;
        this.score = score;
        StudentNo = studentNo;
        this.age = age;
        this.sex = sex;
        this.next = next;
    }

    public Integer getStudentNo() {
   
   
        return StudentNo;
    }

    public void setStudentNo(Integer studentNo) {
   
   
        StudentNo = studentNo;
    }

    public StudentNode getNext() {
   
   
        return next;
    }

    public void setNext(StudentNode next) {
   
   
        this.next = next;
    }

    public String getName() {
   
   
        return name;
    }

    public void setName(String name) {
   
   
        this.name = name;
    }


    public Integer getAge() {
   
   
        return age;
    }

    public void setAge(Integer age) {
   
   
        this.age = age;
    }

    public char getSex() {
   
   
        return sex;
    }

    public void setSex(char sex) {
   
   
        this.sex = sex;
    }

    @Override
    public int compareTo(StudentNode o) {
   
   
        return this.score - o.score;
    }



    public Integer getScore() {
   
   
        return score;
    }

    public void setScore(Integer score) {
   
   
        this.score = score;
    }

    @Override
    public boolean equals(Object o) {
   
   
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        StudentNode that = (StudentNode) o;
        return score == that.score &&
                StudentNo == that.StudentNo &&
                age == that.age &&
                sex == that.sex &&
                Objects.equals(name, that.name) &&
                Objects.equals(next, that.next);
    }

    @Override
    public int hashCode() {
   
   
        return Objects.hash(name, score, StudentNo, age, sex, next);
    }

    @Override
    public String toString() {
   
   
        return "学生学号: " + this.getStudentNo() +"  学生姓名: " + this.getName()+ "  性别 "+ getSex()+ "  本次成绩: " + getScore();
    }
}

package com.课程实践;


import javax.net.ssl.SNIHostName;
import java.util.InputMismatchException;
import java.util.Scanner;

public class StudentList {
   
   
    StudentNode head;
    int N;

    public StudentList() {
   
   
        this.head = null;
        N = 0;
    }

    // 按着成绩插入
    public  void addStudent(String name,Integer score ,int studentNo,int age,char sex){
   
   
        StudentNode student = new StudentNode(name,studentNo,age,sex,score,null);

        if (head == null){
   
   
            head = student;
            this.N++;
            System.out.println("添加成功");
            return;
        }

        if (score.compareTo(head.getScore()) > 0) {
   
   
            student.setNext(head);
            head = student;
            this.N++;
            System.out.println("添加成功");
            return;
        }

        StudentNode node = head.getNext();
        StudentNode preNode = head;

        if (node == null){
   
   
            head.setNext(student);
            this.N++;
            System.out.println("添加成功");
            return;
        }

        while(node != null){
   
   
            if (score.compareTo(node.getScore()) > 0){
   
   
                preNode.setNext(student);
                student.setNext(node);
                this.N++;
                System.out.println("添加成功");
                return;
            }else{
   
   
                node = node.getNext();
                preNode = preNode.getNext();
            }
        }
        preNode.setNext(student);
        this.N++;
        System.out.println("添加成功");
        return;
    }

    public void addStudent(StudentNode student){
   
   
        if (head == null){
   
   
            head = student;
            this.N++;
            System.out.println("添加成功");
            return;
        }

        if (student.getScore().compareTo(head.getScore()) > 0) {
   
   
            student.setNext(head);
            head = student;
            this.N++;
            System.out.println("添加成功");
            return;
        }

        StudentNode node = head.getNext();
        StudentNode preNode = head;

        if (node == null){
   
   
            head.setNext(student);
            this.N++;
            System.out.println("添加成功");
            return;
        }

        while(node != null){
   
   
            if (student.getScore().compareTo(node.getScore()) > 0){
   
   
                preNode.setNext(student);
                student.setNext(node);
                this.N++;
                System.out.println("添加成功");
                return;
            }else{
   
   
                node = node.getNext();
                preNode = preNode.getNext();
            }
        }
        preNode.setNext(student);
        this.N++;
        System.out.println("添加成功");
        return;
    }

    // 学生信息删除
    public void deleteStudent(Integer studentNo){
   
   
        StudentNode node = head.getNext();
        StudentNode preNode = head;
        if (studentNo.equals(preNode.getStudentNo())) {
   
   
            head = head.getNext();
            this.N --;
            System.out.println("删除成功");
            System.out.println("删除后学生个数 ");
            return;
        }
        while(node != null){
   
   
            if (studentNo.equals(node.getStudentNo())){
   
   
                preNode.setNext(node.getNext());
                System.out.println("删除成功");
                this.N --;
                System.out.println();
                return;
            }else{
   
   
                node = node.getNext();
                preNode = preNode.getNext();
            }
        }
        System.out.println("删除失败,无此学生");
        System.out.println("删除后学生个数 ");
    }

    public void modifyStudent(Integer studentNo,String newName){
   
   
        StudentNode node = head;
        while(node != null){
   
   
            if (studentNo.equals(node.getStudentNo())){
   
   
                node.setName(newName);
                System.out.println("修改姓名成功");
                System.out.println("删除后学生个数 ");
                return;
            }else{
   
   
                node = node.getNext();
            }
        }
        System.out.println("修改失败,无此学生");
        System.out.println("删除后学生个数 ");
    }

    public void modifyStudent(Integer studentNo,int score) {
   
   
        StudentNode node = head;
        while (node != null) {
   
   
            if (studentNo.equals(node.getStudentNo())) {
   
   
                node.setScore(score);
                deleteStudent(studentNo);
                addStudent(node);
                System.out.println("修改成绩成功,并重新排名");
                System.out.println("删除后学生个数 ");
                return;
            } else {
   
   
                node = node.getNext();
            }
        }
        System.out.println("修改失败,无此学生");
        System.out.println("删除后学生个数 ");
    }

    public void showAllStudents(){
   
   
        StudentNode currentNode = head;
        int count = 1;
        while (currentNode != null){
   
   
            System.out.print(currentNode);
            System.out.println("  本次排名 " + count);
            count++;
            currentNode = currentNode.getNext();
        }
    }

    public void findStudent(Integer studentNo){
   
   
        StudentNode currentNode = head;
        int count = 1;
        while(currentNode != null){
   
   
            if (studentNo.equals(currentNode.getStudentNo())){
   
   
                System.out.print(currentNode);
                System.out.println("  本次排名 " + count);
                return;
            }else{
   
   
                currentNode = currentNode.getNext();
                count++;
            }
        }
        System.out.println("查询失败,没有此学生");
        System.out.println("删除后学生个数 ");
    }

    public Integer getAns(){
   
   
        Scanner scanner = new Scanner(System.in);
        Integer ans;
        try {
   
   
            ans = scanner.nextInt();
        }catch (InputMismatchException e){
   
   
            System.out.println("请正确输入您要选择的编号");
            ans = getAns();
        }
        return ans;
    }

    public Integer getTrueStudentNo(){
   
   
        Scanner scanner = new Scanner(System.in);
        Integer No;
        try {
   
   
            No = scanner.nextInt();
        }catch (InputMismatchException e){
   
   
            System.out.println("请正确输入学号");
            No = getTrueStudentNo();
        }
        return No;
    }

    public Integer getTrueAge(){
   
   
        Scanner scanner = new Scanner(System.in);
        Integer age;
        try {
   
   
            age = scanner.nextInt();
        }catch (InputMismatchException e){
   
   
            System.out.println("请正确输入年龄");
            age = getTrueAge();
        }
        return age;
    }

    public Integer getTrueScore(){
   
   
        Scanner scanner = new Scanner(System.in);
        Integer ans;
        try {
   
   
            ans = scanner.nextInt();
        }catch (InputMismatchException e){
   
   
            System.out.println("请正确输入分数");
            ans = getTrueScore();
        }
        return ans;
    }

    public String getTrueName(){
   
   
        Scanner scanner = new Scanner(System.in);
        String name;
        try {
   
   
            name = scanner.next();
        
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值