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数据结构——用单链表编写一个简易通讯录相关推荐

  1. Java数据结构之单链表——day03

    1. 目的:使用Java实现一个简单的链表 链表的存储对象为自定义Hero类的实例化: 定义链表的节点类HeroNode: 定义链表类SingleLinkedList: 链表类SingleLinked ...

  2. [Java数据结构][3]单链表以及双向链表Java代码实现

    单链表Java代码实现,以水浒英雄链表为例 文章目录 单链表Java代码实现,以水浒英雄链表为例 定义一个英雄链表 定义一个SingleLinkedList 用于管理结点 初始化头结点以及添加结点到单 ...

  3. Java数据结构3_单链表 Linked List

    链表(Linked List)介绍 链表是有序的列表,但是它在内存中的存储如下: 链表是以节点的方式来存储 每个节点包含data域,next域:指向下一个节点 如上图,发现链表的各个节点不一定是连续存 ...

  4. Java数据结构之单链表下

    单链表的第二种添加可以按照编号顺序添加(如果这个编号的已存在也会提示该节点已存在). 先来分析一下不考虑编号顺序时,我们如何做: 1.找到当前链表的最后节点 2.将最后这个节点的next指向新的节点 ...

  5. java数据结构之单链表逆置算法

    单链表逆置算法1 设计思想:在链表类中新加成员方法getNode(int i),用来获取指定位置的节点,新建一个空单链表,将原链表的每个节点按照从后往前的顺序依次取出,再把节点的数据依次添加到新的链表 ...

  6. 图解Java数据结构之环形链表

    本篇文章介绍数据结构中的环形链表. 介绍 环形链表,类似于单链表,也是一种链式存储结构,环形链表由单链表演化过来.单链表的最后一个结点的链域指向NULL,而环形链表的建立,不要专门的头结点,让最后一个 ...

  7. 利用java swing编写一个简易的计算器,实现了括号,优先级,三角函数,阶乘等功能

    利用java swing编写一个简易的计算器 背景 效果图 一.默认图 二.计算三角函数 三.阶乘运算 四.常见的四则运算(实现了优先级) 代码 本文借鉴了"初识Java,实现简易计算器(带 ...

  8. 用java写注册表单_利用HTML表单标签编写一个注册页面

    今天我们来写一个注册页面 form表单 先来利用表单标签制作一个简单的注册页面,给大家说说标签的结构: 页面结构大体就是这样子的~ 利用HTML表单标签编写一个注册页面 表单标签: 所有需要提交到服务 ...

  9. java语言实现单链表---不含头结点

    java语言实现单链表---不含头结点 一.相关概念 1.什么是线性表 2.什么是顺序表 3.什么是链表 4.单链表.双链表.循环单链表.循环双链表 5.头结点和首结点 6.常见的栈和队列与线性表的关 ...

最新文章

  1. go chapter 8 - 初始化对象
  2. gtest 测试部分_全部关于测试–第1部分
  3. matplotlib 数据可视化
  4. NYOJ 305 表达式求值 (字符串处理)
  5. Microsfot Office Communicator 聊天记录 外挂
  6. 我看了全部文件的字符串资源
  7. VS Code快捷生成用户代码片段操作,以vue为例
  8. Bootstrap 导航/滑动门(nav)
  9. FlinkSql系列5之 Regular Join
  10. ubuntu-20.04.3-详细安装教程(图文)附下载地址
  11. 台达服务器电源原理电路图,台达DPS-250GB-4B ATX电源原理分析与检修
  12. es7 创建模板时,报错 Validation Failed: 1: index patterns are missing
  13. 微信小程序学习(二)党费计算实例
  14. java多属性的map_java集合(四)Map集合之Properties详解
  15. python怎么将字母排序_请教如何用python按字母顺序排序英文名字但是不可以用sort函数...
  16. HTML文本框内容发生变化时引发事件执行
  17. MATLAB颜色识别
  18. keil5 添加芯片支持包(pack)
  19. 江南style印证法国大预言家诺查丹玛斯世界末日预言?
  20. yaml/yml语法

热门文章

  1. kernel bypass smep
  2. matlab画奥运五环,MATLAB在同一坐标轴下,画出奥运五环标志,要求比例合适,每环用不同颜色表示怎么...
  3. 【开学季】如何过好大学最后一年
  4. 论文:CSWin Transformer
  5. mutt发送html格式文件出现Bad IDN in from: 问题
  6. 智方6000系五金交电销售管理系统 卡巴斯基反病毒软件
  7. 如何计算机网络参数,电脑网络参数怎么重新设置
  8. 【绝悟】腾讯最强策略协作型AI开放人机对战,五一节放松一下吧!
  9. delphi 创建半透明的异形窗口
  10. WOT讲师单艺:用大数据开发产品、优化运营