首页 > 其他分享 >哈希表代码

哈希表代码

时间:2022-10-09 16:35:48浏览次数:52  
标签:head 代码 System next 链表 哈希 id out

1.Dome01----------------------------------------------------------------------------------------------------

`package hashTable;

import java.util.Scanner;

public class Dome01 {
public static void main(String[] args) {
HashTable hashTable = new HashTable(10);
while (true) {
System.out.println("-------请选择下列操作命令进行操作:--------");
System.out.println("添加学生输入:add");
System.out.println("遍历所有学生输入:list");
System.out.println("删除学生输入:del");
System.out.println("查找学生输入:find");
Scanner scanner = new Scanner(System.in);
String string = scanner.next();
switch (string) {
case "add":
System.out.println("请输入学生id:");
;
int id = scanner.nextInt();
System.out.println("请输入学生姓名:");
String name = scanner.next();
Student student = new Student(id, name);
hashTable.addStudent(student);
break;
case "list":
hashTable.listStudent();
break;
case "del":
System.out.println("请输入要删除的学生id:");
id = scanner.nextInt();
hashTable.delStudent(id);
break;
case "find":
System.out.println("请输入要查找的学生id:");
id = scanner.nextInt();
hashTable.findStudent(id);
break;
default:
scanner.close();
System.exit(0);
break;
}
}

}

}`

2.HashTable-----------------------------------------------------------------------------------------------

`package hashTable;

public class HashTable {
LinkTable[] hashTable;
int size;

public HashTable(int size) {
    this.size = size;
    hashTable=new LinkTable[size];
    for (int i=0;i<size;i++){
        hashTable[i]=new LinkTable();
    }
}

public void addStudent(Student student){
    int i=student.id%size;
    hashTable[i].addStudent(student);
}
public void listStudent(){
    for(int i=0;i<size;i++){
        hashTable[i].listStudent(i);
    }
}

public void findStudent(int id){
   int i=id%size;
   hashTable[i].findStudent(id);
}
public void delStudent(int id){
    int i=id%size;
    hashTable[i].delStudent(id);
}

}
`

3.LinkTable-----------------------------------------------------------------------------------------------

package hashTable;

public class LinkTable {
Student head;

public void addStudent(Student student) {
    if (head == null) {//添加第一个学生
        head = student;
        return;
    }
    Student s = head;//媒介
    while (true) {//添加非第一个学生
        if (s.next == null) {//说明到了最后一个位置了,我们在最后一个位置插入。
            s.next = student;//添加学生到链表。
            break;
        }
        s = s.next;//没到最后位置就后移
    }
}

public void listStudent(int i) {//遍历链表学生
    if (head == null) {//链表为空
        System.out.printf("第%d个链表为空:",i+1);
        System.out.println("");//每条链表打印的时候就换行隔开
        return;
    }
    System.out.printf("第%d个链表学生依次为:",i+1);
    Student s = head;
    while (true) {
        System.out.printf("==>> id=%d name=%s",s.id,s.name);
        if(s.next==null){//到了最后一个学生
            break;
        }else{
            s=s.next;//后移
        }
    }
    System.out.println("");//每条链表打印的时候就换行隔开
}

public void findStudent(int id) {//遍历链表学生
    if (head == null) {//链表为空
        System.out.printf("id=%d的学生所在的链表为空,所以该学生不存在\n",id);
        return;
    }
    Student s = head;
    while (true) {
        if(s.id==id) {
            System.out.printf("已找到该学生的信息: id=%d name=%s\n", s.id, s.name);
            break;
        }
        if(s.next==null){//到了最后一个学生
            System.out.printf("id=%d的学生不存在\n",id);
            break;
        }else{
            s=s.next;//后移
        }
    }
}

public void delStudent(int id) {//删除id对应的学生
    if (head == null) {//链表为空
        System.out.printf("id=%d的学生所在的链表为空,所以该学生不存在,删除失败\n",id);
        return;
    }
    Student s = head;//辅助指针
    Student front=head;//当前学生的前一个学生
    //能到这里至少说明该链表有一个学生。
    //------------第一个元素有点特殊,和后面的元素分开写--------------
    if(s.id==id){//表明第一个就是要删除的对象
        if(s.next==null){//第一个也是最后一个元素
            head=null;//现在该链表任何学生都没有了
            //这里可以写点东西把垃圾清除了
        }else{//第一个元素后面还有很多元素,由于把第一个元素删了,于是把head指向第二个元素
            head=head.next;
        }
        System.out.println("删除成功\n");
        return;
    }else{//表明第一个不是就是要删除的对象
       s= s.next;
    }
    //--------------中间元素---------------
    while (true) {
        if(s.id==id){
            front.next=s.next;//删除
            System.out.println("删除成功\n");
            return;
        }
        if(s.next==null){
            System.out.println("很遗憾遍历了整个链表都未能找到对应的学生,学生不存在!\n");
            return;
        }
        s=s.next;
        front=front.next;
    }
}

}

