数据结构实验报告之通讯录的实现一、实验题目利用线性表实现一个通讯录管理,通信录的数据格式如下:struct DataType{int ID; //编号char name[10]; //姓名char ch; //性别char phone[13]; //电话char addr[31]; //地址};要求:∙实现通讯录的建立、增加、删除、修改、查询等功能∙能够实现简单的菜单交互,即可以根据用户输入的命令,选择不同的操作。
∙能够保存每次更新的数据(选作)∙能够进行通讯录分类,比如班级类、好友类、黑名单等等(选作)∙编写测试main()函数测试线性表的正确性二、实验目的1、熟悉C++语言的基本编程方法,掌握集成编译环境的调试方法。
2、掌握线性表的操作的实现方法。
3、运用线性表解决实际问题。
三、实验内容通过编写一个C++程序完成一个简易的通讯录管理系统,能够实现建立,增加,删除,修改,查找,浏览,输出,菜单等基本功能。
管理系统中每个元素含有成员的ID、姓名、性别、电话、地址等信息。
程序是使用链表的功能,通过一些算法简单的实现。
四、算法思路与主要代码1. 通信录管理结构:建立,增加,删除,修改,查找,浏览,菜单。
2.建立通讯录构造函数,建立头节点PHONEBOOK::PHONEBOOK(){first = new DataType;first->next = first->prior = first;first->ID = 0;}头插法,添加联系人1:在堆中建立新结点2:将 a[i]写入到新结点的数据域3:修改新结点的指针域4:修改头结点的指针域,将新结点加入链表中即 1:Node <T> * s=new Node <T> 2:s->data=a[i] 3:s->next=front->next; 4:front->next=s代码实现void PHONEBOOK::Insert(){DataType *data = new DataType;data->next = first->next;data->prior = first;first->next = data;data->next->prior = data;m++;data->ID = m;3.查找联系人按姓名查找查找是指用户输入要查找的联系人的姓名,系统该函数内找到该联系人,返回该联系人数据域的指针,在主函数中输出该联系人的全部信息。
即1. 初始化工作指针p; 2. 循环以下操作直到p为空或找到用户 1. 如果p的数据等于i,则返回P的数据域指针; 2. P指针指向下一个节点; 3.若找不到返回空指针。
代码实现void PHONEBOOK::Search(){cout << "请输入要查找的联系人的姓名:";char aname[10];cin >> aname;DataType *p = first->next;while (p){//找到则输出信息if (strcmp(p->name aname) == 0){Print(p);system("pause");system("cls");break;}p = p->next;//找不到就输出"该用户不存在"if (p == first){cout << "该联系人不存在!" << endl;system("pause");system("cls");break;}}}4.删除联系人删除是指根据用户输入要删除联系人的姓名,找到该联系人结点,返回该联系人的数据域,删除此节点。
即要满足1. 从第一个节点开始,查找到要删用户的的前一个用户节点,设P指向该节点;2. 设q指向要删除的用户:q=p->next;3. 摘链:p->next=q->next;4. 保存q节点的数据域:x=q->data;5. 释放q节点:delete q;要指出的是若在整个通讯录找不到该ID,直接跳过删除步骤,输出查无此人。
代码实现void PHONEBOOK::Delete(){cout << "请输入要删除的联系人的姓名:";char aname[10];cin >> aname;DataType *p = first->next;while (p != first){//找到该联系人后确认删除if (strcmp(p->name aname) == 0){Print(p);cout << "确定删除该联系人?(Y or N)" << endl;flag2:char s;cin >> s;//确认则删除if (s == 'Y' || s == 'y'){DataType *q = p->prior;//之后的联系人编号减一while (q != first){q->ID = q->ID - 1;q = q->prior;}//删除节点p->next->prior = p->prior;p->prior->next = p->next;delete p;m--;cout << "删除完成!" << endl;system("pause");system("cls");break;}5.修改联系人用户需要修改联系人信息时,在主函数中输入用户姓名,先是调用查找模块,如果用户存在,系统就会获取该联系人的所有信息,然后重新调用输入信息模块,再次输入联系人的编号,姓名,性别,手机号,地址,输入信息后,原有信息被替换。
代码实现void PHONEBOOK::Revise(){cout << "请输入要修改的联系人的姓名:";char aname[10];cin >> aname;DataType *p = first->next;while (p){//找到后录入新信息if (strcmp(p->name aname) == 0)……………Else……6.浏览通讯录用户使用此功能时,即实现通讯录的遍历,系统会依次输出所有用户的信息。
输出的基本思想是:只要将表头的指针赋给一个指针变量p,然后用p向后扫描,直到表尾,p为空值。
代码实现oid PHONEBOOK::Show(){if (m == 0){cout << "通讯录空的呢,亲!" << endl;system("pause");system("cls");}//循环输出联系人信息else{DataType *p = first->prior;while (p){Print(p);cout << endl;p = p->prior;if (p == first){system("pause");system("cls");break;}}}}7.菜单利用switch case结构实现选择的功能,从而实现简易交互,启用通信录前面写好的多个功能。
//菜单(主界面)void PHONEBOOK::MENU(){bool exitFlag = false; //退出标识符do{cout << endl << endl << endl;cout << "***********************************************************************" << endl;cout << " 我的通讯录 " << endl;cout << " * * " << endl;cout << " * 1.添加我的联系人 * " << endl;cout << " * 2.删除我的联系人 * " << endl;cout << " * 3.修改我的联系人 * " << endl;cout << " * 4.查找我的联系人 * " << endl;cout << " * 5.浏览我的通讯录 * " << endl;cout << " 6.退出我的通讯录 " << endl;cout << " * * " << endl;cout << "***********************************************************************" << endl;cout << endl << "请输入您要完成的操作序号:";int k;flag4:cin >> k;switch (k){case 1:system("cls");Insert();break;case 2:system("cls");Delete();break;case 3:system("cls");Revise();break;case 4:system("cls");Search();break;case 5:system("cls");Show();break;case 6:exitFlag = true;break;default:cout << endl << "输入有误,请重新输入:";goto flag4;}} while (!exitFlag);cout << "谢谢使用!" << endl;}#include<iostream>#include<cstring>using namespace std;struct DataType{int ID; //编号char name[10]; //姓名char ch; //性别char phone[13]; //电话char addr[31]; //地址DataType *prior;DataType *next;};int m = 0; //全局变量,记录通讯录内数据个数class PHONEBOOK{DataType *first; //定义头结点public:PHONEBOOK(); //建立void Insert(); //增加void Delete(); //删除void Revise(); //修改void Search(); //查找void Show(); //浏览void Print(DataType *p); //输出void MENU(); //菜单~PHONEBOOK();};//构造函数,建立头结点PHONEBOOK::PHONEBOOK(){first = new DataType;first->next = first->prior = first;first->ID = 0;}//析构函数PHONEBOOK::~PHONEBOOK(){DataType *p = first->prior;DataType *q;if (p == first)delete p;{do{q = p;p = p->prior;delete q;} while (p != first);delete p;}}//添加联系人(头插法)void PHONEBOOK::Insert(){DataType *data = new DataType;data->next = first->next;data->prior = first;first->next = data;data->next->prior = data;m++;data->ID = m;//录入信息cout << "请输入联系人姓名:";cin >> data->name; cin.sync();flag1:cout << endl << "请输入联系人性别( M(男) or W(女)):";cin >> data->ch; cin.sync();if (data->ch != 'M'&&data->ch != 'W'&&data->ch != 'm'&&data->ch != 'w') {cout << "输入有误!" << endl;goto flag1;}cout << endl << "请输入联系人电话号码:";cin >> data->phone; cin.sync();cout << endl << "请输入联系人地址:";cin >> data->addr;cout << endl << "添加完成!" << endl;system("pause");system("cls");//输出单个联系人信息void PHONEBOOK::Print (DataType *p){cout << "编号:" << p->ID << endl;;cout << "姓名:" << p->name << endl;cout << "性别:";if (p->ch == 'm' || p->ch == 'M')cout << "男" << endl;elsecout << "女" << endl;cout << "号码:" << p->phone << endl; cout << "住址:" << p->addr << endl;}//查找联系人(按姓名)void PHONEBOOK::Search(){cout << "请输入要查找的联系人的姓名:"; char aname[10];cin >> aname;DataType *p = first->next;while (p){//找到则输出信息if (strcmp(p->name aname) == 0){Print(p);system("pause");system("cls");break;}p = p->next;//找不到就输出"该用户不存在"if (p == first){cout << "该联系人不存在!" << endl;system("pause");system("cls");break;}}}//删除联系人void PHONEBOOK::Delete(){cout << "请输入要删除的联系人的姓名:";char aname[10];cin >> aname;DataType *p = first->next;while (p != first){//找到该联系人后确认删除if (strcmp(p->name aname) == 0){Print(p);cout << "确定删除该联系人?(Y or N)" << endl; flag2:char s;cin >> s;//确认则删除if (s == 'Y' || s == 'y'){DataType *q = p->prior;//之后的联系人编号减一while (q != first){q->ID = q->ID - 1;q = q->prior;}//删除节点p->next->prior = p->prior;p->prior->next = p->next;delete p;m--;cout << "删除完成!" << endl;system("pause");system("cls");break;}//取消删除else if (s == 'N' || s == 'n'){system("cls");}else{cout << "输入有误,请重新输入:";goto flag2;}}elsep = p->next;//找不到该联系人if (p == first){cout << "该联系人不存在!" << endl; system("pause");system("cls");break;}}}//修改联系人void PHONEBOOK::Revise(){cout << "请输入要修改的联系人的姓名:"; char aname[10];cin >> aname;DataType *p = first->next;while (p){//找到后录入新信息if (strcmp(p->name aname) == 0){cout << "请输入联系人姓名:";cin >> p->name; cin.sync();flag3:cout << endl << "请输入联系人性别( M(男) or W(女)):"; cin >> p->ch; cin.sync();if (p->ch != 'M'&&p->ch != 'W'&&p->ch != 'm'&&p->ch != 'w'){cout << "输入有误!" << endl;goto flag3;}cout << endl << "请输入联系人电话号码:";cin >> p->phone; cin.sync();cout << endl << "请输入联系人地址:";cin >> p->addr;cout << "修改完成!" << endl;system("pause");system("cls");break;}p = p->next;//找不到联系人if (p == first){cout << "该联系人不存在" << endl;system("pause");system("cls");break;}}}//浏览通讯录void PHONEBOOK::Show(){if (m == 0){cout << "通讯录空的呢,亲!" << endl;system("pause");system("cls");}//循环输出联系人信息else{DataType *p = first->prior;while (p){Print(p);cout << endl;p = p->prior;if (p == first){system("pause");system("cls");break;}}}}//菜单(主界面)void PHONEBOOK::MENU(){bool exitFlag = false; //退出标识符do{cout << endl << endl << endl;cout << "***********************************************************************" << endl;cout << " 我的通讯录 " << endl;cout << " * * " << endl;cout << " * 1.添加我的联系人 * " << endl;cout << " * 2.删除我的联系人 * " << endl;cout << " * 3.修改我的联系人 * " << endl;cout << " * 4.查找我的联系人 * " << endl;cout << " * 5.浏览我的通讯录 * " << endl;cout << " 6.退出我的通讯录 " << endl;cout << " * * " << endl;cout << "***********************************************************************" << endl;cout << endl << "请输入您要完成的操作序号:";int k;flag4:cin >> k;switch (k){case 1:system("cls");Insert();break;case 2:system("cls");Delete();break;case 3:system("cls");Revise();break;case 4:system("cls");Search();break;case 5:system("cls");Show();break;case 6:exitFlag = true;break;default:cout << endl << "输入有误,请重新输入:";goto flag4;}} while (!exitFlag);cout << "谢谢使用!" << endl;}//主函数(测试)int main(){PHONEBOOK MyPHONEBOOK;MyPHONEBOOK.MENU();}五、参考资料数据结构与算法。