Java数据结构——用单链表编写一个简易通讯录

链表数据结构 实现通讯录管理系统 基于JAVA语言 链表数据结构 实现通讯录管理系统 问题描述: 该设计采用菜单作为应用程序的主要界面,用控制语句来改变程序执行的顺序,控制语句是实现结构化程序设计的基础。该设计的任务是利用一个简单实用的菜单,通过菜单单项进行选择,实现和完成通讯录管理中常用的几个不同的功能。 【任务要求】 菜单内容: (0)通讯录链表的建立 (1)通讯者结点的插入 (2)通讯者结点的查询 (3)通讯者结点的删除 (4)通讯录链表的输出 (5)退出管理系统 设计要求: 使用0-5来选择菜单项,其他输入则不起作用。 实现代码: 阅读详情

打开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; //生成一个指针p
            while(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;
    }

    //查找并返回其位置下标,找不到则返回-1
    public 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;
            }
        }
    }
}

以上几个步骤完成后,一个简易的通讯录就创建好了。可以运行下对程序进行测试。

单链表的应用---通讯录设计(数据结构课设) 一、实验目的 1)熟悉并掌握线性表的逻辑结构、物理结构; 2)熟悉并掌握线性链表的存储结构、基本操作和具体函数的定义; 二、实验内容 设计一个含有多个菜单项的主菜单程序,然后再为这些菜单项配上相应的功能,实现通讯录所有操作的管理。 1)通讯录链表的建立。 2)通讯者信息的插入 3)通讯者信息的查找,查找成功,将查找者的信息输出。 4)通讯者记录的删除,要求先进行通讯者的查找,查找成... 阅读详情

相关推荐

Java-数据结构课设-链表实现通讯录管理系统

