通讯录项目—顺序表实现

     在上次我介绍顺序表后相信大家对顺序表有了一定的了解,现在就让我们来练练如何用它,这篇是在顺序表基础上新增的(建议看看线性表—顺序表实现-CSDN博客)。

目录

通讯录简介

创建用户信息

适配和理解通讯录

功能实现

初始化通讯录

销毁通讯录

增加用户信息

删除指定用户信息

查找用户信息

修改用户信息

显示用户信息

全代码

Contact.h

Contact.c


通讯录简介

     下面是通讯录要实现的功能。

  1. 能够保存用户信息:名字、性别、年龄、电话、地址等。
  2. 增加用户信息。
  3. 删除指定用户信息。
  4. 查找用户信息。
  5. 修改用户信息。
  6. 显示用户信息。

创建用户信息

     在创建用户信息前依然是要创建两个项目Contact.h,Contact.c用来存放新增的代码。

     用户信息里包含名字,性别,年龄,电话,地址等这需要用结构体来定义。我把结构体给重命名为penInfo。数组的大小我把它定义为了常量(方便后期更改)。

#define NAME_MAX 20
#define GEMDER_MAX 10
#define TEL_MAX 20
#define ADDR_MAX 100

typedef struct personInfo
{
	char name[NAME_MAX];//名字
	char gender[GEMDER_MAX];//性别
	int age;//年龄
	char tel[TEL_MAX];//电话
	char addr[ADDR_MAX];//地址
}peoInfo;

typedef struct SeqList Contact;

     大家可能注意到了这段代码的最后一行有这么一段话typedef struct SeqList Contact,有什么用呢?

     我会在下面的适配和理解通讯录中详解。

适配和理解通讯录

     之前顺序表的arr是指向int类型的指针,但现在它需要指向结构体。还记得为什么要创造SLDataType吗?它是用来表示arr的类型。所以只要把int换成penInfo就可以了  (这里要把Contact.h放在SeqList.h里否则penInfo是未定义的)。

//SeqList.c文件中
typedef peoInfo SLDataType;

     现在让我们回到 typedef struct SeqList Contact 这段代码中。

     再说之前要知道对通讯录操作其实就是对顺序表操作,即通讯录就是顺序表,这其实就是把顺序表的名字改为通讯录。

     这里其实不写这段代码也是OK的。但是,你是要对通讯录操作。如果不改名字,那就是对顺序表操作(虽然它们一样)。你想啊,通讯录写的好好的突然出现顺序表,在我们看来还好但是对于其他人来说就很懵。这里改名字其实就是为了更方便理解

     既然想用顺序表那要在Contact.h里包含SeqList.h头文件,但是头文件是不能相互包含的。所以这里要对顺序表的结构体进行前置声明。这里不能用SL,因为是先定义完顺序表结构体之后在重命名的,如果直接用SL会被认为是未定义的。所以要用 struct SeqList 。

//这种是错误的!!!
struct SeqList;//前置声明
typedef SL Contact;

     

     这是正确的!!!

struct SeqList;//前置声明
typedef struct SeqList Contact;

     可以把前置声明放在重命名里,最后就变成了这样。

typedef struct SeqList Contact;

     用户信息的结构体就是放在通讯录的每一个下标里。

     只要把这里给理解了,下面的代码就很轻松了。 

功能实现

初始化通讯录

     初始化调用一下SLInit函数就好。

//初始化
void ContactInit(Contact* con)
{
	SLInit(con);
}

销毁通讯录

     销毁调用一下SLDestroy函数就好。

//销毁
void ContactDesTroy(Contact* con)
{
	SLDestroy(con);
}

增加用户信息

     这里创建一个penInfo的变量info。然后一个一个输入内容。最后调用SLpushBack尾插即可。

//增加
void ContactAdd(Contact* con)
{
	peoInfo info;
	printf("请输入联系人的名字:\n");
	scanf("%s", info.name);

	printf("请输入联系人的性别:\n");
	scanf("%s", info.gender);

	printf("请输入联系人的年龄:\n");
	scanf("%d", &info.age);

	printf("请输入联系人的电话:\n");
	scanf("%s", info.tel);

	printf("请输入联系人的地址:\n");
	scanf("%s", info.addr);

	SLpushBack(con, info);
    printf("增加成功!\n");
}

     大家可能注意到了只有年龄的scanf中加了&,为什么呢?

     因为它不是数组,其它都是数组。

删除指定用户信息

     在删除数据前要先检查有无该人,其实不光是删除还有查找,修改的函数都要用到。所以把它独立成一个函数,函数名是Findbyname。

     我在这里是用名字来查找的,遍历一遍如果存在返回顺序表下标,否则返回-1。

     判断是否存在的判断条件,我是用strcmp函数来实现的,如果它的返回值为0则存在。

