c语言通讯录管理系统课程设计文档格式.docx
《c语言通讯录管理系统课程设计文档格式.docx》由会员分享,可在线阅读,更多相关《c语言通讯录管理系统课程设计文档格式.docx(48页珍藏版)》请在冰豆网上搜索。
循环顺序查找插入结点的位置,其中p1指向待插入位置的前一个结点。
4、查找通讯录成员信息
查找模块search():
在通讯录中查找某人通讯信息的子函数
输入要查找的通讯者的编号或姓名,从表头顺序访问表中结点。
如果查找成功,则输出查找到的通讯者信息,返回p。
若查找失败,则输出查找失败,返回p。
5、修改通讯录成员信息
利用查找函数查找到需要修改的结点,进行修改。
6、删除通讯录成员信息
利用查找函数查找到需要修改的结点,进行删除。
7、多条件查询通讯录成员信息
关键词类型分为:
姓名,性别,地址,分组四种;
选择第一个关键词类型之后,进行相关查询;
之后第二个关键词,不需要输入相应类型,而是根据输入数据之间的差别进行匹配,从而进行相关的查询操作;
8、显示已有通讯录成员分组信息
原理同outputF();
9、添加通讯录成员分组信息
原理同insertF();
10、删除通讯录成员分组信息
原理同DeleteF();
11、退出通讯录管理系统
四、程序设计
1、本程序中所有用到的数据结构定义
//Group的单链表存储结构
structGroupInfo
{
intGnum;
charGname[20];
};
structGroup
structGroupInfoGInfo;
Group*next;
typedefGroup*GInfoList;
//Friend的单链表存储结构
structFriendInfo
charFnum[5];
charFname[8];
charsex[3];
charbirthday[11];
chartelephone1[12];
chartelephone2[12];
chartelephone3[9];
charaddr[20];
structGroupInfoFGInfo;
structFriend
structFriendInfoFInfo;
Friend*next;
typedefFriend*FInfoList;
2、基本操作
①建表:
/*尾插法建带头结点的通讯录链表createF()*/
FInfoListcreateF()
{
FILE*pRead,*pWrite;
intnCount=0;
FInfoListhead=(Friend*)malloc(sizeof(Friend));
/*申请头结点*/
Friend*p,*rear;
rear=head;
pRead=fopen(Ffilename,"
r"
);
if(NULL==pRead)exit(0);
pWrite=fopen("
friend_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%d\n"
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);
fwrite(p,sizeof(structFriend),1,pWrite);
//printf("
%s\t%s\t%s\t%s\t%s\t%s\n\n%s\t%s\t%d\n\n"
FInfo.addr,p->
FInfo.groupnum);
rear->
next=p;
rear=p;
fclose(pRead);
fclose(pWrite);
Fflag=1;
rear->
next=NULL;
returnhead;
}
/*尾插法建带头结点的通讯录成员分组信息表链表createG()*/
GInfoListcreateG()
FILE*gRead,*gWrite;
intgCount=0;
GInfoListhead=(Group*)malloc(sizeof(Group));
Group*p,*rear;
gRead=fopen(Gfilename,"
if(NULL==gRead)exit(0);
gWrite=fopen("
group_bin.txt"
if(NULL==gWrite)
fclose(gRead);
feof(gRead))
p=(Group*)malloc(sizeof(Group));
fscanf(gRead,"
%d%s\n"
&
GInfo.Gnum,p->
GInfo.Gname);
fwrite(p,sizeof(structGroup),1,gWrite);
fclose(gRead);
fclose(gWrite);
Gflag=1;
②显示通讯录已有成员信息
/*输出模块outputF():
输出通讯录中联系人通讯信息的子函数*/
voidoutputF(FInfoListFhead)
Friend*p;
p=Fhead->
next;
printf("
\n\n%20s\n"
通讯录"
\n编号\t姓名\t性别\t生日\t电话号码1\t电话号码2\n\n电话号码3\t住址\t分组\n\n"
while(p!
=NULL)
printf("
p=p->
③添加通讯录成员信息
/*添加模块insertF():
向通讯录中添加某人通讯信息的子函数*/
//链表结点的插入,按编号次序有序插入
//使用两个指针变量p1和p2分别指向当前访问过的结点和下一结点。
//循环顺序查找插入结点的位置,其中p1指向待插入位置的前一个结点。
voidinsertF(FInfoListFhead,Friend*Fp)
Friend*p1,*p2;
p1=Fhead;
p2=p1->
while(p2!
=NULL&
&
strcmp(p2->
FInfo.Fnum,Fp->
FInfo.Fnum)<
0)
p1=p2;
//p1指向刚访问过的结点
p2=p2->
//p2指向下一个结点
p1->
next=Fp;
//插入p所指向的结点
Fp->
next=p2;
④查找通讯录成员信息
/*查找模块search():
在通讯录中查找某人通讯信息的子函数*/
//输入要查找的通讯者的编号或姓名,从表头顺序访问表中结点。
//如果查找成功,则输出查找到的通讯者信息,返回p。
//若查找失败,则输出查找失败,返回p。
//把汉字转化为拼音缩写的函数,如李勇->
ly
boolIn(wchar_tstart,wchar_tend,wchar_tcode)
if(code>
=start&
code<
=end)
returntrue;
returnfalse;
charconvert(wchar_tn)
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(0xB9FE,0xBBF6,n))return'
h'
if(In(0xBBF7,0xBFA5,n))return'
j'
if(In(0xBFA6,0xC0AB,n))return'
k'
if(In(0xC0AC,0xC2E7,n))return'
l'
if(In(0xC2E8,0xC4C2,n))return'
m'
if(In(0xC4C3,0xC5B5,n))return'
n'
if(In(0xC5B6,0xC5BD,n))return'
o'
if(In(0xC5BE,0xC6D9,n))return'
p'
if(In(0xC6DA,0xC8BA,n))return'
q'
if(In(0xC8BB,0xC8F5,n))return'
r'
if(In(0xC8F6,0xCBF0,n))return'
s'
if(In(0xCBFA,0xCDD9,n))return'
t'
if(In(0xCDDA,0xCEF3,n))return'
w'
if(In(0xCEF4,0xD188,n))return'
x'
if(In(0xD1B9,0xD4D0,n))return'
y'
if(In(0xD4D1,0xD7F9,n))return'
z'
return'
\0'
}
char*TransformToSpell(charname[]){
charchr[3];
wchar_twchr=0;
char*Spell=newchar[strlen(name)/2];
memset(Spell,0x00,sizeof(char)*strlen(name)/2+1);
for(unsignedinti=0,j=0;
i<
(strlen(name)/2);
++i)
memset(chr,0x00,sizeof(chr));
chr[0]=name[j++];
chr[1]=name[j++];
chr[2]='
wchr=0;
wchr=(chr[0]&
0xff)<
<
8;
wchr|=(chr[1]&
0xff);
Spell[i]=convert(wchr);
returnSpell;
voidsearch(FInfoListFhead)
{
charnamekey[8];
chartelephonekey[12];
charnamespell[5];
intm;
\n请选择(1:
按姓名查找2:
按姓名首字母拼音查找3:
按电话查找):
"
scanf("
%d"
m);
if(m==1)
\n请输入要查找的姓名:
%s"
namekey);
intflag=0;
//判断是否找到
inti=0,count=0;
charnum[20][5];
while(p)
{
if(strcmp(namekey,p->
FInfo.Fname)==0)
{
flag=1;
strcpy(num[i],p->
FInfo.Fnum);
i++;
count++;
}
p=p->
}
if(flag==0)printf("
\n对不起,通讯簿中没有此人的记录。
\n"
if(flag==1)
\n已查到%d条记录,分别为:
\n\n"
count);
p=Fhead->
i=0;
printf("
编号\t姓名\t性别\t生日\t电话号码1\t电话号码2\n\n电话号码3\t住址\t分组\n\n"
while(p)
if(strcmp(num[i],p->
FInfo.Fnum)==0)
{
printf("
%s\t%s\t%s\t%s\t%s\t%s\n\n%s\t%s\t%d\n"
}
p=p->
elseif(m==3)
\n请输入要查找的电话号码:
telephonekey);
if(strlen(telephonekey)==11)
while(p&
strcmp(telephonekey,p->
FInfo.telephone1)!
=0&
FInfo.telephone2)!
=0)p=p->
if(strlen(telephonekey)==8)
FInfo.telephone3)!
if((p==NULL))printf("
if((p!
=NULL))
\n已查到,记录为:
elseif(m==2)
\n输入要查找联系人的姓名缩写:
namespell);
if(strcmp(namespell,TransformToSpell(p->
FInfo.Fname))==0)
⑤修改通讯录成员信息
/*修改模块modify():
在通讯录中修改某人通讯信息的子函数*/
voidmodify(FInfoListFhead)
charch;
charkind[10],NewInfo[15];
\n没有找到要修改的通讯者!
charnum2[5];
\n请输入所要修改的通讯者的编号:
scanf("
num2);
if(strcmp(num2,p->
\n真的要修改该结点吗?
(是:
y否:
n):
scanf("
ch);
while(ch=='
)
{
inti=0,n;
intflag=0;
printf("
\n请输入所需修改的信息类别:
s