#include <iostream>
#include <string>
using namespace std;
class Address;
class Contact {
private: //定义变量结构体
string name; //姓名
string sex; //性别
string id; //身份证
string tel; //电话
string address; //家庭住址
string addition; //备注
Contact* next;
public:
Contact();
friend class Address;
};
Contact::Contact() //确保每个Contact对象在创建时都具有一个初始的next指针
{
next = NULL;
}
class Address { //函数的声明
public:
Address();
~Address();
int show();
void insert();
int check(string);
void delete_per(string);
void delete_chong();
void display();
void search();
void update(string);
void update_chong();
private:
Contact* head;
};
Address::Address() //初始化Address类的成员变量并创建一个初始的Contact对象
{
head = new Contact;
if (head == NULL)
{
cout << "fail create" << endl;
}
}
Address::~Address() //销毁Address对象同时释放它所包含的Contact对象的内存。
{
delete head;
}
以上为定义结构体等操作,放置于程序最前端。
以下为添加,删除,查看,搜索,修改等功能模块对应的函数
1.主菜单函数
int Address::show() //主菜单函数
{
int choice = 0;
cout << "\t\t\t\t ——————————————————————————" << endl;
cout << "\t\t\t\t| 学生信息系统 |" << endl;
cout << "\t\t\t\t|**************************|" << endl;
cout << "\t\t\t\t| 1、添加 2、删除 |" << endl;
cout << "\t\t\t\t|**************************|" << endl;
cout << "\t\t\t\t| 3、查看 4、搜索 |" << endl;
cout << "\t\t\t\t|**************************|" << endl;
cout << "\t\t\t\t| 5、修改 6、退出 |" << endl;
cout << "\t\t\t\t ——————————————————————————" << endl;
cout << "\t\t\t\t请输入选择:";
cin >> choice;
while (!(choice >= 1 && choice <= 6))
{
while (getchar() != '\n');
cout << "输入有误,请重新输入!";
cin >> choice;
}
return choice;
}
以上为主菜单函数 ,入口参数为选项数字,返回参数为主函数switch结构中对应的case。用于单个函数结束后与用户的交互。
2.添加函数
void Address::insert() //添加联系人
{
Contact* p = head;
char relay = 0;
while (p->next != NULL)
{
p = p->next;
}
Contact* person = new Contact;
cout << "请输入姓名:";
cin >> person->name;
cout << "请输入性别:";
cin >> person->sex;
cout << "请输入身份证号:";
cin >> person->id;
if (check(person->id)==0) //将ID作为判断是否为同一个学生的唯一标准
{
cout << "请输入电话:";
cin >> person->tel;
cout << "请输入住址:";
cin >> person->address;
cout << "请输入备注:";
cin >> person->addition;
p->next = person;
person->next = NULL;
cout << "\n添加成功,是否继续添加?(y/n)";
cin >> relay;
while (!(relay == 'y' || relay == 'Y' || relay == 'N' || relay == 'n'))
{
cout << "输入错误,请重新输入(y/n):";
cin >> relay;
}
if (relay == 'y' || relay == 'y')
{
system("clear");
insert();
}
}
else
{
person->next = NULL;
cout << "\n该学生已存在,添加失败,是否继续添加?(y/n)";
cin >> relay;
while (!(relay == 'y' || relay == 'Y' || relay == 'N' || relay == 'n'))
{
cout << "输入错误,请重新输入(y/n):";
cin >> relay;
}
if (relay == 'y' || relay == 'y')
{
system("clear");
insert();
}
}
}
以上为添加函数,用于添加新的学生。入口参数为各种个人信息,其中会对身份证进行特别处理,来决定成功输入与否。函数包含递归部分。
3.查重名函数
int Address::check(string m_id) //遍历联系人 有重名为返回值为 1,否则为0
{
Contact* a = head;
Contact* pre = head;
int flag = 0;
while (a->next != NULL)
{
pre = a;
a = a->next;
if (a->id == m_id)
{
flag = 1;
break;
}
}
return flag;
}
遍历联系人 有重名为返回值为 1,否则为0,在上面的添加函数中使用了该子函数。
4.删除函数
void Address::delete_per(string m_name) //删除联系人(普通删除)
{
Contact* p = head;
Contact* pre = head;
int flag = 0;
while (p->next != NULL)
{
pre = p;
p = p->next;
if (p->name == m_name)
{
pre->next = p->next;
delete p;
p = NULL;
flag = 1;
break;
}
}
if (flag == 1)
{
cout << "删除成功!" << endl;
}
else
{
cout << "您删除的联系人不存在,删除失败!" << endl;
}
}
void Address::delete_chong() //删除联系人 2
{
string m_name;
string m_id;
Contact* p = head;
Contact* pre = head;
Contact* remember=head;
int flag = 0;
int num=0;
cout << "请输入你要删除的联系人姓名!";
cin >> m_name;
while (p->next != NULL)
{
pre = p;
p = p->next;
if (p->name == m_name) //检查名字,并且计数
{
num++;
if (num == 1) //记住第一个名字的指针
remember = p;
if (num > 1) //如果重名就要输出重名学生的信息,以供用户选择
{
cout << "姓名:" << p->name << endl;
cout << "性别:" << p->sex << endl;
cout << "身份证号:" << p->id << endl;
cout << "电话:" << p->tel << endl;
cout << "地址:" << p->address << endl;
cout << "备注:" << p->addition << "\n\n" << endl;
}
}
}
if (num > 1) //如果重名,还要追加上第一个符合该姓名的学生
{
cout << "姓名:" << remember->name << endl;
cout << "性别:" << remember->sex << endl;
cout << "身份证号:" << remember->id << endl;
cout << "电话:" << remember->tel << endl;
cout << "地址:" << remember->address << endl;
cout << "备注:" << remember->addition <<"\n" << endl;
p = head; //指针返回初值
pre = head; //指针返回初值
remember = NULL;
cout << "\n\n不好意思,您要删除的学生重名,已经为您筛选出重名的所有学生,请输入你要删除的学生的身份证号!\n";
cin >> m_id;
while (p->next != NULL)
{
pre = p;
p = p->next;
if (p->id == m_id)
{
pre->next = p->next;
delete p;
p = NULL;
flag = 1;
break;
}
}
if (flag == 1)
{
cout << "删除成功!" << endl;
}
}
else // 不重名
delete_per(m_name);
}
删除子函数:入口参数为姓名。不具备检测重名情况的功能。
删除主函数:入口参数为姓名,副级参数为身份证号码。判断是否重名,如果重名就进入该函数的处理分支,否则就调用删除子函数。
5.查看函数
void Address::display() //查看联系人
{
Contact* p = head;
while (p->next != NULL)
{
p = p->next;
cout << endl << "=======================================" << endl;
cout << "姓名:" << p->name << endl;
cout << "性别:" << p->sex << endl;
cout << "身份证号:" << p->id << endl;
cout << "电话:" << p->tel << endl;
cout << "地址:" << p->address << endl;
cout << "备注:" << p->addition << endl;
}
}
查看函数,会遍历通讯录并且 ,将之全部显示出来,以此达到查看的目的。
6.查找函数
void Address::search() //搜索联系人
{
string m_name;
Contact* p = head;
int flag = 0;
cout << "请输入你要搜索的联系人姓名:";
cin >> m_name;
while (p->next != NULL)
{
p = p->next;
if (p->name == m_name)
{
cout << endl << "=======================================" << endl;
cout << "姓名:" << p->name << endl;
cout << "性别:" << p->sex << endl;
cout << "身份证号:" << p->id << endl;
cout << "电话:" << p->tel << endl;
cout << "地址:" << p->address << endl;
cout << "备注:" << p->addition << endl;
flag = 1;
}
}
if (flag == 1)
{
cout << "\n查询成功!" << endl;
}
else
{
cout << "您查询的联系人不存在,删除失败!" << endl;
}
}
查找函数:入口参数为姓名。该函数,将所有符合筛选条件中姓名的学生全部列举出来,如果重名也全部例举出来。
7.修改函数
void Address::update(string m_name) //普通修改联系人
{
Contact* p = head;
int flag = 0;
while (p->next != NULL)
{
p = p->next;
if (p->name == m_name)
{
cout << "请修改身份证号:";
cin >> p->id ;
cout << "请修改性别:";
cin >> p->sex;
cout << "请修改电话:";
cin >> p->tel;
cout << "请修改住址:";
cin >> p->address;
cout << "请修改备注:";
cin >> p->addition;
flag = 1;
break;
}
}
if (flag == 1)
{
cout << "\n修改成功\n" << endl;
}
else
{
cout <<"\n"<< "查无此人,修改失败!" << "\n" << endl;
}
}
void Address::update_chong() //修改联系人
{
Contact* p = head;
Contact* remember = head;
string m_name;
string m_id;
int flag = 0;
int num = 0;
cout << "请输入你要修改的姓名:";
cin >> m_name;
while (p->next != NULL)
{
p = p->next;
if (p->name == m_name)
{
num++;
if (num == 1) //记住第一个名字的指针
remember = p;
if (num > 1) //如果重名就要输出重名学生的信息,以供用户选择
{
cout <<"\n" << "姓名:" << p->name << endl;
cout << "性别:" << p->sex << endl;
cout << "身份证号:" << p->id << endl;
cout << "电话:" << p->tel << endl;
cout << "地址:" << p->address << endl;
cout << "备注:" << p->addition << "\n" << endl;
}
}
}
if (num > 1) //如果重名,还要追加上第一个符合该姓名的学生
{
cout << "姓名:" << remember->name << endl;
cout << "性别:" << remember->sex << endl;
cout << "身份证号:" << remember->id << endl;
cout << "电话:" << remember->tel << endl;
cout << "地址:" << remember->address << endl;
cout << "备注:" << remember->addition << "\n" << endl;
p = head; //指针返回初值
remember = NULL;
cout << "\n\n不好意思,您要修改的学生重名,已经为您筛选出重名的所有学生,请输入你要修改的学生的身份证号!\n";
cin >> m_id;
cout << "\n\n定位成功,请开始修改!\n\n";
while (p->next != NULL)
{
p = p->next;
if (p->id == m_id)
{
cout << "\n";
cout << "请修改性别:";
cin >> p->sex;
cout << "请修改电话:";
cin >> p->tel;
cout << "请修改住址:";
cin >> p->address;
cout << "请修改备注:";
cin >> p->addition;
flag = 1;
break;
}
}
cout << "\n修改成功\n" << endl;
}
else // 不重名
update(m_name);
}
修改子函数:入口参数为姓名。不具备检测重名情况的功能。
修改主函数:入口参数为姓名,副级参数为身份证号码。判断是否重名,如果重名就进入该函数的处理分支,否则就调用修改子函数。
本文在CSDN博主「素心暮年」的原创文章的基础上进行了修改,考虑了重名情况,追加了相应功能。原文链接:https ://blog.csdn.net/qq_38076413/article/details/75093105