题目描述
设通讯录中每一个联系人的内容有:姓名、电话号码、班级、宿舍。由标准输入读入联系人信息,使用线性表中操作实现通讯录管理功能,包括:插入、删除、编辑、查找(按姓名查找);键盘输入一班级,输出通讯录中该班级中所有人的信息。
每个操作的第一个数为操作数(插入-0,删除-1,编辑-2,查找-3,输出一个班所有人员信息-4),具体格式如下:
- 0 姓名 电话 班级 宿舍 插入一条记录
- 1 姓名 根据姓名删除一条记录
- 2 姓名 编辑项目 项目新值 根据姓名编辑一条记录(编辑项目为1到3的整数,1代表编辑电话,2代表编辑班级,3代表编辑宿舍)
- 3 姓名 根据姓名查找,找到输出1,未找到输出0
- 4 班级 输出该班级的所有成员的宿舍号的异或值
其中查找操作当找到相应的人时输出1,未找到输出0。输出一个班级的人员信息时输出所有成员的宿舍号的异或值。输入数据保证合法。
实验要求
- 不要使用 STL
- 封装线性表类,提供插入,删除,查找等操作
- 线性表实现使用数组描述方法(顺序存储结构)
输入输出格式
输入:
第一行一个n(1<=n<=20000), 代表接下来操作的数目。接下来n行代表各项操作。
输出:
当遇到查找和输出一个班所有人员信息操作时输出。
数据结构与算法描述
通过结构体数组来储存各个学生的姓名、电话号码、班级、宿舍。在线性表类中,设置三个私有成员,学生的结构体、操作数目、联系人的个数。
struct student{
string name;
string phone_number;
int sclass;//班级
int dormitory;//宿舍
};
插入函数:直接将输入的数据传入结构体数组中,并让联系人个数加一。
void arrayList::insert() {//插入
string na;
string pn;
int c;
int d;
cin >> na >> pn >> c >> d;//输入姓名、电话、班级、宿舍
stu[snum].name = na;
stu[snum].phone_number = pn;
stu[snum].sclass = c;
stu[snum].dormitory = d;
snum++;//联系人个数加一
}
删除函数:声明一个theindex用来索引,通过姓名找到位置,然后将该索引之后的联系人向前移动一位,将联系人减一。
void arrayList::erase() {//删除
string na;
cin >> na;//输入姓名
int theindex=0;
for (int i = 0; i < snum; i++) {//找到该联系人的位置
if (stu[i].name == na) {
break;
}
else {
theindex++;
}
}
for (int i = theindex; i < snum-1; i++) {
stu[i] = stu[i + 1];//将要删掉的联系人后面向前移一位
}
snum--;//联系人减一
}
编辑函数:同删除函数一样通过姓名找到位置和索引,然后再通过输入的编辑项目,再编辑结构体数组中相应的数据。
void arrayList::edit() {//编辑
string na;
int p;
cin >> na >> p;//输入姓名、编辑项目
int theindex = 0;
for (int i = 0; i < snum; i++) {//找到该联系人位置
if (stu[i].name == na) {
break;
}
else {
theindex++;
}
}
if (p == 1) {//如果编辑项目为1,编辑电话
string pn;
cin >> pn;
stu[theindex].phone_number = pn;
}
else if (p == 2) {//编辑项目为2,编辑班级
int c;
cin >> c;
stu[theindex].sclass = c;
}
else if (p == 3) {//编辑项目为3,编辑宿舍
int d;
cin >> d;
stu[theindex].dormitory = d;
}
}
查找函数:方法与删除函数类似,多声明了一个变量a初始化为0,便是不存在,如果找到则a=1,最后输出a。
void arrayList::seek() {//查找
string na;
cin >> na;//输入姓名
int theindex = 0;
int a = 0;//判断是否存在,初始化为0 不存在
for (int i = 0; i < snum; i++) {
if (stu[i].name == na) {//如果存在则a为1
a = 1;
break;
}
}
cout << a << endl;//输出0或1
}
输出函数:将结构体中班级和输入的班级相等的宿舍号进行求异或,最后输出异或值。
void arrayList::output() {//输出
int c;
cin >> c;//输入班级
int d = 0;
for (int i = 0; i < snum; i++) {
if (stu[i].sclass == c) {
d ^= stu[i].dormitory;//求该班级所有宿舍号的异或值
}
}
cout << d << endl;//输出异或值
}
测试结果
完整代码(含注释)
#include<iostream>
using namespace std;
struct student{
string name;
string phone_number;
int sclass;//班级
int dormitory;//宿舍
};
class arrayList {
public:
arrayList(int n) {
num = n;
stu = new student[n];
}
~arrayList() { delete[]stu; }
void insert();
void erase();
void edit();
void seek();
void output();
private:
struct student* stu;
int num;//操作数目
int snum = 0;//联系人个数初始化为0
};
void arrayList::insert() {//插入
string na;
string pn;
int c;
int d;
cin >> na >> pn >> c >> d;//输入姓名、电话、班级、宿舍
stu[snum].name = na;
stu[snum].phone_number = pn;
stu[snum].sclass = c;
stu[snum].dormitory = d;
snum++;//联系人个数加一
}
void arrayList::erase() {//删除
string na;
cin >> na;//输入姓名
int theindex=0;
for (int i = 0; i < snum; i++) {//找到该联系人的位置
if (stu[i].name == na) {
break;
}
else {
theindex++;
}
}
for (int i = theindex; i < snum-1; i++) {
stu[i] = stu[i + 1];//将要删掉的联系人后面向前移一位
}
snum--;//联系人减一
}
void arrayList::edit() {//编辑
string na;
int p;
cin >> na >> p;//输入姓名、编辑项目
int theindex = 0;
for (int i = 0; i < snum; i++) {//找到该联系人位置
if (stu[i].name == na) {
break;
}
else {
theindex++;
}
}
if (p == 1) {//如果编辑项目为1,编辑电话
string pn;
cin >> pn;
stu[theindex].phone_number = pn;
}
else if (p == 2) {//编辑项目为2,编辑班级
int c;
cin >> c;
stu[theindex].sclass = c;
}
else if (p == 3) {//编辑项目为3,编辑宿舍
int d;
cin >> d;
stu[theindex].dormitory = d;
}
}
void arrayList::seek() {//查找
string na;
cin >> na;//输入姓名
int theindex = 0;
int a = 0;//判断是否存在,初始化为0 不存在
for (int i = 0; i < snum; i++) {
if (stu[i].name == na) {//如果存在则a为1
a = 1;
break;
}
}
cout << a << endl;//输出0或1
}
void arrayList::output() {//输出
int c;
cin >> c;//输入班级
int d = 0;
for (int i = 0; i < snum; i++) {
if (stu[i].sclass == c) {
d ^= stu[i].dormitory;//求该班级所有宿舍号的异或值
}
}
cout << d << endl;//输出异或值
}
int main() {
int n;
cin >> n;//输入操作的数目
arrayList l(n);
for (int i = 0; i < n; i++) {
int x;
cin >> x;//输入操作数
if (x == 0) {//0为插入
l.insert();
}
else if (x == 1) {//1为删除
l.erase();
}
else if (x == 2) {//2为编辑
l.edit();
}
else if (x == 3) {//3为查找
l.seek();
}
else if (x == 4) {//4为输出
l.output();
}
}
return 0;
}
如能打赏,不胜感激[叩谢]。