int Findbyname(Contact* con, char name[])
{
	for (int i = 0; i < con->size; i++)
	{
		if (strcmp(con->arr[i].name, name) == 0)
		{
			return i;
		}
	}
	return -1;
}

     剩下的要先创建一个数组来存放要删除人的名字,然后调用Findbyname函数,如果返回值小于0则退出。否则调用SLErase函数用来删除。

//删除
void ContactDel(Contact* con)
{
	char name[NAME_MAX] = { 0 };
	printf("请输入要删除联系人的名字;\n");
	scanf("%s", name);
	int find = Findbyname(con, name);
	if (find < 0)
	{
		printf("该人不存在\n");
		return;
	}
	SLErase(con, find);
	printf("删除成功!\n");
}

     注意:开辟数组的大小要和结构体(penInfo)的名字数组大小一样大。

查找用户信息

     依然是要开辟数组然后调用Findbyname函数,如果小于0则退出,否则打印此人的信息。

//查找
void ContactFind(Contact* con)
{
	char name[NAME_MAX] = { 0 };
	printf("请输入要查找联系人的名字;\n");
	scanf("%s", name);
	int find = Findbyname(con, name);
	if (find < 0)
	{
		printf("该人不存在\n");
		return;
	}
	printf("名字  性别  年龄  电话  地址\n");
	printf("%s    %s    %d    %s    %s\n",
		con->arr[find].name,
		con->arr[find].gender,
		con->arr[find].age,
		con->arr[find].tel,
		con->arr[find].addr);
}

修改用户信息

     前面的代码同上,只不过如果返回值大于0则重新输入他的信息即可。

//修改
void ContactModify(Contact* con)
{
	char name[NAME_MAX] = { 0 };
	printf("请输入要修改联系人的名字;\n");
	scanf("%s", name);
	int find = Findbyname(con, name);
	if (find < 0)
	{
		printf("该人不存在\n");
		return;
	}

	printf("请修改联系人的名字:\n");
	scanf("%s", con->arr[find].name);

	printf("请修改联系人的性别:\n");
	scanf("%s", con->arr[find].gender);

	printf("请修改联系人的年龄:\n");
	scanf("%d", &con->arr[find].age);

	printf("请修改联系人的电话:\n");
	scanf("%s", con->arr[find].tel);

	printf("请修改联系人的地址:\n");
	scanf("%s", con->arr[find].addr);

	printf("修改成功!\n");
}

显示用户信息

     遍历一遍的同时打印即可。

//展示
void ContactShow(Contact* con)
{
	for (int i = 0; i < con->size; i++)
	{
		printf("名字  性别  年龄  电话  地址\n");
		printf("%s    %s    %d    %s    %s\n",
			con->arr[i].name,
			con->arr[i].gender,
			con->arr[i].age,
			con->arr[i].tel,
			con->arr[i].addr);
	}
}

全代码

Contact.h

#define NAME_MAX 20
#define GEMDER_MAX 10
#define TEL_MAX 20
#define ADDR_MAX 100

typedef struct personInfo
{
	char name[NAME_MAX];//名字
	char gender[GEMDER_MAX];//性别
	int age;//年龄
	char tel[TEL_MAX];//电话
	char addr[ADDR_MAX];//地址
}peoInfo;

typedef struct SeqList Contact;

//初始化
void ContactInit(Contact* con);

//销毁
void ContactDesTroy(Contact* con);

//增加
void ContactAdd(Contact* con);

//删除
void ContactDel(Contact* con);

//修改
void ContactModify(Contact* con);

//查找
void ContactFind(Contact* con);

//展示
void ContactShow(Contact* con);

Contact.c

#include "SeqList.h"
#include "Contact.h"

//初始化
void ContactInit(Contact* con)
{
	SLInit(con);
}

//销毁
void ContactDesTroy(Contact* con)
{
	SLDestroy(con);
}

//增加
void ContactAdd(Contact* con)
{
	peoInfo info;
	printf("请输入联系人的名字:\n");
	scanf("%s", info.name);

	printf("请输入联系人的性别:\n");
	scanf("%s", info.gender);

	printf("请输入联系人的年龄:\n");
	scanf("%d", &info.age);

	printf("请输入联系人的电话:\n");
	scanf("%s", info.tel);

	printf("请输入联系人的地址:\n");
	scanf("%s", info.addr);

	SLpushBack(con, info);
	printf("增加成功!\n");
}


