《c语言通 讯 录管理系统课程设计.doc》由会员分享,可在线阅读,更多相关《c语言通 讯 录管理系统课程设计.doc(38页珍藏版)》请在金锄头文库上搜索。
1、课程名称:数据结构课程设计一、基本要求1、设计合适的数据结构存储朋友、分组信息,将friend.txt与group.txt中的内容导入其 中。记录包括:编号,姓名,性别,生日,电话号码1,电话号码2,电话号码3,住址与分组。2、能实现插入、删除、修改和查询操作。其中查询可按姓名,拼音或电话查询。3、能实现多条件查询。4、最后把系统中的数据保存回相应的文件中。二、 解题思路 根据题目要求,1、 键盘式选择菜单实现功能选择。2、 通讯录数据以文本文件存储,故应提供文件的输入输出等操作。将保存在txt文件中的数据读取出来并设计合适的链表(有头结点的单链表)用来存储数据。3、 利用链表进行通讯录记录的
2、插入,查找,修改,删除等操作。4、 查找可通过姓名,拼音电话号码进行查找。5、 修改和删除均建立在查找的基础之上。6、 实现多条件查找。7、 通讯录分组信息同理。利用单链表存储,从而进行显示、查找、删除等操作。8、 退出:即将通讯录及分组信息保存到文件之后,再退出到管理系统。三、 算法描述1、 建表:通讯录成员信息表及分组信息表尾插法建带头结点的通讯录链表createF();根据文本文件中数据的存储结构用fscanf()一条一条的读取数据;并将读取出来的数据赋给链表的结点;使Flag=1,即表示通讯录已经建立;通讯录成员分组信息表createG()同理;2、 显示通讯录已有成员信息从链表中读取
3、并按照一定结构输出outputF( );3、 添加通讯录成员信息向通讯录中添加某人通讯信息的子函数insertF( );链表结点的插入,按编号次序有序插入使用两个指针变量p1和p2分别指向当前访问过的结点和下一结点。循环顺序查找插入结点的位置,其中p1指向待插入位置的前一个结点。4、 查找通讯录成员信息查找模块search( ):在通讯录中查找某人通讯信息的子函数输入要查找的通讯者的编号或姓名,从表头顺序访问表中结点。如果查找成功,则输出查找到的通讯者信息,返回p。若查找失败,则输出查找失败,返回p。5、 修改通讯录成员信息利用查找函数查找到需要修改的结点,进行修改。6、 删除通讯录成员信息利
4、用查找函数查找到需要修改的结点,进行删除。7、 多条件查询通讯录成员信息关键词类型分为:姓名,性别,地址,分组四种;选择第一个关键词类型之后,进行相关查询;之后第二个关键词,不需要输入相应类型,而是根据输入数据之间的差别进行匹配,从而进行相关的查询操作;8、 显示已有通讯录成员分组信息原理同outputF( );9、 添加通讯录成员分组信息原理同insertF( );10、 删除通讯录成员分组信息原理同DeleteF( );11、退出通讯录管理系统四、 程序设计1、 本程序中所有用到的数据结构定义/ Group的单链表存储结构struct GroupInfo int Gnum; char Gn
5、ame20; ; struct Group struct GroupInfo GInfo; Group *next; ; typedef Group *GInfoList; / Friend的单链表存储结构 struct FriendInfo char Fnum5; char Fname8; char sex3; char birthday11; char telephone112; char telephone212; char telephone39; char addr20; struct GroupInfo FGInfo; ; struct Friend struct FriendIn
6、fo FInfo; Friend *next; ;typedef Friend *FInfoList; 2、 基本操作建表:通讯录成员信息表及分组信息表/*尾插法建带头结点的通讯录链表createF()*/FInfoList createF()FILE *pRead,*pWrite;int nCount=0;FInfoList head=(Friend *)malloc(sizeof(Friend); /*申请头结点*/Friend *p,*rear;rear=head;pRead=fopen(Ffilename,r);if(NULL=pRead)exit(0);pWrite=fopen(fr
7、iend_bin.txt,wb);if(NULL = pWrite)fclose(pRead);exit(0);while(!feof(pRead)p=(Friend *)malloc(sizeof(Friend);fscanf(pRead,%s %s %s %s %s %s %s %s %dn,p-FInfo.Fnum,p-FInfo.Fname,p-FInfo.sex,p-FInfo.birthday,p-FInfo.telephone1,p-FInfo.telephone2,p-FInfo.telephone3,p-FInfo.addr,&p-FInfo.FGInfo.Gnum);fwr
8、ite(p,sizeof(struct Friend),1,pWrite);/printf(%st%st%st%st%st%snn%st%st%dnn,p-FInfo.Fnum,p-FInfo.Fname,p-FInfo.sex,p-FInfo.birthday,p-FInfo.telephone1,p-FInfo.telephone2,p-FInfo.telephone3,p-FInfo.addr,p-FInfo.groupnum);rear-next=p;rear=p;fclose(pRead);fclose(pWrite);Fflag=1;rear-next=NULL;return he
9、ad;/*尾插法建带头结点的通讯录成员分组信息表链表createG()*/GInfoList createG()FILE *gRead,*gWrite;int gCount=0;GInfoList head=(Group *)malloc(sizeof(Group); /*申请头结点*/Group *p,*rear;rear=head;gRead=fopen(Gfilename,r);if(NULL=gRead)exit(0);gWrite=fopen(group_bin.txt,wb);if(NULL = gWrite)fclose(gRead);exit(0);while(!feof(gR
10、ead)p=(Group *)malloc(sizeof(Group);fscanf(gRead,%d %sn,&p-GInfo.Gnum,p-GInfo.Gname);fwrite(p,sizeof(struct Group),1,gWrite);rear-next=p;rear=p;fclose(gRead);fclose(gWrite);Gflag=1;rear-next=NULL;return head;显示通讯录已有成员信息/*输出模块outputF( ):输出通讯录中联系人通讯信息的子函数*/void outputF(FInfoList Fhead)Friend *p;p=Fhea
11、d-next;printf(nn%20sn,通 讯 录);printf(n编号t姓名t性别t生日t电话号码1t电话号码2nn电话号码3t住址t分组nn);while(p!=NULL)printf(%st%st%st%st%st%snn%st%st%dnn,p-FInfo.Fnum,p-FInfo.Fname,p-FInfo.sex,p-FInfo.birthday,p-FInfo.telephone1,p-FInfo.telephone2,p-FInfo.telephone3,p-FInfo.addr,p-FInfo.FGInfo.Gnum); p=p-next;添加通讯录成员信息/*添加模块
12、insertF( ):向通讯录中添加某人通讯信息的子函数*/链表结点的插入,按编号次序有序插入/使用两个指针变量p1和p2分别指向当前访问过的结点和下一结点。/循环顺序查找插入结点的位置,其中p1指向待插入位置的前一个结点。void insertF(FInfoList Fhead,Friend *Fp)Friend *p1,*p2;p1=Fhead;p2=p1-next;while(p2!=NULL&strcmp(p2-FInfo.Fnum,Fp-FInfo.Fnum)next; /p2指向下一个结点p1-next=Fp; /插入p所指向的结点Fp-next=p2; 查找通讯录成员信息/*查找
13、模块search( ):在通讯录中查找某人通讯信息的子函数*/输入要查找的通讯者的编号或姓名,从表头顺序访问表中结点。/如果查找成功,则输出查找到的通讯者信息,返回p。/若查找失败,则输出查找失败,返回p。/把汉字转化为拼音缩写的函数,如李勇-lybool In(wchar_t start, wchar_t end, wchar_t code)if (code = start & code = end)return true;return false;char convert(wchar_t n)if (In(0xB0A1,0xB0C4,n) return a;if (In(0XB0C5,0XB2C0,n) return b;if (In(0xB2C1,0xB4ED,n) return c;if (In(0xB4EE,0xB6E9,n) return d;if (In(0xB6EA,0xB7A1,n) return e;if (In(0xB7A2,0xB8c0,n) return f;if (In(0xB8C1,0xB9FD,n) return g;if (In(0