通讯录(C语言详细版)

1. 前言

通讯录是在动态顺序表的基础上实现的,其实就是顺序表的每个元素存储的不再是数字,而是存储一个联系人的结构体,所以如果有些小伙伴看不懂的话,可以移步参考一下动态顺序表的实现:顺序表(C语言详细版)-CSDN博客

1.1 通讯录的功能

1)至少能够存储每个用户的通讯信息;

2)能够保存用户信息:名字、性别、年龄、电话、地址等;

3)增加联系人信息;

4)删除指定联系人;

5)查找制定联系人;

6)修改指定联系人;

7)显示联系人信息。

2. 定义联系人的结构体

#define NAME_MAX  20
#define GENDER_MAX 10
#define TEL_MAX 20
#define ADDR_MAX 100
// 定义联系人数据结构
// 姓名 性别 年龄 电话 地址
typedef struct personInfo
{
	char name[NAME_MAX];	// 姓名
	char gender[GENDER_MAX];// 性别
	int age;				// 年龄
	char tel[TEL_MAX];		// 电话
	char addr[ADDR_MAX];	// 地址
}peoInfo;

3. 通讯录的初始化

如果我们要对通讯录初始化,我们可以通过对顺序表初始化,来实现对通讯录的初始化。要使用顺序表方法,所以我们必须前置声明 struct SeqList,然后将它重新命名为 Contact (通讯录英文)。

typedef struct SeqList Contact;	// 前置声明

通讯录初始化声明:

/* 要用到顺序表相关的方法,对通讯录的操作,实际上就是对顺序表进行操作 
 * 给顺序表改个名字,叫做通讯录 */
//typedef SL Contact;
typedef struct SeqList Contact;	// 必须要这样前置声明
// 通讯录相关的方法

// 通讯录的初始化
//void ContactInit(SL* sl);
void ContactInit(Contact* con);

通讯录初始化定义:

// 通讯录的初始化
void ContactInit(Contact* con)//sl
{
	// 实际上要进行的是顺序表的初始化
	// 顺序表的初始化已经实现好了
	SLInit(con);
}

测试代码:

// 通讯录的测试方法
void ContactTest01()
{
	Contact con;	// 创建的通讯录对象 实际上就是顺序表对象 等价于 SL sl

	// 通讯录初始化
	ContactInit(&con);
}

int main()
{
    ContactTest01();

    return 0;
}

调试结果:有效联系人的人数为0,容纳联系人的总数也为0

4. 通讯录的销毁

对通讯录的销毁就是对顺序表的销毁,所以通讯录的销毁函数可以调用顺序表的销毁函数接口。

// 通讯录的销毁
void ContactDesTroy(Contact* con)
{
	SLDestroy(con);
}

测试程序:

// 通讯录的测试方法
void ContactTest01()
{
	Contact con;	// 创建的通讯录对象 实际上就是顺序表对象 等价于 SL sl

	// 通讯录初始化
	ContactInit(&con);

    // 通讯录销毁
	ContactDesTroy(&con);
}

int main()
{
    ContactTest01();

    return 0;
}

调试结果:其实跟初始化效果是一样的,因为我们通讯录里面没有数据嘛

5. 展示通讯录数据

为了更好地测试我们程序,我们可以先写一个打印程序,这样就不用一个个调试观察了。

// 展示通讯录数据
void ContactShow(Contact* con)
{
	// 表头:姓名 性别 年龄 电话 地址
	printf("%-5s %-5s %-5s %-5s %-5s\n", "姓名", "性别", "年龄", "电话", "地址");

	// 遍历通讯录,按照格式打印每个联系人数据
	for (int i = 0; i < con->size; i++)
	{
		// 调整一下格式
		printf("%3s %3s    %3d   %3s   %3s\n", \
			con->arr[i].name, \
			con->arr[i].gender, \
			con->arr[i].age, \
			con->arr[i].tel, \
			con->arr[i].addr
		);
	}
}

6. 通讯录添加联系人

往通讯录添加联系人,就是往顺序表插入数据,所以我们这里可以调用顺序表的尾插、头插、指定位置插入,我们这里就用尾插接口来实现吧!(其他插入接口函数也是能实现的,等会可以试试)

