Java数据结构——用单链表编写一个简易通讯录
打开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;
}
}
}
}
以上几个步骤完成后,一个简易的通讯录就创建好了。可以运行下对程序进行测试。
1108



被折叠的 条评论
为什么被折叠?