int Findbyname(Contact* con, char name[])
{
	for (int i = 0; i < con->size; i++)
	{
		if (strcmp(con->arr[i].name, name) == 0)
		{
			return i;
		}
	}
	return -1;
}
//删除
void ContactDel(Contact* con)
{
	char name[NAME_MAX] = { 0 };
	printf("请输入要删除联系人的名字;\n");
	scanf("%s", name);
	int find = Findbyname(con, name);
	if (find < 0)
	{
		printf("该人不存在\n");
		return;
	}
	SLErase(con, find);
	printf("删除成功!\n");
}

//修改
void ContactModify(Contact* con)
{
	char name[NAME_MAX] = { 0 };
	printf("请输入要修改联系人的名字;\n");
	scanf("%s", name);
	int find = Findbyname(con, name);
	if (find < 0)
	{
		printf("该人不存在\n");
		return;
	}

	printf("请修改联系人的名字:\n");
	scanf("%s", con->arr[find].name);

	printf("请修改联系人的性别:\n");
	scanf("%s", con->arr[find].gender);

	printf("请修改联系人的年龄:\n");
	scanf("%d", &con->arr[find].age);

	printf("请修改联系人的电话:\n");
	scanf("%s", con->arr[find].tel);

	printf("请修改联系人的地址:\n");
	scanf("%s", con->arr[find].addr);

	printf("修改成功!\n");
}

//查找
void ContactFind(Contact* con)
{
	char name[NAME_MAX] = { 0 };
	printf("请输入要查找联系人的名字;\n");
	scanf("%s", name);
	int find = Findbyname(con, name);
	if (find < 0)
	{
		printf("该人不存在\n");
		return;
	}
	printf("名字  性别  年龄  电话  地址\n");
	printf("%s    %s    %d    %s    %s\n",
		con->arr[find].name,
		con->arr[find].gender,
		con->arr[find].age,
		con->arr[find].tel,
		con->arr[find].addr);
}

//展示
void ContactShow(Contact* con)
{
	for (int i = 0; i < con->size; i++)
	{
		printf("名字  性别  年龄  电话  地址\n");
		printf("%s    %s    %d    %s    %s\n",
			con->arr[i].name,
			con->arr[i].gender,
			con->arr[i].age,
			con->arr[i].tel,
			con->arr[i].addr);
	}
}

     好了讲到这儿就差不多讲完了,希望你能有所收获。如果有错误的地方请及时指出,有什么不懂的地方可以私信我哈。

  • 19
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
首先,我们需要定义通讯录的联系人实体类: ```java public class Contact { private String name; private String phoneNumber; private String email; public Contact(String name, String phoneNumber, String email) { this.name = name; this.phoneNumber = phoneNumber; this.email = email; } public String getName() { return name; } public String getPhoneNumber() { return phoneNumber; } public String getEmail() { return email; } @Override public String toString() { return "Name: " + name + ", Phone number: " + phoneNumber + ", Email: " + email; } } ``` 接下来,我们需要实现顺序表类: ```java public class ContactList { private Contact[] contacts; private int size; public ContactList(int capacity) { contacts = new Contact[capacity]; size = 0; } public int getSize() { return size; } public void addContact(Contact contact) { if (size == contacts.length) { throw new RuntimeException("Contact list is full"); } contacts[size++] = contact; } public Contact getContact(int index) { if (index < 0 || index >= size) { throw new RuntimeException("Invalid index"); } return contacts[index]; } public void removeContact(int index) { if (index < 0 || index >= size) { throw new RuntimeException("Invalid index"); } for (int i = index; i < size - 1; i++) { contacts[i] = contacts[i + 1]; } contacts[size - 1] = null; size--; } public void updateContact(int index, Contact contact) { if (index < 0 || index >= size) { throw new RuntimeException("Invalid index"); } contacts[index] = contact; } public Contact[] getAllContacts() { Contact[] result = new Contact[size]; for (int i = 0; i < size; i++) { result[i] = contacts[i]; } return result; } } ``` 然后,我们可以在主函数中使用顺序表类来实现通讯录: ```java public static void main(String[] args) { ContactList contactList = new ContactList(10); contactList.addContact(new Contact("Alice", "1234567890", "alice@example.com")); contactList.addContact(new Contact("Bob", "2345678901", "bob@example.com")); contactList.addContact(new Contact("Charlie", "3456789012", "charlie@example.com")); contactList.removeContact(1); contactList.updateContact(0, new Contact("Alice", "0987654321", "alice@example.com")); Contact[] contacts = contactList.getAllContacts(); for (Contact contact : contacts) { System.out.println(contact); } } ``` 输出结果: ``` Name: Alice, Phone number: 0987654321, Email: alice@example.com Name: Charlie, Phone number: 3456789012, Email: charlie@example.com ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值