第一个模块——主函数main()的功能是:根据选单的选项调用各函数,并完成相应的功能。 
   第二个模块——Menu()的功能是:显示提示选单。 
   第三个模块——Quit()的功能是:退出选单。 
   第四个模块——Create()的功能是:创建新的数据记录。 
   第五个模块——Add()的功能是:增加新的数据记录,并返回选单。 
   第六个模块——Find()的功能是:按要求查询相关的信息,如果找到了,则显示该信息,如果未找到,则提示文件中没有该信息,并返回选单。 
   第七个模块——Alter()[的功能是:修改某条记录的信息,如果未找到要修改的记录,则提示系统中无此记录,并返回选单。 
   第八个模块——Delete()的功能是:删除某条记录,如果未找到要删除的记录,则提示通讯录中没有,并返回选单。 
   第九个模块——List()的功能是:显示所有记录。 一、用链表或者顺序表实现以下系统,完成线性表的建立(至少包括10个结点),以及线性表中信息(结点)的插入、查找、删除、修改、输出等操作,具体的模块要求见上方的“总的模块要求”。建议用“文件”存储数据。 1.通讯录管理系统的设计与实现 (1)通讯者信息包括:编号(char num[10])、姓名(char name[10])、性别(char sex[10])、电话(char phone[20]) (2)除了总的模块要求外,还需统计通讯录中男性人数及女性人数,并求出通讯录中的第一个模块——主函数main()的功能是:根据选单的选项调用各函数,并完成相应的功能。 
   第二个模块——Menu()的功能是:显示提示选单。 
   第三个模块——Quit()的功能是:退出选单。 
   第四个模块——Create()的功能是:创建新的数据记录。 
   第五个模块——Add()的功能是:增加新的数据记录,并返回选单。 
   第六个模块——Find()的功能是:按要求查询相关的信息,如果找到了,则显示该信息,如果未找到,则提示文件中没有该信息,并返回选单。 
   第七个模块——Alter()[的功能是:修改某条记录的信息,如果未找到要修改的记录,则提示系统中无此记录,并返回选单。 
   第八个模块——Delete()的功能是:删除某条记录,如果未找到要删除的记录,则提示通讯录中没有,并返回选单。 
   第九个模块——List()的功能是:显示所有记录。 一、用链表或者顺序表实现以下系统,完成线性表的建立(至少包括10个结点),以及线性表中信息(结点)的插入、查找、删除、修改、输出等操作,具体的模块要求见上方的“总的模块要求”。建议用“文件”存储数据。 1.通讯录管理系统的设计与实现 (1)通讯者信息包括:编号(char num[10])、姓名(char name[10])、性别(char sex[10])、电话(char phone[20]) (2)除了总的模块要求外,还需统计通讯录中男性人数及女性人数,并求出通讯录中的男女比例。 男女比例。

[C计划—04] 利用单链表实现通讯录管理系统

经过将近两周的学习

晓东的博客 1108

Pytest 常见问题及其解决方案

Pytest 是一个强大且灵活的测试框架,但初学者在使用过程中难免会遇到各种问题。希望通过这篇文章,你能更好地应对常见的挑战,写出更高效、更稳定的测试代码。测试不是负担,而是保障。写好测试不仅能提高代码质量,还能让你在面对变更时更加从容自信。

qq_52137592的博客 901

【C++课程设计】基于单向链表的通讯录管理程序

本文目录通讯录效果图问题描述任务要求设计思想功能模块1,数据存储2,交互界面3,主类功能匹配与整合程序流程图源码实现【1】Link.h【2】MYGUI.h【3】通讯录.cpp课程设计报告与源码获取 通讯录效果图 问题描述 该设计采用菜单作为应用程序的主要界面,用控制语句来改变程序执行的顺序,控制语句是实现结构化程序设计的基础。该设计的任务是利用一个简单实用的菜单,通过菜单单项进行选择,实现和完成通讯录管理中常用的几个不同的功能。通讯者所包含信息请自行设定 任务要求 菜单内容: (0)通讯录链表的建

泥煤少年的博客 1393

FID指标实战:如何用Python快速计算生成图像的质量分数(附完整代码)

本文详细介绍了如何使用Python计算Fréchet Inception Distance(FID)指标,以评估生成图像的质量。通过完整的代码示例和优化技巧,帮助开发者快速实现FID计算,并解读分数背后的实际意义,适用于GAN和扩散模型的性能评估。

weixin_28718487的博客 377

几种负载均衡策略(DNS、NAT、重定向、反向代理)

摘要:本文对比了四种负载均衡技术:DNS负载均衡通过域名解析分发IP,用户直连服务器;NAT负载均衡通过VIP转发流量,所有流量经过负载均衡器;HTTP重定向通过302跳转实现分流;反向代理则隐藏后端服务器,统一转发请求。DNS简单但调度不精准,NAT精准但有带宽瓶颈,HTTP重定向延迟高,反向代理性能好但需专用设备。适用场景各异,DNS适合异地分流,NAT适合内网集群,HTTP重定向适合简单分流,反向代理适合高并发场景。核心区别在于层级(3层/7层)和流量走向(直连/中转)。

echo的博客 74

用Java编写通讯录,实现新增、修改、查看、删除、退出的功能

import java.util.Scanner; public class UseManger { public static void main(String[] args) { Scanner sc = new Scanner(System.in); User[] users=new User[50]; while (true) { System.out.println(" 通讯录 "); System.out.println("===========");

weixin_46686232的博客 4423

出现Command ‘vim‘ is available in the following places,vim: command not found等解决方法

内置命令无法识别,说明系统变量有误,导致无法识别,既然系统变量有误,将其注释或者更改为正确的即可,但是现在打不开,又怎么注释掉。替换vim来打开编辑,打开之前错误的全局变量文件,发现变量有误,要么注释要么改为。系统变量有全局变量(通过命令行printenv或者echo)和局部变量。对应通过vim修改错误的变量文件,不然source也无法让配置文件生效。本身vim是系统内置的命令,连vim都出现问题。修改为正确的即可,之后还需要重启服务器,使用。之后即可成功,通过即可查看命令是否有写入。...

码农研究僧的博客 5884

单链表通讯录作业

#include<stdio.h> #include<malloc.h> #include<string.h> #include<stdlib.h> #include<windows.h> #include<iostream> using namespace std; typedef struct Stu { long long id;//学生ID char name[10];//学生姓名 long long tel;//学生电

Shelysure的博客 346

【知识点讲解】大模型参数量与计算量(FLOPs)估算方法

指标参数量 (Params)计算量 (FLOPs)含义模型的大小,静态模型的计算复杂度,动态决定因素模型结构(宽度、深度)模型结构 +输入数据(B, S)影响内存占用、磁盘空间运行速度、能耗单位M (百万), B (十亿)工具thopptflopstorchinfothopptflopsfvcore重要提示FLOPs ≠ 速度:FLOPs 是理论计算量。实际速度还受内存带宽 (Memory Bandwidth)并行度硬件架构等因素严重影响。

AI浩 2099

2023年12月机器人技术等级考试试卷(三级理论) 试题解析

2023年12月机器人技术等级考试试卷(三级理论) 试题解析

http://www.cierobot.com 4097

java单链表通讯录_[Java教程]用java实现单链表(菜鸟出征)

[Java教程]用java实现单链表(菜鸟出征)0 2016-03-24 14:00:06 package code;class Node{ Node next; int data; public Node(int data) { this.data=data; } }class LinkList{ Node first; //头部 public L...

weixin_35565522的博客 589

【深度学习新浪潮】Token经济学深度解析:从AI“新智元”梗到产业核心,研究成果+标杆产品全拆解

在正式深入研究和产品分析前,必须先破除概念误区:行业内常说的Token经济学,并非单一概念,而是分为AI词元Token经济学和Web3通证Token经济学两大核心分支,二者底层逻辑、应用场景天差地别,也是大众最容易混淆的点。Token是AI时代的新大宗商品:黄仁勋将Token类比为工业时代的电力、石油,是AI时代的核心生产资料与基础计价单位,不再是单纯的技术单元,而是具备标准化、可计量、可交易、可分层的数字商品,其价值由算力消耗、推理效率、实际应用价值共同决定,而非虚拟炒作。Token五层定价模型。

专注:太空算力、AI infra、异构调度、大模型成本工程 686

单链表写通信录

单链表写通讯录 单链表实现通讯录,增加,删除,更改一个联系人等功能。其中增加了一个内存池功能,用于对废弃内存的回收和利用。 #include<stdio.h> #include<stdlib.h> #include<string.h> #define MAX 1024 void addPerson(struct Presonlist **node);//添加一个...

toast master袁的博客 351

使用 MATLAB/Simulink + Simscape Electrical,构建一个含光伏并网系统与SVG的联合仿真模型,实现动态无功补偿与电压支撑

摘要:本文详细介绍了基于Simulink的SVG与光伏并网逆变器联合系统建模方法。通过构建包含光伏单元、SVG主电路和控制模块的仿真模型,实现动态无功补偿与电压稳定。重点阐述了ip-iq无功检测算法、双闭环控制和SVPWM调制等关键技术。仿真结果表明,该系统能快速响应无功需求,在10ms内将功率因数提升至0.98以上,有效抑制电压波动。文章为新能源并网系统中的电能质量治理提供了实用解决方案,并提出了进一步优化方向。

xiaoheshang_123的博客 322

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

单链表实现个人通讯录管理助手

通过调试,能够运行成功 #include #include #include using namespace std; struct Phone { char name[10]; //姓名 char number[12]; //电话号码 char add[30]; //住址 char post[20];

Allin 983

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

java单链表通讯录_[源码和文档分享]C++实现的基于链表的通讯录管理系统

摘 要随着计算机应用技术的快速发展和日益普及,网络也遍及到我们生活的每个角落,为我们的学习和工作带来极大的方便。很多人都使用过传统的纸质通讯录,与之不同的另外一种管理方式——程序通讯录管理。程序通讯录管理系统面向全部用户,它是一种先进、方便、快捷、简易的方式,能快速地添加、删除、查询通讯录中的信息,提高工作效率。本系统针对日常用户对于通讯录的需求进行分析,实现并拓展了传统通讯录的功能,采用在Vis...

weixin_34803929的博客 293

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

java语言单链表电话簿_【数据结构】Java语言描述-单链表的基本操做

单链表是数据结构中以动态结构存储的线性结构,在Java语言中,通常用本类对象引用的方式在内存中将一组相同类型的对象存储,熟悉单链表的基本操做有助于灵活解决此类算法问题。node1.单链表中的节点能够用节点类型描述以下:算法public class Lnode{public char data;public Lnode next;}2.单链表能够按以下的类进行封装:数据结构public class ...

weixin_30868807的博客 211

java 数据结构——java实现顺序表、单链表

 线性表示数据结构的一种,它是 n 个具有相同特性的 数据元素的有限序列。 顺序表 顺序表指的是用一组地址连续的存储单元存储线性表中的数据元素,称为线性表的顺序存储结构或者顺序映像。线性表采用顺序存储的方式存储就称之为顺序表。 一 . 顺序表的建立。 class TestSqlist{ int usedSize;//当前有效的数据元素的个数。 int[] elem;//用一组地址连续...

Alyson_jm的博客 1463

数据结构课程设计—通讯录管理系统

/****************************  *版权所有  (C)2016.ccx  *  *文件名称:   ccx.cpp  *文件标识:   无  *内容摘要:   该项目的所有函数的实现  *其他说明:   无  *当前版本:   V1.0  *作   者:    郗传秀 *完成日期:   20161225  *  *修改记录:   6  *修改日期:

DSCCX的博客 2240

通讯录(链表、文件)

#include #include #include #include #include #include #define len sizeof(struct Node) #define ERROR   1 #define OK      0 struct Node { char name[30];     int data;     struct Nod

qq_30832645的博客 375

链表实现通讯录

初学者 第一次写通讯录,写到头皮发麻。 灵活运用指针函数,返回值为指针 注意使用二级指针操作头指针head 注意del函数的判断条件 切记不骄不躁! #include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; #include &lt;string.h&gt; #include &lt;malloc.h&gt; #define LEN sizeof(st...

qq_43809983的博客 418

数据结构之单链表

单链表

weixin_53908084的博客 776

用链表实现一个通讯录

#include<stdio.h> #include<stdlib.h> #include<string.h> typedefstructDIR{ charname[50]; charclas[20]; charteleNum[15]; structDIR*next; }Dir,*p...

weixin_34249678的博客 307

数据结构基础:顺序表与单链表的实现原理、对比与实战应用

数据结构是计算机科学的核心基础,它研究数据的组织、存储与操作方式,直接影响程序的效率与性能。其核心原理在于通过特定的逻辑与物理结构,在时间与空间复杂度间取得平衡,从而高效管理数据。掌握数据结构对于优化算法、设计高性能系统具有不可替代的技术价值。在众多应用场景中,缓存淘汰、任务调度、动态集合管理等都需要合适的数据结构支撑。本文聚焦于两种最基础的物理存储结构:顺序表与单链表。顺序表基于连续存储,支持高效的随机访问,但插入删除可能引发数据移动;单链表采用链式存储,通过指针连接节点,在动态插入删除上更具灵活性,但需

403
下一篇: Java数据结构——用顺序表编写一个简易通讯录
Jay_Java_
博客等级 码龄5年 206粉丝 3原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值