当前位置:文档之家› 通讯录管理系统的设计与实现

通讯录管理系统的设计与实现

数据结构实验报告实验名称:通讯录管理系统的设计与实现试验时间:2011.1.13班级:姓名学号:指导老师:1.问题描述:通讯录是用来记录,查询联系人通讯信息的工具。

电子通讯录已成为手机,电子词典等电子设备中不可缺少的工具软件。

设计一个能够,满足这种需求的软件。

基本功能模块:输入,显示,查找,插入,删除,保存,读入,排序,修改,移动,退出。

2.设计要求:(1)基本要求1.设计通讯录数据的逻辑结构和物理结构。

2.通讯录至少包含下列数据信息:姓名,电话,地址等。

3.完成图示基本功能。

4.软件易用,操作简单。

5.根据自己使用通讯录的体会,扩充其他功能,如按姓名查找,按学号查找,按序号查找等。

(2)较高要求1.数据输入有效性检验:如姓名不能为空,号码中不能有非法字符等。

2.提供分组管理的相关功能,如:分组显示,加入组,组创建,组查询等。

3.可视化的界面设计。

3.测试案例:请输入您的选择(0--6): 1分别输入编号,姓名,性别,电话,地址(输入0 结束通信录的建立): 编号:01姓名:张三电话:152****1919地址:2-222编号:0请输入您的选择(0--6): 2编号:01姓名:张三电话:152****1919地址:2-222是否继续添加?(Y/N):N请输入您的选择(0--6): 3请选择查询的方式(1 编号,2 姓名):1 请输入编号:01编号:01姓名:张三电话:152****1919地址:2-222请问是否继续查询?(Y/N):N请输入您的选择(0--6): 4输入删除编号:01删除学生信息如下:编号:01姓名:张三电话:152****1919地址:2-222请输入您的选择(0--6): 5通讯录的全部信息如下:*****编号*****姓名*****性别*****电话*****地址*****学生总人数为:1请输入您的选择(0--6):6 记录已保存!请输入您的选择(0--6):0 结束!!!4.数据结构设计:数据域描述通讯录的相关信息,根据每个学生的基本信息含有多个属性,其中包括序号,姓名,性别,电话,地址等,为此可根据学生信息建立结构体,类型定义如下:typedef struct{ char num; //学号char name; //姓名char sex; //性别char phone; //电话char addr; //地址}DataType;根据通讯录的设计要求,可用单向链表实现该通讯录系统的功能。

链表结点只含一个数据域和一个指针,用typedef定义通讯录的结点类型。

线性表的链式存储结构定义如下:typedef struct node{ //结构类型定义DataType data; //结点数据域Struct node * next; //结点指针域}ListNode;typedef ListNode *LinkList;ListNode * p; //定义一个指向结点的指针变量LinkList head; //定义指向单链表的头指针5.算法设计:1)建立通讯录链表建立带头结点的单链表,运用尾插法建表void StudentRecords::Build() {string NUM;bool flag=false;ListNode *p;cout<<"分别输入编号,姓名,性别,电话,地址(输入0 结束通信录的建立):"<<endl;while(!flag){cout<<"编号:";cin>>NUM;if(NUM>"0") {p=new ListNode; //创建一个新头结点p->data.num=NUM;cout<<"姓名:";cin>>p->;cout<<"性别:";cin>>p->data.sex;cout<<"电话:";cin>>p->data.phone;cout<<"地址:";cin>>p->data.addr;p->next=head->next;head->next=p;}else break;}cout<<endl;}2)通讯录信息的插入单链表结点插入元素的基本思想:使用两个指针变量p和q分别指向访问过的结点和下一个待访问的结点,循环顺序查找链表,寻找插入结点的位置,其中p指向待插入位置的前一个结点。

首先:p指向原链表的头结点,q指向链表的第一个指针;while(q!=NULL&&q->data.num){p=q; //p指向访问过的结点q->next; //q指向表的下一个结点}然后插入新结点:void StudentRecords::Add(){ListNode *p;bool flag=true;while(flag) {p=new ListNode;cout<<"分别输入编号,姓名,性别,电话,地址:"<<endl;cout<<"编号:";cin>>p->data.num;cout<<"姓名:";cin>>p->;cout<<"性别:";cin>>p->data.sex;cout<<"电话:";cin>>p->data.phone;cout<<"地址:";cin>>p->data.addr;p->next=head->next;head->next=p;cout<<endl;cout<<"是否继续添加?(Y/N):";char YN;cin>>YN;if(YN=='Y')flag=true;else flag=false;}}3)通讯录的查找基本思想:首先输入要查找的通讯录学号或姓名,从表头顺序访问表中的结点,如查找成功,则返回一个指向查找到的通讯者结点的指针,若查找失败,则返回一个空指针NULL.void StudentRecords::Check(){ListNode *p,*q;int i;bool flag1,flag2,flag3,flag;flag=true;char YN='Y';string NUM;string NAME;while(flag){if(!head->next){cout<<"通信录为空!"<<endl;break;}else{while(YN=='Y') {flag3=false;cout<<"请选择查询的方式(1编号,2姓名):";cin>>i;switch(i){case 1:cout<<"请输入编号:";cin>>NUM;break;case 2:cout<<"请输入姓名:";cin>>NAME;break;default:cout<<"输入错误,请重新输入!"<<endl;flag3=true;break;}if(!flag3){p=head->next;flag1=false;while(p){flag2=false;switch(i){case 1:if(NUM==p->data.num){flag2=flag1=true;q=p;}p=p->next;break;case 2:if(NAME==p->){flag2=flag1=true;q=p;}p=p->next;break;default:break;}if(flag2){cout<<"该学生信息如下:"<<endl;cout<<"编号:"<<q->data.num<<endl;cout<<"姓名:"<<q-><<endl;cout<<"性别:"<<q->data.sex<<endl;cout<<"电话:"<<q->data.phone<<endl;cout<<"地址:"<<q->data.addr<<endl;}}cout<<endl;if(!flag1)cout<<"查无此人"<<endl;cout<<"请问是否继续查询?(Y/N):";cin>>YN;if(YN=='Y')flag=true;else flag=false;}}}cout<<endl;}}4)通讯录的删除基本思想:现调用查找函数,查找到要删除的结点,删除void StudentRecords::Delete(){ListNode *p,*q;string NUM;char YN='Y';bool flag,flag1;flag1=true;while(flag1){while( YN=='Y'){ flag=false;p=head;q=p->next;if(!q){cout<<"通信录为空!"<<endl;flag1=false;break;}cout<<"输入删除编号:";cin>>NUM;while(q){if(NUM==q->data.num){cout<<"确认删除"<<NUM<<"的信息(Y/N):";cin>>YN;if(YN=='Y')flag1=true;else flag1=false;cout<<"删除学生信息如下:"<<endl;cout<<"编号:"<<q->data.num<<endl;cout<<"姓名:"<<q-><<endl;cout<<"性别:"<<q->data.sex<<endl;cout<<"电话:"<<q->data.phone<<endl;cout<<"地址:"<<q->data.addr<<endl;p->next=q->next;delete q;flag=true;break;}else {p=p->next; q=p->next;}}if(!flag) cout<<"查无此人!"<<endl;cout<<"是否继续进行删除?(Y/N):";cin>>YN;if(YN=='Y')flag1=true;else flag1=false;}}cout<<endl;}5)通讯录的输出基本思想:将头指针赋给一个指针变量p,然后用p向后扫描,输出相应结点的值,直到表尾p为空为止.void StudentRecords::PrintList(){ListNode *p,*q,*s,*Max,*Min,*first;int count=0;if(head->next){first=new ListNode;s=first;cout<<"通信录的全部信息如下:"<<endl<<endl;cout<<"****编号"<<"***********姓名"<<"**********性别"<<"**********电话"<<"**************地址***********"<<endl;while(head->next){Min=head->next ;Max=Min->next ;q=head;while(Max&&Min){if(Max->data .num <Min->data .num ){Min=Max;Max=Max->next ;}e lse Max=Max->next ;}while(q->next !=Min)q=q->next ;q->next =Min->next;s->next=Min;s=Min;s->next =NULL;}delete head;head=first;p=head->next;while(p){cout<<setw(8)<<p->data.num<<setw(17)<<p-><<setw(13)<<p->data.sex<<setw(16)<<p->data.phone<<setw(21)<<p->data.addr<<endl;p=p->next;count++;}cout<<endl<<"学生总人数为:"<<count<<endl;}else cout<<"通信录为空!"<<endl;cout<<endl;}void StudentRecords::cin_file(char*filename){ifstream infile(filename,ios::in);if(!infile){cerr<<"open error!"<<endl;exit(1);}ListNode ch,* p;while(infile>>ch.data.num){p=new ListNode;infile>>>>ch.data.sex>>ch.data.phone>>ch.data.addr;p->data.num=ch.data.num;p->=;p->data.sex=ch.data.sex;p->data.phone=ch.data.phone;p->data.addr=ch.data.addr;p->next=head->next;head->next=p;}infile.close();}6)通讯录的保存void StudentRecords::Preservation_file(){ofstream outfile("RD.txt",ios::out);if(!outfile){cerr<<"open error!"<<endl;exit(1);}ListNode * p;p=head->next;while(p){outfile<<setw(8)<<p->data.num<<setw(17)<<p-><<setw(13)<<p->data.sex<<setw(16)<<p->data.phone<<setw(22)<<p->data.addr<<endl;p=p->next;}cout<<"记录已保存!"<<endl<<endl;outfile.close();}7)界面设计6.运行与测试1)运行程序,显示菜单,如图:2)按“1”创建表。

相关主题