数据结构_链表的实现

这里是线性表的实现代码如下: 

需要注意的是、输入中文的时候记得改编码方式 GBK

import java.util.Scanner;

public class Sequence_list1 {

    static Node[] ListNode = new Node[100]; // 初始化 链表的长度、、
    static int len; // 定义当前列表的长度、、
    static Scanner input = new Scanner(System.in);

    static class Node {

        String stuNum;
        String name;
        int grade;
//        Node next;

        public Node() {
        }

        public Node(String stuNum, String name, int grade) {
            this.stuNum = stuNum;
            this.name = name;
            this.grade = grade;
        }

    }

    public static void main(String[] args) {
        Init();
        int n;
        while (true) {
            Init1();
            n = input.nextInt();
            if (n == 8) {
                break;
            }
            execute(n);
        }
    }

    private static void Init1() {
        System.out.println("1、添加学生、、、");
        System.out.println("2、遍历表中的信息、、、");
        System.out.println("3、输入姓名、根据姓名查找学生、、、、");
        System.out.println("4、指定位置返回相应位置的学生呢、、、");
        System.out.println("5、输入学生信息、插入到指定位置、、");
        System.out.println("6、删除指定位置的学生、、、");
        System.out.println("7、统计(表中)学生的个数、、、");
        System.out.println("8、退出系统、、、");
    }

    private static void execute(int n) {
        switch (n) {
            case 1:
                System.out.println("输入需要添加的学生个数、、、");
                System.out.flush();
                int a = input.nextInt();
                add(a);
                System.out.println("添加成功、、、");
                break;
            case 2:
                display();
                break;
            case 3:
                System.out.println("输入查找的学生的姓名:");
                String s = input.next();
                Node tmp = findName(s);
                if (tmp == null) {
                    System.out.println("当前表中无该学生的信息!");
                } else {
                    System.out.println("该学生的学号为:" + tmp.stuNum + " 姓名:" + tmp.name + " 成绩:" + tmp.grade);
                }
                break;
            case 4:
                System.out.println("输入查找学生的位置:");
                n = input.nextInt();
                Node temp = findIndex(n);
                if (temp == null) {
                    System.out.println("输入位置不合法!");
                } else {
                    System.out.println("学号:" + temp.stuNum + " 姓名:" + temp.name + " 成绩:" + temp.grade);
                }
                break;
            case 5:
                System.out.println("输入插入的位置:");
                n = input.nextInt();
                System.out.println("请分别输入学生的学号、姓名、以及成绩、、、");
                String stuNum = input.next();
                String sName = input.next();
                int grade = input.nextInt();
                insert(n, new Node(stuNum, sName, grade));
                break;
            case 6:
                System.out.println("输出需要删除的学生的位置:");
                n = input.nextInt();
                Node aa = findIndex(n);
                delete(n);
                System.out.println("成功删除学生:" + aa.name);
                break;
            case 7:
                System.out.print("这个表中存储的学生数为:");
                System.out.println(getLength());
                break;
            default:
                break;
        }
    }

    private static void add(int n) {
        String sName;
        String stuNum;
        int grade;
        int start = len;
        for (int i = start; i < n; i++) {
            System.out.println("请分别输入学生的学号、姓名、以及成绩、、、");
            stuNum = input.next();
            sName = input.next();
            grade = input.nextInt();
//            System.out.println("stuNum:" + stuNum + " sName:" + sName + " grade:" + grade);
            ListNode[i].stuNum = stuNum;
            ListNode[i].name = sName;
            ListNode[i].grade = grade;
            len++;
        }
    }

    private static void Init() {
        for (int i = 0; i < 100; i++) {
            ListNode[i] = new Node();
        }
    }

    private static int getLength() {
        return len;
    }

    private static Node findIndex(int index) {
        if (index < 0 || index > len) {
            return null;
        }
        return ListNode[index];
    }

    private static Node findName(String name) {
        for (int i = 0; i < len; i++) {
            if (ListNode[i].name.equals(name)) {
                return ListNode[i];
            }
        }
        return null;
    }