// 通讯录添加数据
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);
	//SLPushFront(con, info);    // 头插
	//SLInsert(con, 0, info);    // 指定位置插入
}

测试尾插联系人程序:

// 通讯录的测试方法
void ContactTest01()
{
	Contact con;	// 创建的通讯录对象 实际上就是顺序表对象 等价于 SL sl

	// 通讯录初始化
	ContactInit(&con);

	// 添加数据
	ContactAdd(&con);
	ContactAdd(&con);
	ContactShow(&con);


	// 通讯录销毁
	ContactDesTroy(&con);
}

int main()
{
	ContactTest01();

    return 0;
}

运行结果:

测试头插联系人结果:

测试指定位置插入联系人:

7. 通讯录删除联系人

通讯录删除联系人,我们可以调用顺序表的指定位置删除删除函数接口。在删除联系人之前,我们还必须找到该联系人,然后再把该联系人删除。我们查找联系人是根据联系人的姓名来查找(我们也可以根据其它信息来查找,这里就不实现了),找到联系人的下标,然后将下标返回。

// 根据用户的姓名来查找
int FindByName(Contact* con, char name[])
{
	for (int i = 0; i < con->size; i++)
	{
		if (0 == strcmp(con->arr[i].name, name))
		{
			// 找到了
			return i;
		}
	}
	// 没有找到
	return -1;
}

// 通讯录删除数据
void ContactDel(Contact* con)
{
	// 要删除的数据必须存在,才能执行删除操作
	// 查找
	char name[NAME_MAX];
	printf("请输入要删除的联系人的姓名:\n");
	scanf("%s", name);

	int find = FindByName(con, name);
	if (find < 0)
	{
		printf("要删除的联系人数据不存在!\n");
		return;
	}
	// 要删除的联系人数据存在-->知道了要删除联系人数据对应的下标
	SLErase(con, find);	// 指定位置删除数据
	printf("删除成功!\n");
}

测试程序:

// 通讯录的测试方法
void ContactTest01()
{
	Contact con;	// 创建的通讯录对象 实际上就是顺序表对象 等价于 SL sl

	// 通讯录初始化
	ContactInit(&con);

	// 添加数据
	ContactAdd(&con);
	ContactAdd(&con);
	ContactShow(&con);

	// 测试删除数据
	ContactDel(&con);
	ContactShow(&con);

	// 通讯录销毁
	ContactDesTroy(&con);
}

int main()
{
	ContactTest01();

    return 0;
}

运行结果:

8. 通讯录的修改

先找要修改的联系人的下标,返回该下标,然后再进行修改。

