Java数据结构——用单链表编写一个简易通讯录
Java数据结构——用单链表编写一个简易通讯录
- 1、定义线性表的抽象数据类型(接口)
- 2、定义单链表的结点Node类
- 3、定义数据域中的联系人Person类
- 4、编写顺序表(类)
- 5、编写测试程序(main方法所在的可运行类)
打开IDEA等java编译器,新建一个软件包后按如下步骤创建类或接口。具体代码如下:
1、定义线性表的抽象数据类型(接口)
public interface IList {public void addPerson(); //添加联系人public void deletePerson(); //删除联系人public void modifyPerson(); //修改联系人信息public void findPerson(); //查找联系人public void showPerson(); //显示所有联系人public void cleanPerson(); //清空所有联系人}
2、定义单链表的结点Node类
public class Node {public Person person; //数据域,存放Person类型的数据public Node next; //地址域,引用后继节点//构造函数public Node(){this(null,null);}public Node(Person person){this.person=person;}public Node(Person person,Node next){this.person=person;this.next=next;}}
3、定义数据域中的联系人Person类
public class Person {public String name;public String phone;Person(String name, String phone) {this.name = name;this.phone = phone;}
}
4、编写顺序表(类)
//单链表实现通讯录
public class LinkList implements IList {static Scanner sc=new Scanner(System.in);public Node head; //头指针public int size;//记录结点个数int maxSize = 500;//将通讯录最大人数设置为500//构造方法,构造空的单链表public LinkList(){this.head = new Node();}//初始化了一个空的头节点//添加联系人public void addPerson(){if (size >= maxSize){System.out.println("通讯录已满,无法添加!");}else {System.out.println("请输入您要添加的联系人姓名:");String name = sc.next();System.out.println("请输入您要添加的联系人电话:");String phone = sc.next();//新建一个空结点,并把输入的姓名、电话存入Person person = new Person(name,phone);Node node = new Node(person);size++;//尾插法将node接入单链表的表尾Node p = this.head; //生成一个指针pwhile(p.next != null){ //让p指针移至现有的最后一个结点p = p.next;}p.next = node;//将node接在链表尾部}}//读取带头结点单链表中的第i个元素public Person get(int i) {Node p = head.next; //初始化p指向首节点int j = 0; //j为计数器//从首结点向后查找,直到第i个元素或者空while (p!=null && j<i){p = p.next;++j;}return p.person;}//查找并返回其位置下标,找不到则返回-1public int indexOf(String name){Node p = head.next; //初始化p指向首节点int j = 0; //j为计数器while (p!=null && !p.person.name.equals(name)){p = p.next;++j;}if (p!=null){ //匹配到了return j; //返回其位置下标}else return -1;}//删除联系人public void deletePerson(){System.out.println("请输入您要删除的联系人姓名:");String name = sc.next();int ret = indexOf(name);if (ret != -1){ //存在该联系人Node p = head; //初始化p指向头节点int j = -1; //j为计数器while (p.next!=null && j<ret-1){//将p移动到第ret个结点的前驱结点p = p.next;++j;}p.next = p.next.next; //删除结点System.out.println("删除成功!");size--;}else {System.out.println("您要删除的联系人不存在!");}}//修改联系人信息public void modifyPerson(){System.out.println("请输入您要修改的联系人姓名:");String name = sc.next();int ret = indexOf(name);if (ret != -1){ //存在该联系人System.out.println("请输入更改后的姓名:");get(ret).name = sc.next();System.out.println("请输入更改后的号码:");get(ret).phone = sc.next();System.out.println("修改成功!");}else {System.out.println("您要修改的联系人不存在!");}}//查找联系人public void findPerson(){System.out.println("请输入您要查找的联系人姓名:");String name = sc.next();int ret = indexOf(name);if (ret != -1){ //存在该联系人System.out.print("姓名:"+get(ret).name+"\t");System.out.println("电话:"+get(ret).phone);}else {System.out.println("您要查找的联系人不存在!");}}//显示所有联系人public void showPerson(){if (size == 0){System.out.println("当前通讯录为空!");}else {Node p = this.head.next; //创建p指针用于遍历while (p != null){System.out.print("姓名:"+p.person.name+"\t");System.out.println("电话:"+p.person.phone);p = p.next; //将p移到下一个节点}}}//清空所有联系人public void cleanPerson(){System.out.println("请确定是否清空所有联系人?确定请输入’是‘");if ("是".equals(sc.next())){this.head.next = null; //清空,将头结点的next域设置为空size = 0;System.out.println("通讯录已成功清空!");}else {System.out.println("清空操作已取消");}}}
5、编写测试程序(main方法所在的可运行类)
public class text_LinkList {//展示通讯录菜单public static void showMenu(){System.out.println("###################");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("### 0、退出通讯录 ###");System.out.println("###################");}public static void main(String[] args) {Scanner sc=new Scanner(System.in);LinkList linkList = new LinkList(); //创建链表对象while (true){showMenu();int select = sc.nextInt();switch (select){case 1: //添加联系人linkList.addPerson();break;case 2: //删除联系人linkList.deletePerson();break;case 3: //修改联系人linkList.modifyPerson();break;case 4: //查找联系人linkList.findPerson();break;case 5: //显示联系人linkList.showPerson();break;case 6: //清空通讯录linkList.cleanPerson();break;case 0: //退出通讯录System.out.println("退出通讯录成功,欢迎下次使用!");System.exit(0);break;default:break;}}}
}
以上几个步骤完成后,一个简易的通讯录就创建好了。可以运行下对程序进行测试。
Java数据结构——用单链表编写一个简易通讯录相关推荐
- Java数据结构之单链表——day03
1. 目的:使用Java实现一个简单的链表 链表的存储对象为自定义Hero类的实例化: 定义链表的节点类HeroNode: 定义链表类SingleLinkedList: 链表类SingleLinked ...
- [Java数据结构][3]单链表以及双向链表Java代码实现
单链表Java代码实现,以水浒英雄链表为例 文章目录 单链表Java代码实现,以水浒英雄链表为例 定义一个英雄链表 定义一个SingleLinkedList 用于管理结点 初始化头结点以及添加结点到单 ...
- Java数据结构3_单链表 Linked List
链表(Linked List)介绍 链表是有序的列表,但是它在内存中的存储如下: 链表是以节点的方式来存储 每个节点包含data域,next域:指向下一个节点 如上图,发现链表的各个节点不一定是连续存 ...
- Java数据结构之单链表下
单链表的第二种添加可以按照编号顺序添加(如果这个编号的已存在也会提示该节点已存在). 先来分析一下不考虑编号顺序时,我们如何做: 1.找到当前链表的最后节点 2.将最后这个节点的next指向新的节点 ...
- java数据结构之单链表逆置算法
单链表逆置算法1 设计思想:在链表类中新加成员方法getNode(int i),用来获取指定位置的节点,新建一个空单链表,将原链表的每个节点按照从后往前的顺序依次取出,再把节点的数据依次添加到新的链表 ...
- 图解Java数据结构之环形链表
本篇文章介绍数据结构中的环形链表. 介绍 环形链表,类似于单链表,也是一种链式存储结构,环形链表由单链表演化过来.单链表的最后一个结点的链域指向NULL,而环形链表的建立,不要专门的头结点,让最后一个 ...
- 利用java swing编写一个简易的计算器,实现了括号,优先级,三角函数,阶乘等功能
利用java swing编写一个简易的计算器 背景 效果图 一.默认图 二.计算三角函数 三.阶乘运算 四.常见的四则运算(实现了优先级) 代码 本文借鉴了"初识Java,实现简易计算器(带 ...
- 用java写注册表单_利用HTML表单标签编写一个注册页面
今天我们来写一个注册页面 form表单 先来利用表单标签制作一个简单的注册页面,给大家说说标签的结构: 页面结构大体就是这样子的~ 利用HTML表单标签编写一个注册页面 表单标签: 所有需要提交到服务 ...
- java语言实现单链表---不含头结点
java语言实现单链表---不含头结点 一.相关概念 1.什么是线性表 2.什么是顺序表 3.什么是链表 4.单链表.双链表.循环单链表.循环双链表 5.头结点和首结点 6.常见的栈和队列与线性表的关 ...
最新文章
- go chapter 8 - 初始化对象
- gtest 测试部分_全部关于测试–第1部分
- matplotlib 数据可视化
- NYOJ 305 表达式求值 (字符串处理)
- Microsfot Office Communicator 聊天记录 外挂
- 我看了全部文件的字符串资源
- VS Code快捷生成用户代码片段操作,以vue为例
- Bootstrap 导航/滑动门(nav)
- FlinkSql系列5之 Regular Join
- ubuntu-20.04.3-详细安装教程(图文)附下载地址
- 台达服务器电源原理电路图,台达DPS-250GB-4B ATX电源原理分析与检修
- es7 创建模板时,报错 Validation Failed: 1: index patterns are missing
- 微信小程序学习(二)党费计算实例
- java多属性的map_java集合(四)Map集合之Properties详解
- python怎么将字母排序_请教如何用python按字母顺序排序英文名字但是不可以用sort函数...
- HTML文本框内容发生变化时引发事件执行
- MATLAB颜色识别
- keil5 添加芯片支持包(pack)
- 江南style印证法国大预言家诺查丹玛斯世界末日预言?
- yaml/yml语法
热门文章
- kernel bypass smep
- matlab画奥运五环,MATLAB在同一坐标轴下,画出奥运五环标志,要求比例合适,每环用不同颜色表示怎么...
- 【开学季】如何过好大学最后一年
- 论文:CSWin Transformer
- mutt发送html格式文件出现Bad IDN in from: 问题
- 智方6000系五金交电销售管理系统 卡巴斯基反病毒软件
- 如何计算机网络参数,电脑网络参数怎么重新设置
- 【绝悟】腾讯最强策略协作型AI开放人机对战,五一节放松一下吧!
- delphi 创建半透明的异形窗口
- WOT讲师单艺:用大数据开发产品、优化运营