    private static void display() {
        if (len == 0) {
            System.out.println("当前表为空、、、");
        } else {
            for (int i = 0; i < len; i++) {
                System.out.println("当前表中:第" + (i + 1) + "个学生、 学号:" + ListNode[i].stuNum + " 姓名:" + ListNode[i].name + " 成绩:" + ListNode[i].grade);
            }
        }
    }

    private static boolean insert(int index, Node node) {
        if (len < 100) {
            for (int i = len; i > index; i--) {
                ListNode[i] = ListNode[i - 1];
            }
            ListNode[index] = node;
            len++;
            return true;
        }
        return false;
    }

    private static boolean delete(int value) {
        if (value < 0 || value > len) {
            return false;
        }
        for (int i = value; i < len - 1; i++) {
            ListNode[i] = ListNode[i + 1];
        }
        len--;
        return true;
    }

}

链表的实现:输入中文一样要改成GBK的编码方式

import java.util.Scanner;

public class Linked_list {

    static Scanner input = new Scanner(System.in);
    static int len;
    static Node head = null;

    static class Node {
        String stuName;
        String name;
        int grade;
        Node next;

        public Node() {
        }

        public Node(String stuName, String name, int grade) {
            this.stuName = stuName;
            this.name = name;
            this.grade = grade;
        }

        public Node(String stuName, String name, int grade, Node next) {
            this.stuName = stuName;
            this.name = name;
            this.grade = grade;
            this.next = next;
        }
    }

    public static void main(String[] args) {
        int n;
        while (true) {
            Init();
            n = input.nextInt();
            if (n == 8) {
                break;
            }
            execute(n);
        }
    }

    private static void Init() {
        System.out.println("1、添加学生、、、");
        System.out.println("2、遍历表中的信息、、、");
        System.out.println("3、输入姓名、根据姓名查找学生、、、、");
        System.out.println("4、指定位置返回相应位置的学生呢、、、");
        System.out.println("5、输入学生信息、插入到指定位置、、");
        System.out.println("6、删除指定位置的学生、、、");
        System.out.println("7、统计(表中)学生的个数、、、");
        System.out.println("8、退出系统、、、");
    }

    public static void execute(int n) {
        switch (n) {
            case 1:
                System.out.println("输入需要添加学生的个数、");
                int nn = input.nextInt();
                for (int i = 0; i < nn; i++) { // 添加 nn 和学生哈、、、
                    add();
                }
                break;
            case 2:
                display();
                break;
            case 3:
                System.out.print("输入需要查找学生的姓名:");
                String s = input.next();
                Node node = FindName(s);
                if (node == null) {
                    System.out.println("输入的学生信息不存在、或者表为空、、");
                } else {
                    System.out.println("该学生、学号为:" + node.stuName + " 姓名:" + node.name + " 成绩:" + node.grade);
                }
                break;
            case 4:
                System.out.print("输入查找的位置:");
                int n1 = input.nextInt();
                Node node1 = FindIndex(n1);
                if (node1 == null) {
                    System.out.println("没有查找到、可能原因是、位置不符合要求、");
                } else {
                    System.out.println("该学生、学号为:" + node1.stuName + " 姓名:" + node1.name + " 成绩:" + node1.grade);
                }
                break;
            case 5:
                System.out.println("输入学生的信息:");
                String sNum, Name;
                int grade;
                sNum = input.next();
                Name = input.next();
                grade = input.nextInt();
                Node node2 = new Node(sNum, Name, grade);
                System.out.println("输入需要插入的位置:");
                int n2 = input.nextInt();
                if (InsertIndex(node2, n2)) {
                    System.out.println("插入成功!");
                } else {
                    System.out.println("未知原因失败了、、");
                }
                break;
            case 6:
                System.out.println("输入想删除的位置的");
                int n3 = input.nextInt();
                Node node3 = deleteIndex(n3);
                if (node3 == null) {
                    System.out.println("未知原因失败了、、");
                } else {
                    System.out.println("删除成功!");
                    System.out.println("所删除的学生、学号:" + node3.name + " 姓名:" + node3.stuName + " 成绩:" + node3.grade);
                }
                break;
            case 7:
                System.out.println(getLength());
                break;
            default:
                break;
        }
    }

