杨惠明数据结构课程设计通讯录的制作.docx
《杨惠明数据结构课程设计通讯录的制作.docx》由会员分享,可在线阅读,更多相关《杨惠明数据结构课程设计通讯录的制作.docx(18页珍藏版)》请在冰豆网上搜索。
![杨惠明数据结构课程设计通讯录的制作.docx](https://file1.bdocx.com/fileroot1/2022-11/21/35981bed-d8e3-4c53-89da-dfc22de3a00d/35981bed-d8e3-4c53-89da-dfc22de3a00d1.gif)
杨惠明数据结构课程设计通讯录的制作
数据结构课程设计
报告
班级:
11计算机3班
学号:
11103841
姓名:
杨惠明
指导老师:
涂立静
信息与计算机学院
二○一三年六月
1课程设计题目和内容
题目:
通讯录的制作
内容:
1) 每条信息至少包含:
姓名(NAME)街道(STREET)城市(CITY)邮编(EIP)国家(STATE)几项
2) 作为一个完整的系统,应具有友好的界面和较强的容错能力
3) 上机能正常运行,并写出课程设计报告
2总体设计
用〈〈数据结构〉〉中的双向链表作数据结构,结合C语言基本知识。
编写一个通讯录管理系统。
以把所学数据结构知识应用到实际软件开发中去。
设计内容:
本系统应完成一下几方面的功能:
1) 输入信息——enter();
2) 显示信息———display();
3) 查找以姓名作为关键字———search();
4) 删除信息———delete();
5) 存盘———save();
6) 装入———load();
3系统流程图
系统功能模块图如下:
4详细设计及测试
结构体:
structrecord
{
charname[20];
charstreet[20];
charcity[20];
chareip[20];//邮编
charstate[20];
}people[500];//500个记录,可修改
structpnode
{
recorddata;
structpnode*next,*prior;//双循环链表
};
typedefpnode*linklist;
函数目录表:
voidmainmenu();//主菜单
voidsearchmenu();//查询菜单
voidenter();//添加新纪录
voidsearch();//按条件搜索记录
voiddisplay();//显示全部记录
voidload();//载入文件
voidsave();//写入文件
voiddel();//删除记录
voidlistinsert();//插入结点函数
voidinitlist();//初始化链表函数
主程序与各模块的调用关系:
voidmain()//主函数
{
initlist();//初始化链表
load();//载入文件
listinsert();//增设新节点
while
(1)
mainmenu();//进入主菜单,有非法输入仍停留在主菜单
}
voidmainmenu()//主菜单
{菜单界面;
printf("%c",ch=getch());
switch(ch)
{
case'1':
enter();break;
case'2':
searchmenu();break;
case'3':
del();break;
case'4':
save();break;
case'5':
exit(0);
default:
mainmenu();
}
}
voidsearchmenu()//查询菜单
{查询菜单;
printf("%c",ch=getch());
switch(ch)
{
case'1':
display();break;
case'2':
search();break;
case'3':
mainmenu();break;
}
}
链表初始化:
voidinitlist()//链表初始化函数
{
l=(linklist)malloc(sizeof(pnode));//动态申请内存
l->next=l;
l->prior=l;
}
载入可能存在的通讯录文件:
voidload()//装载已有文件信息
{//无文件,新建立文件
……;
……;
//已有文件,导入文件
……;
……;
}
增加新节点:
voidlistinsert()//增加新结点
{//插入新结点,读入内存信息
……;
……;
}
增加新记录:
voidenter()//添加新纪录
{//信息输入
……;
……;
//是否继续添加?
……;
……;
}
按姓名查找:
voidsearch()
{//输入姓名
……;
……;
//输出查询结果
……;
……;
//检索可能的重名纪录
……;
……;
}
显示所有的记录:
voiddisplay()//显示所有纪录
{//显示内存中的所有记录
……;
……;
}
删除指定的记录:
voiddel()//删除纪录
{//输入要删除的姓名
……;
……;
//查找符合条件的记录,对于每条记录询问是否删除;
//满足条件的输出结束,询问是否删除其他记录,循环
……;
……;
}
保存到磁盘文件:
voidsave()//
{//写入文件操作
……;
……;
}
5部分调试界面
6心得和总结
1.总结:
这次的程序实设计实验是对我们进入大学以来学习程序设计语言结果的一次大检验。
自己动手,自己发现和解决问题。
发现了自己的许多不足。
平时没有掌握好的知识在这次实验中彻底暴露出来,经过不断思考,不断查阅资料和上机运行,解决其中大部分问题,当然还存在一些问题没有解决。
我相信在以后的学习能够解决好它们。
但是,收获还是不小的,我不仅对C的操作有了进一步的掌握,还了解到了程序设计的书写风格及其注释的格式。
2、心得体会:
体会就是书上和老师教的东西是有限的,我们需要不断的靠自己去学习,向他人请教,了解和掌握更多的知识,这样我们才能编出更加好的C程序,程序编写之前的需求分析,至关重要,将关系到这整个项目的成败。
7源程序清单
#include
#include
#include
#include
structrecord
{
charname[20];
charstreet[20];
charcity[20];
chareip[20];//邮编
charstate[20];
}people[500];//500个记录,可修改
structpnode
{
recorddata;
structpnode*next,*prior;//双循环链表
};
typedefpnode*linklist;
linklistl;
intlen=0;//链表长度
FILE*fp;//文件指针
voidmainmenu();//主菜单
voidsearchmenu();//查询菜单
voidenter();//添加新纪录
voidsearch();//按条件搜索记录
voiddisplay();//显示全部记录
voidload();//载入文件内容
voidsave();//写入文件
voiddel();//删除记录
voidlistinsert();//插入结点函数
voidinitlist();//初始化链表函数
voidmain()//主函数
{
initlist();
load();
listinsert();
while
(1)
mainmenu();//进入主菜单,有非法输入仍停留在主菜单
}
voidinitlist()//链表初始化函数
{
l=(linklist)malloc(sizeof(pnode));//动态申请内存
l->next=l;
l->prior=l;
}
voidload()//装载已有文件信息
{
if((fp=fopen("txl.txt","rb"))==NULL)
{
printf("\n\t\t通讯录文件不存在");
if((fp=fopen("txl.txt","wb"))==NULL)
{
printf("\n\t\t建立失败");
exit(0);
}
else
{
printf("\n\t\t通讯录文件已建立");
printf("\n\t\t按任意键进入主菜单");
getch();
return;
}
exit(0);
}
//导入文件功能部分
fseek(fp,0,2);
if(ftell(fp)>0)
{
rewind(fp);
for(len=0;!
feof(fp)&&fread(&people[len],sizeof(structrecord),1,fp);len++);
printf("\n\t\t文件导入成功");
printf("\n\t\t按任意键返回主菜单");
getch();
return;
}
printf("\n\t\t文件导入成功");
printf("\n\t\t通讯录文件中无任何纪录");
printf("\n\t\t按任意键返回主菜单");
getch();
return;
}
voidlistinsert()//增加新结点
{
linklists,p=l;
for(inti=0;i{
s=(linklist)malloc(sizeof(pnode));
strcpy(s->data.name,people[i].name);
strcpy(s->data.city,people[i].city);
strcpy(s->data.street,people[i].street);
strcpy(s->data.eip,people[i].eip);
strcpy(s->data.state,people[i].state);
s->prior=p->prior;
s->next=p;
p->prior->next=s;
p->prior=s;
p=p->next;
}
}
voidmainmenu()//主菜单
{
charch;
system("cls");
printf("\n\t\t***************欢迎进入通讯录系统***************");
printf("\n\t\t******************1-新添纪录***************");
printf("\n\t\t******************2-查找联系人***************");
printf("\n\t\t******************3-删除联系人***************");
printf("\n\t\t******************4-保存***************");
printf("\n\t\t******************5-退出***************");
printf("\n\t\t************************************************");
printf("\n\t\t请选择:
");
printf("%c",ch=getch());
switch(ch)
{
case'1':
enter();break;
case'2':
searchmenu();break;
case'3':
del();break;
case'4':
save();break;
case'5':
exit(0);
default:
mainmenu();
}
}
voidenter()//添加新纪录
{
printf("\n\t\t****************请输入学生信息****************\n");
printf("\n\t\t姓名:
");
scanf("%s",&people[len].name);
printf("\n\t\t街道:
");
scanf("%s",&people[len].street);
printf("\n\t\t城市:
");
scanf("%s",&people[len].city);
printf("\n\t\t邮编:
");
scanf("%s",&people[len].eip);
printf("\n\t\t国家:
");
scanf("%s",&people[len].state);
len++;
printf("\n\t\t是否继续添加?
(Y/N):
");
if(getch()=='y')
enter();
return;
}
voidsearchmenu()//查询菜单
{
charch;
system("cls");
printf("\n\t\t*******************查询菜单*******************");
printf("\n\t\t****************1-显示所有记录****************");
printf("\n\t\t****************2-按姓名查询****************");
printf("\n\t\t****************3-返回主菜单****************");
printf("\n\t\t************************************************");
printf("\n\t\t请选择:
");
printf("%c",ch=getch());
switch(ch)
{
case'1':
display();break;
case'2':
search();break;
case'3':
mainmenu();break;
}
}
voidsearch()
{
printf("\n\t\t*****************按姓名查找*******************");
charname[20];
printf("\n\t\t请输入姓名:
");
scanf("%s",name);
printf("查询到的信息:
\n");
printf("%-18s%-18s%-18s%-15s%s\n","姓名","街道","城市","邮编","国家");//格式控制输出
printf("-----------------------------------------------------------------------------\n");
for(inti=0;i{
if(strcmp(name,people[i].name)==0)
printf("%-18s%-18s%-18s%-15s%s\n",people[i].name,people[i].street,people[i].city,people[i].eip,people[i].state);
if(i+1}
printf("-----------------------------------------------------------------------------\n");
printf("\n\t\t按任意键返回查询菜单");
getch();
searchmenu();
}
voiddisplay()//显示所有纪录
{
inti;
system("cls");
if(len!
=0)
{
printf("\n\t\t***************以下为通讯录所有信息************\n\n");
printf("%-18s%-18s%-18s%-15s%s\n","姓名","街道","城市","邮编","国家");
printf("-----------------------------------------------------------------------------\n");
for(i=0;i{
printf("%-18s%-18s%-18s%-15s%s\n",people[i].name,people[i].street,people[i].city,people[i].eip,people[i].state);
if(i+1}
printf("-----------------------------------------------------------------------------\n");
}
else
printf("\n\\tt通讯录中无任何纪录");
printf("\n\t\t按任意键返回查询菜单:
");
getch();
searchmenu();
}
voiddel()//删除纪录
{
inta=0,i,j,findmark;//findmark为查找结果标志
//intfindmark=0,delmark=0;
charname[20];
printf("\n\t\t请输入要删除学生姓名:
");
scanf("%s",name);
for(i=a;i{
if(findmark=strcmp(people[i].name,name)==NULL)//找到一条符合条件的记录
{
//findmark++;
printf("\n\t\t以下是您要删除的学生纪录:
\n");
printf("%-18s%-18s%-18s%-15s%s\n","姓名","街道","城市","邮编","国家");
printf("-----------------------------------------------------------------------------\n");
printf("%-18s%-18s%-18s%-15s%s\n",people[i].name,people[i].street,people[i].city,people[i].eip,people[i].state);printf("-----------------------------------------------------------------------------\n");
printf("\n\t\t是否删除?
(y/n)");
if(getch()=='y')
{
for(j=i;jpeople[j]=people[j+1];
len--;
i--;
//delmark++;
printf("\n\t\t删除成功");
if((i+1){
printf("\n\t\t是否继续删除相同姓名的同学信息?
(y/n)");//是否删除同名纪录
if(getch()=='y')
{
a=i;
continue;//删除上一条记录之后搜索是否有同名纪录
}
}
}//endif
if((i+1){
printf("\n\t\t是否继续删除相同姓名的同学信息?
(y/n)");//不删前一条纪录,删当前纪录
if(getch()=='y')
{
a=i;
continue;
}
}
}//endif
else
continue;
}//endfor
if(!
findmark)//没有找到任何符合条件的记录
printf("\n\t\t没有符合条件的记录!
");
printf("\n\t\t是否继续删除?
(y/n)");//无同名纪录,是否继续删除其他纪录
if(getch()=='y')
del();//继续删除其他纪录
}
voidsave()//写入文件
{
inti;
if((fp=fopen("txl.txt","wb"))==NULL)
{
printf("\n\t\t文件打开失败");
}
for(i=0;i{
if(fwrite(&people[i],sizeof(structrecord),1,fp)!
=1)
printf("\n\t\t写入文件错误!
\n");
}
fclose(fp);//关闭文件指针
printf("\n\t\t通讯录文件已保存,按任意键继续...");
getch();
return;
}