4.Student-----------------------------------------------------------------------------------------------

package hashTable;

public class Student {
int id;
String name;
Student next;

public Student(int id, String name) {
    this.id = id;
    this.name = name;
}

}

标签:head,代码,System,next,链表,哈希,id,out
From: https://www.cnblogs.com/pengti/p/16739279.html

相关文章

  • git统计代码行数
    项目路径下打开gitbash执行命令gitlog--author="你的git登录名称"--pretty=tformat:--numstat|awk'{add+=$1;subs+=$2;loc+=$1-$2}END{printf"a......
  • 计算机算法设计与分析 实验题 及代码
    很舒服的题目,不难。科班的知识就是舒服。实验2:递归与分治实验目的熟悉递归算法的基本思想和基本步骤,熟练掌握递归公式的推导和定义方法,用递归算法解决实际问题。实验要......
  • Git代码托管服务
    常用的代码托管服务借助互联网上提供的一些代码托管服务来实现,比较常用的有GitHub,码云,GitLib等GitHub(https://github.com),是一个面向开源及私有软件的托管平台,只支......
  • spring boot项目使用mybatis-plus代码生成实例
    前言mybatis-plus官方地址https://baomidou.commybatis-plus是mybatis的增强,不对mybatis做任何改变,涵盖了代码生成,自定义ID生成器,快速实现CRUD,自动分页,逻辑删除等功能......
  • 代码随想录day17 |110. 平衡二叉树 257. 二叉树的所有路径 404. 左叶子之和
    110.平衡二叉树题目|文章思路比较高度适合用后序遍历,前序遍历时间复杂度高。实现点击查看代码classSolution{public:boolisBalanced(TreeNode*root){......
  • 九大顶级静态代码分析工具
    https://zhuanlan.zhihu.com/p/448512219C++、DevOps、DevSecOps、敏捷开发、速度和左移策略,这些话题总是说不完道不尽,但这些也都与静态代码分析工具息息相关。这样看......
  • 如何使用 Delphi/Lazarus 代码在 FastReport VCL 中生成二维码?
    FastReportVCL是用于在软件中集成商务智能的现代解决方案。它提供了可视化模板设计器,可以访问最受欢迎的数据源,报告引擎,预览,将过滤器导出为30多种格式,并可以部署到云,Web,电......
  • C++代码片段01 - 字符串中查找是否有某个字符
    <spanstyle="font-size:18px;">if(third_name.find('*')!=string::npos||third_name.find('@')!=string::npos){printf("third_name[%s]isaemailoramobilenum"......
  • 快速排序的思路和代码
    首先 快速排序的时间复杂度是 O(n^2)   快速排序的平均时间复杂度是 O(nlogn),最好的时间复杂度是O(nlogn),最坏的时间复杂度是 O(n^2)。时间复杂度是以最坏的来计......
  • 求最大公约数伪代码
    求最大公约数伪代码上网查找什么是求两个数的最大公约数的欧几里得算法(辗转相除法),提交算法说明和网上链接欧几里得算法又称辗转相除法,是指用于计算两个非负整数a,b的最大......