    public static void add() {
        
        System.out.println("请输入学生的学号、姓名、以及成绩:?");
        String sNum, Name;
        int grade;
        sNum = input.next();
        Name = input.next();
        grade = input.nextInt();
        Node node = new Node(sNum, Name, grade); // 临时结点存储、、
        if(head == null){
            head = node;
            return;
        }
        Node tmpNode = head;
        while (tmpNode.next != null) { // 这个是从尾巴处添加、、
            tmpNode = tmpNode.next;
        }
        tmpNode.next = node;
    }

    public static void display() {
        if (head == null) { //  这个链表是空的、、
            System.out.println("当前的链表为空、、、");
            return;
        }
        Node tmpNode = head;
        while (tmpNode != null) {
            System.out.println("学号:" + tmpNode.stuName + " 姓名:" + tmpNode.name + " 成绩:" + tmpNode.grade);
            tmpNode = tmpNode.next;
        }
    }

    public static Node FindName(String name) {
        if (head == null) { //这链表就是空的、、、
            return null;
        }
        Node tmpNode = head;  // 这个指向 头结点、、
        while (tmpNode.next != null || tmpNode.name.endsWith(name)) { // 存在后序结点、  当前位置是不是需要查找的这个位置、、
            if (tmpNode.name.endsWith(name)) {
//                System.out.println("找到拉!!!");
//                System.out.println("学号:" + tmpNode.stuName + " 姓名:" + tmpNode.name + " 成绩:" + tmpNode.grade);
                return tmpNode;
            }
            tmpNode = tmpNode.next; //  指向下一个结点、、
        }
        return null;
    }

    public static Node FindIndex(int index) { // 按给的位置查找元素、、
        Node tmpNode = head;
        int tmpNum = 0;
        while (tmpNode.next != null || tmpNum == index) {
            if (tmpNum == index) {
                return tmpNode;
            }
            tmpNode = tmpNode.next;
            tmpNum++;
        }
        return null; //  找遍 整个链表了也没有找到、、
    }

    public static boolean InsertIndex(Node node, int n) { // 插入到指定的位置、、
        int len = 0;
        Node tmpNode = head; // 存头结点、  (头结点不能改变、、)
        while (tmpNode.next != null || (len + 1) == n || len == n) { // len是 插入第一个的情况、 不然len + 1 就会事先判断出来、(并进行处理)
            if(len == n){
//                Node tmp = node;
                node.next = head;
                head = node;
                return true;
            }
            if ((len + 1) == n) {  // 下面一个结点就是了、、
                Node tmp = tmpNode;   // 保存当前结点、、
                tmpNode = tmp.next; //  这个指向需要插入的结点、、
                tmp.next = node; // 插入、
                node.next = tmpNode; // 续接起来、、
                return true;
            }
            tmpNode = tmpNode.next;
            len++;
        }
        return false;
    }

    public static Node deleteIndex(int index) {
        int len = 0;
        Node tmpNode = head; // 存头结点、  (头结点不能改变、、)
        while (tmpNode.next != null || (len + 1) == index || len == index) {
            if(len == index){
                Node tmp = head; // 存头结点、、
                head = head.next;  //当前头结点指向下一个、、
                return tmp; // 返回之前的头结点、、
            }
            if ((len + 1) == index) { //  需要删除的就是下一个结点、、
                if (tmpNode.next == null) { //  // 下一个结点本来是空的、、
                    return null;
                }
                Node tmp = tmpNode; // 保存当前结点(下一个结点为需要删除的结点、、)
                tmpNode = tmpNode.next; //  指向下一个结点、、
                tmp.next = tmpNode.next;  //  接替下一个结点的指向、、
                tmpNode.next = null; // 删除的结点指向为 null 
                return tmpNode;
            }
            tmpNode = tmpNode.next;
            len++;
        }
        return null;
    }

    public static int getLength() {
        int len = 0;
        Node tmpNode = head;
        while (tmpNode != null) {
            tmpNode = tmpNode.next;
            len++;
        }
        return len;
    }

}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值