C++通讯录管理系统:结构体数组实现增删改查
本文提供一份完整的 C++ 控制台应用程序源码,通过结构体和数组模拟一个基础通讯录系统。代码覆盖了从用户交互菜单到具体的数据增删改查逻辑,适合学习 C++ 基础语法及面向过程编程思想的读者参考。
程序运行效果与目标
本程序旨在构建一个纯文本控制的通讯录,支持以下功能操作:
- 添加联系人:输入姓名、电话、邮箱和地址。
- 删除/修改/查找:按姓名定位指定联系人并进行对应操作。
- 显示/清空:浏览所有现有记录或重置数据结构。
由于是本地文件系统中的内存演示,程序关闭后数据会丢失,实际业务中需结合文件读取与写入模块进行持久化存储改造。
核心逻辑解析
第1步:定义数据结构
程序定义了两种关键结构体。`person`用于承载单个联系人的四要素信息,而 `contacts` 则作为容器,利用静态数组维护多条记录并跟踪当前数量。
#include <iostream>
using namespace std;
#define MAX 200 // 最大存储容量
// 1. 联系人信息结构体
struct person {
string name;
string number;
string Email;
string address;
};
// 2. 通讯录容器结构体
struct contacts {
int people_num; // 当前已录入的人数
struct person personarr[MAX]; // 包含联系人的数组
};第2步:设计与展示菜单栏
为了提升命令行交互体验,首先编写一个专门输出导航菜单的控制台函数。它负责在每次循环前刷新显示可选的操作项。
void menu() {
cout << "——————————————————" << endl;
cout << "*********** 1.添加联系人 ***********" << endl;
cout << "*********** 2.删除联系人 ***********" << endl;
cout << "*********** 3.修改联系人 ***********" << endl;
cout << "*********** 4.查找联系人 ***********" << endl;
cout << "*********** 5.显示通讯录 ***********" << endl;
cout << "*********** 6.清空联系人 ***********" << endl;
cout << "*********** 0.退出通讯录 ***********" << endl;
cout << "——————————————————" << endl;
}第3步:实现人员信息的增删改查核心函数
这一部分是系统的基石。为了保证后续主流程调用的便捷性,我们将具体动作封装为独立函数,并将通讯录实例以指针形式传入以便直接修改内存状态。
添加功能:检查当前容量是否已满,若未满则逐个接收用户输入并追加至数组末尾。
void addperson(struct contacts* p) {
if (p->people_num == MAX) {
cout << "通讯录已满" << endl;
} else {
string name, number, Email, address;
cout << "请输入姓名:" << endl;
cin >> name;
cout << "请输入电话:" << endl;
cin >> number;
cout << "请输入邮箱:" << endl;
cin >> Email;
cout << "请输入地址:" << endl;
cin >> address;
// 赋值并累加计数
p->personarr[p->people_num].name = name;
p->personarr[p->people_num].number = number;
p->personarr[p->people_num].Email = Email;
p->personarr[p->people_num].address = address;
p->people_num++;
cout << "添加成功!" << endl;
}
}查找辅助:在执行任何涉及单条记录的命令前,必须确认该名字是否存在。此方法返回匹配的下标索引,找不到则返回 -1。
int existperson(struct contacts* p, string name) {
for (int i = 0; i < p->people_num; i++) {
if (p->personarr[i].name == name) {
return i;
}
}
return -1;
}删除机制:一旦获得目标位置,便利用 C/C++ 数组特性,将目标后的所有元素向前平移一位覆盖原值,最后计数器减一。
void delperson(struct contacts* p, int position) {
while (position < (p->people_num)) {
p->personarr[position] = p->personarr[position + 1];
position++;
}
p->people_num--;
cout << "删除成功!" << endl;
}第4步:整合业务逻辑并执行主循环
最后编写 main 入口函数,负责初始化内存环境,并通过 while(1) 持续捕获键盘指令,分发至相应的子进程处理。
int main() {
struct contacts c;
c.people_num = 0; // 初始化空状态
int select = 0;
string name;
while (1) {
menu();
cin >> select;
switch (select) {
case 1:
addperson(&c);
system("pause");
break;
case 2: // 示例:删除流程
cout << "请输入要删除的联系人姓名:";
cin >> name;
if (existperson(&c, name) == -1) {
cout << "该联系人不存在!";
} else {
delperson(&c, existperson(&c, name));
}
system("pause");
break;
// ... 此处省略其他相似分支的逻辑...
case 0:
cout << "欢迎下次使用" << endl;
system("pause");
return 0;
break;
}
system("cls"); // 清除屏幕以保持整洁
}
return 0;
}总结与扩展建议
上述内容展示了一个典型的 C++ 结构体应用案例,其特点是不依赖外部类库,能够清晰展现数据流转的过程。对于希望深入优化的开发者,可以考虑以下几点改进:一是引入文件读写接口(如 fstream)以防止程序退出导致数据清零;二是将线性查找替换为哈希映射(std::unordered_map)以提升大数据量下的搜索效率。以上就是对 C++ 实现通讯录功能的详细内容介绍,更多关于 C++ 算法与数据结构优化的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













