以双向链表为算法结构的通讯录的制作的实践报告.docx
《以双向链表为算法结构的通讯录的制作的实践报告.docx》由会员分享,可在线阅读,更多相关《以双向链表为算法结构的通讯录的制作的实践报告.docx(20页珍藏版)》请在冰点文库上搜索。
以双向链表为算法结构的通讯录的制作的实践报告
西安财经学院
实践教学活动周登记表
姓名:
龚雨
学号:
1305170125
专业:
计算机科学与技术
院系:
信息学院
指导教师:
刘通
日期:
实验实训教学管理中心制
实践教学开展时间
2015年1月12日——2015年1月23日
实践形式(在选项后打√)
集中
分散
√
实践单位或地点
指导教师
刘通
职称
讲师
二级学院、系
信息学院计算机系
实践内容及收获(后附实践教学成果)
本次实践活动以算法实践为主。
意在巩固计算机知识,熟练掌握算法操作。
在掌握算法的基础上,能自主编写程序实现具体操作。
本次实践以实践报告的形式呈现出来。
本次的实践学习是一次很有意义的活动。
我在查询一系列的资料和理论的同时也对《数据结构》这门课程的一系列指示进行了深入的复习,把以前不会和模糊的知识弄清楚。
其次,这次的实践报告需要一个人完成,这也锻炼我独立思考的能力,提高了我的分析层次。
虽然完成的过程很艰难,很多次想过放弃,但最终坚持了下来。
我体会到了独立一个人成功的喜悦,体会到了学习的乐趣。
在以后的学习生活中,我会秉承谨慎严谨的专业态度,努力认真。
在生活中我也会保持乐观积极的态度。
我相信我会变得越来越好。
成绩
评定
成绩:
指导教师签字:
2015年月日
系意见
签字(盖章):
2015年月日
二级学院意见
签字(盖章):
2015年月日
:
本科生实践教学活动周实践教学成果
成果形式:
实践报告
成果名称:
以双向链表为算法结构的通讯录的制作的实践报告
学生姓名:
龚雨
学号:
1305170125
专业:
计算机科学与技术
班级:
计本1301班
指导教师:
刘通
完成时间:
2015年1月23日
以双向链表为算法结构的通讯录的制作的实践报告
一、实践的目的
灵活运用《数据结构》中的双向链表的知识,并结合C语言知识来实现通讯录的制作,是为了研究算法的应用。
(1)有利于我们把所学的数据结构和算法的基本知识扎实的掌握,并初步掌握设计的基本方法,初步完成书本知识和生活实践的结合,把知识生活化,而不是专业化。
(2)培养计算机知识学习人员的专业设计能力和动手能力,在实践的过程中提高设计人员的知识素养和涵养,学习分析和编写程序的能力。
在一定的程度上,也锻炼参与者的应变能力和独立思考和作业的习惯。
通过实践教学,能够使我们深入社会,深入实践,使学生熟悉实际工作,使理论与实践能够密切结合,培养我们分析和解决问题的综合能力以及扎实朴素的工作作风;同时通过实践教学这个环节,促进教学方法的改进,从而不断提高教学质量,培养高质量的合格人才。
二、实践教学的内容
(一)、算法的内容:
包括文件的载入、信息的输入、显示、以关键字查找、删除、存盘。
(二)、算法的流程图如下:
(三)、各个算法的内容、应用领域以及作用:
1、双向链表的初始化:
voidinitlist()//链表初始化函数
{
L=(linklist)malloc(sizeof(pnode));//动态申请内存
L->next=L;
L->prior=L;
}
双向链表的初始化:
运用链表初始化函数initlist是为了申请动态空间(有动态和静态之分,本文用得是动态申请内存)。
初始化在顺序表和单链表中同样必需。
2、装入:
voidload()//装载已有文件信息
{//无文件,新建立文件
……;
……;
//已有文件,导入文件
……;
……;
}
装入:
如果原本没有文件,就需要用建立新文件,然后再装入。
为接下来的操作打下基础。
3、插入新结点:
voidlistinsert()//增加新结点
{q=(DuLinkList)malloc(sizeof(DuLNode));//插入新结点q,
q->data=e;//读出内存信息
q->prior=p->prior;
q->next=p;
p->prior->next=q;
p->next=q;
}
插入算法:
插入新结点读出结点内存信息。
4、输入新信息:
voidenter()//添加新纪录
{intp=0,l=1;//信息输入
charch[11];
charn;
cout<<”请输入信息”}
5、查找:
voidsearch()
{char*pw;
intbInWord,i;
intistart,iend;
charatemp[20];//输入关键字
pw=s1;s3[0]='\0';//输出查询结果
while(*pw!
='\0'){
bInWord=0;
for(i=0;pw[i]!
='\0';i++){
if(pw[i]!
=''&&bInWord==0){bInWord=1;istart=i;}
elseif(pw[i]==''&&bInWord==1) {iend=i; break;}
}
if(pw[i]=='\0'&&bInWord==1)iend=i;
if(bInWord==1){
strncpy(atemp,pw+istart,iend-istart);
atemp[iend-istart]='\0';
//puts(s3);
char*pfind;
if((pfind=strstr(s2,atemp))!
=NULL){//finde;
……;//检索可能的重名纪录
}
6、显示所有记录:
voiddisplay()//显示所有纪录
{//显示内存中的所有记录
……;
……;
}
7、删除指定信息:
voiddel()//删除纪录
{//输入要删除的姓名
……;
……;
//查找符合条件的记录,对于每条记录询问是否删除;
//满足条件的输出结束,询问是否删除其他记录,循环
……;
……;
}
8、保存到磁盘文件:
voidsave()//
{//写入文件操作
……;
}
注:
以上各个算法的内容仅是举例,只是为更好说明各个算法的具体作用,与本次报告内容并不相关。
(四)、分析:
经过反复测试,最终提供了一个较为友好的界面和操作模式,而且容错能力较好,稳定性很强。
下面做一些简单的说明:
1、2级菜单只是作为一种尝试,并非必须!
2、在界面排版上,我学习了互联网上部分程序的界面编排,其中以格式控制方式显示提高了界面显示的稳定性,较为理想。
3、在文件读取和保存方面,该程序做到了实时保存保存和读取,操作非常简便。
4、在查找方面,我将其设计为一次多记录的显示方式,也更合乎操作习惯,界面较为友好,对于无符合条件的结果,只是结果集为空,界面保持不变。
同时,它是实时读取的,可以将刚刚输入而未保存的记录也读取到!
另外,一次查询结束后返回的是查询菜单,可以直接进行下一次的查询,也较为合理。
5、删除功能我做了较多的工作,整体界面和设计都较为合理。
对于输入的姓名,查找出结果后提示是否删除。
若有重名,则会二次显示,提示是否删除,一直到所有记录查询结束(可以在重名中选中需要的进行删除,并不需要删除每一个纪录)。
结束之后可以直接再次删除其他纪录,因为它提供循环删除操作功能。
(五)、程序源代码:
#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\t\t通讯录中无任何纪录");
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