c++-简单通讯录管理系统--课程设计-报告

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

1目录一.程序功能分析******************二.主要数据结构*******************三.主要特色**********************四.源代码*************************五.测试数据组******************六.心得和感想********************2一、程序功能分析实现以下功能:1)通讯录编辑(输入、储存、添加、删除、显示);2)按不同的项进行查找;3)对已存在的通讯录按不同的项排序;4)将通讯录写入文件;5)从文件读入通讯录。二、主要数据结构classNode{charName[10];//姓名intOfficePhone;//办公室电话intHomePhone;//住宅电话charMobilePhone[15];//手机号码charEMail[20];//email地址Node*Next;//下一结点指针public:Node(char*pname=NULL,intophone=0,inthphone=0,char*pmphone=NULL,char*pemail=NULL);voidShow();//显示结点数据voidSetName(char*name);//修改姓名voidSetOfficePhone(into);//修改办公室电话voidSetHomePhone(inth);//修改住宅电话voidSetMobilePhone(char*m);//修改手机号码voidSetEMail(char*e);//修改email地址friendclassAddrList;//将AddrList类说明为友元类friendvoidaddfromtxtfile(AddrList&);//将addfromtxtfile说明为友元函数friendvoidwritetotxtfile(AddrList&);//将writetotxtfile说明为友元函数};classAddrList{Node*HeadPtr;//链表首指针Node*TailPtr;//链表尾指针intTag;//排序状态标志,当Tag=1时,按姓名排序当Tag=2时,按办公室电话排序public://成员函数AddrList(Node*head=NULL,Node*tail=NULL,inttag=1)//构造函数,产生空链表,将tag的值置为1voidAddTail(Node*p)//将p指向的结点加入到链表尾部voidAddSort(Node*p)//将p指向的结点按Tag指定的顺序插入到链表中Node*LookUp(char*name)//按姓名查找结点,返回该结点指针voiddel(char*name)//删除指定姓名的结点voidSort(inttag)//按tag指定的关键字重新排序3voidShowAll()//显示全部结点,每10个显示一屏voidSetTag(intt)//置Tag值intGetTag()//取tag值Node*GetHeadPtr()//取首指针~AddrList()//释放链表空间voidCreateList(char*filename)//从二进制文件中读入数据,//构造链表voidWriteToFile(char*filename)//将链表中数据//写入指定的二进制文件};三、主要特色本程序主要特色有两个方面:1.使用了链表和类共同完成通讯录各个功能的操作。2.由于动态链表建立,可以自由使用。四、源代码#includefstream.h#includeiostream.h#includeiomanip.h#includestring.h#includestdlib.hclassNode{charName[10];//姓名intOfficePhone;//办公室电话intHomePhone;//住宅电话charMobilePhone[15];//手机号码charEMail[20];//email地址Node*Next;//下一结点指针public:Node(char*pname=NULL,intophone=0,inthphone=0,char*pmphone=NULL,char*pemail=NULL){if(pname)strcpy(Name,pname);elsestrcpy(Name,);OfficePhone=ophone;HomePhone=hphone;if(pmphone)strcpy(MobilePhone,pmphone);elsestrcpy(MobilePhone,);if(pemail)strcpy(EMail,pemail);elsestrcpy(EMail,);}voidShow()//显示结点数据{coutNamesetw(10)OfficePhone(O)setw(11)HomePhone(H)setw(11)MobilePhone(M)setw(14)EMail(E)'\n';}4voidSetName(char*name)//修改姓名{strcpy(Name,name);}voidSetOfficePhone(into)//修改办公室电话{OfficePhone=o;}voidSetHomePhone(inth)//修改住宅电话{HomePhone=h;}voidSetMobilePhone(char*m)//修改手机号码{strcpy(MobilePhone,m);}voidSetEMail(char*e)//修改email地址{strcpy(EMail,e);}friendclassAddrList;//将AddrList类说明为友元类friendvoidaddfromtxtfile(AddrList&);//将addfromtxtfile说明为友元函数friendvoidwritetotxtfile(AddrList&);//将writetotxtfile说明为友元函数};//链表类classAddrList{Node*HeadPtr;//链表首指针Node*TailPtr;//链表尾指针intTag;//排序状态标志,当Tag=1时,按姓名排序当Tag=2时,按办公室电话排序public://成员函数AddrList(Node*head=NULL,Node*tail=NULL,inttag=1)//构造函数,产生空链表,将tag的值置为1{HeadPtr=head;TailPtr=tail;Tag=tag;}voidAddTail(Node*p)//将p指向的结点加入到链表尾部{if(HeadPtr==NULL){HeadPtr=p;TailPtr=p;p-Next=NULL;}else{TailPtr-Next=p;5p-Next=NULL;TailPtr=p;}}voidAddSort(Node*p)//将p指向的结点按Tag指定的顺序插入到链表中{Node*p1,*p2;if(Tag==1)//按姓名排序{if(HeadPtr==NULL)//如果插入前原始链表为空链表{HeadPtr=p;TailPtr=p;p-Next=NULL;}else{if(strcmp(p-Name,HeadPtr-Name)=0)//插在链表首部{p-Next=HeadPtr;HeadPtr=p;}else//插在链表中间或尾部{p1=HeadPtr;p2=HeadPtr;while(p2-Next&&(strcmp(p2-Name,p-Name)0))//查找待插入位置{p1=p2;p2=p2-Next;}if(strcmp(p2-Name,p-Name)0)//插在链表尾部{p2-Next=p;p-Next=NULL;TailPtr=p;}else//插在链表中间,p2之前{p-Next=p2;p1-Next=p;}}}}else//按办公室电话排序{if(HeadPtr==NULL)//如果插入前原始链表为空链表{HeadPtr=p;TailPtr=p;p-Next=NULL;}else{if((p-OfficePhone-HeadPtr-OfficePhone)=0)//插在链表首部{p-Next=HeadPtr;HeadPtr=p;6}else//插在链表中间或尾部{p1=HeadPtr;p2=HeadPtr;while(p2-Next&&((p2-OfficePhone-p-OfficePhone)0))//查找待插入位置{p1=p2;p2=p2-Next;}if((p2-OfficePhone-p-OfficePhone)0)//插在链表尾部{p2-Next=p;p-Next=NULL;TailPtr=p;}else//插在链表中间,p2之前{p-Next=p2;p1-Next=p;}}}}}Node*LookUp(char*name)//按姓名查找结点,返回该结点指针{Node*p;p=HeadPtr;while(p!=NULL){if(strcmp(p-Name,name)==0)returnp;p=p-Next;}returnNULL;}voiddel(char*name)//删除指定姓名的结点{Node*p1,*p2;if(strcmp(HeadPtr-Name,name)==0)//若待删除的结点为首结点{p1=HeadPtr;HeadPtr=HeadPtr-Next;deletep1;cout删除了联系人endl;system(pause);}else//删除其他结点{p1=HeadPtr;p2=HeadPtr;while(strcmp(p2-Name,name)!=0&&p2-Next!=NULL){p1=p2;p2=p2-Next;}if(strcmp(p2-Name,name)==0){p1-Next=p2-Next;7deletep2;cout删除了一个联系人的信息!endl;system(pause);}}}voidSort(inttag)//按tag指定的关键字重新排序{Node*p1,*p2;Tag=tag;p2=HeadPtr;HeadPtr=NULL;TailPtr=NULL;while(p2){p1=p2-Next;AddSort(p2);p2=p1;}TailPtr-Next=NULL;}voidShowAll()//显示全部结点,每10个显示一屏{intn=0;Node*p;if(HeadPtr==NULL){cout链表为空,没有记录可显示!endl;}elsefor(p=HeadPtr;p!=NULL;p=p-Next){p-Show();n++;if(n%10==0){cout按任意键显示下一屏:endl;}}}voidSetTag(intt)//置Tag值{Tag=t;}intGetTag()//取tag值{returnTag;}Node*GetHeadPtr()//取首指针{returnHeadPtr;}~AddrList()//释放链表空间{Node*p;if(HeadPtr==NULL);else{while(HeadPtr)8{p=HeadPtr;HeadPtr=HeadPtr-Next;deletep;}}}voidCreateList(char*filename)//从二进制文件中读入数据,//构造链表{ifstreaminfile(filename,ios::in|ios::binary|ios::nocreate);if(!infile){cout文件endl;return;}//如果文件不存在,直接返回,空表else{infile.read((char*)&Tag,4);//读出二进制文件的第1个数据Ta

1 / 16
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功