// 通讯录的修改
void ContactModify(Contact* con)
{
	// 要修改的联系人数据存在
	char name[NAME_MAX];
	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 ContactTest01()
{
	Contact con;	// 创建的通讯录对象 实际上就是顺序表对象 等价于 SL sl

	// 通讯录初始化
	ContactInit(&con);

	// 添加数据
	ContactAdd(&con);
	ContactAdd(&con);
	ContactShow(&con);

	// 测试修改信息
	ContactModify(&con);
	ContactShow(&con);

	// 通讯录销毁
	ContactDesTroy(&con);
}

int main()
{
	ContactTest01();

    return 0;
}

运行结果:

9. 通讯录查找

通讯录的查找,我们也是通过姓名来查找,找到了联系人的下标,然后返回下标,最后把找到的联系人打印出来。

// 通讯录查找
void ContactFind(Contact* con)
{
	// 通过姓名查找
	char name[NAME_MAX];
	printf("请输入要查找的联系人姓名:\n");
	scanf("%s", name);

	int find = FindByName(con, name);
	if (find < 0)
	{
		printf("要删除的联系人数据不存在!\n");
		return;
	}
	// 表头:姓名 性别 年龄 电话 地址
	printf("%s %s %s %s %s\n", "姓名", "性别", "年龄", "电话", "地址");

	// 调整一下格式
	printf("%3s %3s %3d %3s %3s\n", \
		con->arr[find].name, \
		con->arr[find].gender, \
		con->arr[find].age, \
		con->arr[find].tel, \
		con->arr[find].addr
	);
}

测试程序:

// 通讯录的测试方法
void ContactTest01()
{
	Contact con;	// 创建的通讯录对象 实际上就是顺序表对象 等价于 SL sl

	// 通讯录初始化
	ContactInit(&con);

	// 添加数据
	ContactAdd(&con);
	ContactAdd(&con);
	ContactShow(&con);

	// 测试查找
	ContactFind(&con);

	// 通讯录销毁
	ContactDesTroy(&con);
}

int main()
{
	ContactTest01();

    return 0;
}

运行结果:

  • 17
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
很高兴为您解答关于通讯录C语言程序设计代码的问题。根据您提供的引用内容,以下是一个通讯录C语言程序设计的简单示例: 首先,创建三个文件:text.c(实现测试的逻辑),contact.c(函数实现),contact.h(函数声明)。 在contact.h文件中,我们可以声明一些函数原型和结构体,例如: ```c #ifndef CONTACT_H #define CONTACT_H #define MAX_NAME_LENGTH 50 #define MAX_PHONE_LENGTH 20 typedef struct { char name[MAX_NAME_LENGTH]; char phone[MAX_PHONE_LENGTH]; } Contact; void addContact(Contact* contacts, int* count); void displayContacts(Contact* contacts, int count); void searchContact(Contact* contacts, int count, char* name); void deleteContact(Contact* contacts, int* count, char* name); #endif ``` 在contact.c文件中,我们可以实现这些函数,例如: ```c #include <stdio.h> #include <string.h> #include "contact.h" void addContact(Contact* contacts, int* count) { if (*count >= MAX_CONTACTS) { printf("通讯录已满,无法添加新联系人。\n"); return; } Contact newContact; printf("请输入联系人姓名:"); scanf("%s", newContact.name); printf("请输入联系人电话:"); scanf("%s", newContact.phone); contacts[*count] = newContact; (*count)++; printf("联系人添加成功。\n"); } void displayContacts(Contact* contacts, int count) { if (count == 0) { printf("通讯录为空。\n"); return; } printf("通讯录中的联系人:\n"); for (int i = 0; i < count; i++) { printf("姓名:%s,电话:%s\n", contacts[i].name, contacts[i].phone); } } void searchContact(Contact* contacts, int count, char* name) { for (int i = 0; i < count; i++) { if (strcmp(contacts[i].name, name) == 0) { printf("联系人找到:姓名:%s,电话:%s\n", contacts[i].name, contacts[i].phone); return; } } printf("未找到该联系人。\n"); } void deleteContact(Contact* contacts, int* count, char* name) { int found = 0; for (int i = 0; i < *count; i++) { if (strcmp(contacts[i].name, name) == 0) { found = 1; for (int j = i; j < *count - 1; j++) { contacts[j] = contacts[j + 1]; } (*count)--; printf("联系人删除成功。\n"); break; } } if (!found) { printf("未找到该联系人。\n"); } } ``` 在text.c文件中,我们可以编写测试逻辑,例如: ```c #include <stdio.h> #include "contact.h" int main() { Contact contacts[MAX_CONTACTS]; int count = 0; int choice; char name[MAX_NAME_LENGTH]; do { printf("\n通讯录操作菜单:\n"); printf("1. 添加联系人\n"); printf("2. 显示所有联系人\n"); printf("3. 查找联系人\n"); printf("4. 删除联系人\n"); printf("0. 退出\n"); printf("请输入您的选择:"); scanf("%d", &choice); switch (choice) { case 1: addContact(contacts, &count); break; case 2: displayContacts(contacts, count); break; case 3: printf("请输入要查找的联系人姓名:"); scanf("%s", name); searchContact(contacts, count, name); break; case 4: printf("请输入要删除的联系人姓名:"); scanf("%s", name); deleteContact(contacts, &count, name); break; case 0: printf("程序已退出。\n"); break; default: printf("无效的选择。\n"); break; } } while (choice != 0); return 0; } ``` 这是一个简单的通讯录C语言程序设计示例,其中包含了添加联系人、显示所有联系人、查找联系人和删除联系人等功能。您可以根据自己的需求进行修改和扩展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值