数据结构与算法实验3——数组描述线性表

1.实验内容

设通讯录中每一个联系人的内容有:姓名、电话号码、班级、宿舍。由标准输入读入联系人信息,使用线性表中操作实现通讯录管理功能,包括:插入、删除、编辑、查找(按姓名查找);键盘输入一班级,输出通讯录中该班级中所有人的信息。

每个操作的第一个数为操作数(插入-0,删除-1,编辑-2,查找-3,输出一个班所有人员信息-4),具体格式如下:

0 姓名 电话 班级 宿舍 插入一条记录

1 姓名 根据姓名删除一条记录

2 姓名 编辑项目 项目新值 根据姓名编辑一条记录(编辑项目为1到3的整数,1代表编辑电话,2代表编辑班级,3代表编辑宿舍)

3 姓名 根据姓名查找,找到输出1,未找到输出0

4 班级 输出该班级的所有成员的宿舍号的异或值

其中查找操作当找到相应的人时输出1,未找到输出0。输出一个班级的人员信息时输出所有成员的宿舍号的异或值。输入数据保证合法。

2.测试结果   

输入:

28

0 Evan 57298577609 1 65

0 WINNIE 37367348390 4 1

3 Evan

4 6

3 WINNIE

1 Evan

4 7

1 WINNIE

3 MARYAM

3 CAMERON

3 TZIVIA

0 OMAR 16447001130 6 55

4 8

4 2

3 JADEN

3 ELIZABETH

2 OMAR 1 79409905568

3 JOSHUA

2 OMAR 1 8978214817

1 OMAR

3 Azaan

3 MARIA

0 HANNAH 94060479192 5 98

3 HEIDY

1 HANNAH

0 Axel 92066832927 3 70

1 Axel

3 TIFFANY

输出:

1
0
1
0
0
0
0
0
0
0
0
0
0
0
0
0

3.源代码

#include<iostream>

#include<string>

using namespace std;

struct student //包含学生4个信息的结构体

{

string name;

string phone;

int grade;

//因"class"为特殊字符,故用grade代表班级

int dorm;

};

template<class T>

void changeLength(T *&a,int oldLength,int newLength)

//改变数组的长度,变长则多余的空间为空,变短则舍弃部分数据

{

T *temp=new T[newLength];

int number=min(oldLength,newLength);

copy(a,a+number,temp);

delete []a;

a=temp;

}

class linearList //线性表类

{

public:

linearList(int n=10) //构造函数,参数为最大容量

{

person=new student[n];

capacity=n;

listSize=0;

}

~linearList() //析构函数

{

delete []person;

}

void insert(string &name,string &phone,int &grade,int &dorm) //插入信息

{

if(capacity==listSize) //最大容量满时扩大容量

{

changeLength(person,capacity,capacity*2);

capacity*=2;

}

person[listSize].name=name;

person[listSize].phone=phone;

person[listSize].grade=grade;

person[listSize].dorm=dorm;

listSize++;

}

void erase(string &name) //删除信息

{

int i=0;

for(i=0;i<listSize;i++) //找到该姓名的位置

if(person[i].name==name)

break;

copy(person+i+1,person+listSize,person+i); //后面的数据前移

person[--listSize].~student(); //释放最后一个位置的数据

}

void editPhone(string &name,string &newPhone) //编辑电话信息

{

int i=0;

for(i=0;i<listSize;i++) //找到该姓名的位置

if(person[i].name==name)

break;

person[i].phone=newPhone; //更新电话信息

}

void editGrade(string &name,int &newGrade)//编辑班级信息

{

int i=0;

for(i=0;i<listSize;i++) //找到该姓名的位置

if(person[i].name==name)

break;

person[i].grade=newGrade; //更新班级信息

}

void editDorm(string &name,int &newDorm)//编辑宿舍信息

{

int i=0;

for(i=0;i<listSize;i++) //找到该姓名的位置

if(person[i].name==name)

break;

person[i].dorm=newDorm; //更新宿舍信息

}

bool search(string &name) //查找是否存在该姓名

{

int i=0;

for(i=0;i<listSize;i++) //找到该姓名的位置

if(person[i].name==name)

return 1; //找到则返回1

return 0; //未找到,返回0

}

int outPut(int &gradeNum) //输出某班级所有人的宿舍号的异或值

{

int index=0;

for(int i=0;i<listSize;i++)

if(person[i].grade==gradeNum) //判断某人是否在该班中

index^=person[i].dorm; //若在,则计算异或值

return index;

}

private:

struct student* person;

int capacity;

int listSize;

};

int main()

{

int n;

cin>>n;

linearList studentArray;

for(int i=0;i<n;i++)

{

int decision;

cin>>decision;

string Name,Phone;

int Grade,Dorm;

switch(decision)

{

case 0: cin>>Name>>Phone>>Grade>>Dorm;

studentArray.insert(Name,Phone,Grade,Dorm);

break;

case 1: cin>>Name;

        studentArray.erase(Name);

        break;

case 2: cin>>Name;

int editDecision;

cin>>editDecision;

switch(editDecision)

{

case 1: cin>>Phone;

studentArray.editPhone(Name,Phone);

break;

case 2: cin>>Grade;

        studentArray.editGrade(Name,Grade);

        break;

case 3: cin>>Dorm;

        studentArray.editDorm(Name,Dorm);

        break;

default:break;

}

break;

case 3: cin>>Name;

        cout<<studentArray.search(Name)<<endl;

        break;

case 4: int GradeNum;

        cin>>GradeNum;

        cout<<studentArray.outPut(GradeNum)<<endl;

        break;

default:break;

}

}

return 0;

}

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值