C++电话本双向链表.docx
- 文档编号:30692957
- 上传时间:2023-08-19
- 格式:DOCX
- 页数:50
- 大小:606.73KB
C++电话本双向链表.docx
《C++电话本双向链表.docx》由会员分享,可在线阅读,更多相关《C++电话本双向链表.docx(50页珍藏版)》请在冰豆网上搜索。
C++电话本双向链表
南京理工大学VC++课程设计报告
课程:
VC++课程设计
系别:
计算机科学与计算机学院
班级:
学号:
姓名:
选题2名称:
同学录系统
选题2难度系数:
A
自报成绩:
优秀
起止时间:
8.23-11.30
指导教师:
陆建峰
日期:
2010年9月24日
目录
一、课题目标
1.1程序功能简介
1.2课程设计要求
1.3评定难易级别
二、具体实现
2.1程序总体方案
2.1.1开发平台
2.1.2程序结构或流程图
2.2关键代码及注释
三、程序截图
四、调试报告
(在设计和实现过程所遇到的问题和解决,请如实填写)…
五、总体小结
(在整个设计过程中的心得体会)
六、分工介绍
(是独立完成还是合作完成,若为合作完成,说明合作者以及之间的具体分工)…
一、课题目标
1.1程序功能简介
此程序是一个简单的同学录系统,具有导入同学信息,存储,显示、新增、删除、查询、修改同学信息等功能,最主要的是,它是用双向链表实现的,所以新增和删除的效率非常的高。
其菜单分为:
显示所有同学录信息、新增一个同学录信息、删除一个同学录信息、查询系统、修改同学录信息,寻求帮助等。
1.2课程设计要求
用双向链表完成一个同学录系统
实现同学录所该有的功能,并方便用户的使用!
1.3评定难易级别
A组
二、具体实现
2.1程序总体方案
2.1.1开发平台
操作系统:
Windows7
开发工具:
visualstudio2010
2.1.2程序结构或流程图
主函数的流程图:
2.2所做改进
2.2.1改进一
2.2.1.1改进方案
基本上这个程序都是自己写的,改进也只是对原有要求的添加而已。
先说说这个程序怎么实现所有功能的吧。
2.2.1.2具体实现
进入程序,首先是读取txt文件的信息,然后显示的是菜单。
再然后一目了然的有各种功能。
总体是用双向链表做的。
新增结点信息:
即添加一个链表结点信息。
显示所有信息:
是先根据学号排序,然后从头至尾分屏显示所有信息,链表依次读取。
删除操作:
即链表操作,删除一个结点.
查询操作:
按要求进行各种情况查询,总体思想是线性的比较,如果有匹配的字符串就输出(这里面用的是string.find函数)。
修改同学录:
先根据查找操作找到这个信息,再修改当前结点信息
寻求帮助:
作为一些运用该程序的说明而存在。
可以对用户一些较常见的疑问做出回答。
退出程序:
退出前会保存所有的信息至txt文件。
2.2.2改进二
2.2.2.1改进方案
为了使我的查询更完善,我的程序做到了部分字符串匹配的查询方式,即比如在输入姓名查询的时候,如果输入的是姓名的姓或者名,那么与之匹配的所有信息都会显示,而不是显示结果不存在。
同样的,还可以根据自己一开始对该同学的评价做查询。
另外,我设置了帮助选项,可以为用户解答很多常见的疑问。
可以方便用户。
2.2.2.2具体实现
运用STLstring类里面的find()函数;把我的成员全都定义成string类的,最后再让用户输入所需查找的字符串(也是一个string类),然后从到之为用find函数查,如njust[i].name.find(temp)!
=string:
:
npos;则加入到输出。
在所有的查询方式里使用相同的方法,即可实现,所有的查询都带有子串查找功能。
STL确实方便
三、程序运行截图
进入程序:
进入菜单:
分屏显示
查询界面:
修改同学录信息:
帮助界面:
四、调试报告
调试还算顺利,只是一开始容错方面做得比较简陋。
后来改好了。
再又就是一开始功能比较少,后来慢慢一步步完善,变成现在这样,还算可以用用的程序。
五、总体小结
经过这么多天的编程,我了解到了要想完成一个比较大的程序,需要先根据程序的要求,确定设计思路,画出流程图,把想要用到的函数都写出其函数原型说明。
然后根据自己已经写好的函数原型说明。
一步步把函数都实现。
即分别写出每一个功能所需要的具体的函数。
这样,有一个清晰的思路,就比较有调理,有了调理,也不容易忘记一些想要实现的东西。
然后,才会有一个层次分明,客户友好的程序。
另外,类的封装和双向链表弄起来还是比较繁琐的。
但是,把问题一个个搞清楚以后,问题就自然而然的被简化了。
另外编程序还要注重细节,任意一个看似细微的的错误,都可能会引起一连串的error,所以每次从键盘读入数据或者数据的处理的环节都要注意合法性的检查。
最后不得不提的是,我加入ACM队,在暑假做了大量的题目联系,所以在调试方面没有出现什么打问题,都算是比较轻松的过关了。
熟练的写程序,对我们着实是非常重要的!
六、分工介绍
独立完成。
#pragmaonce
#include"student.h"
structnode//链表node结点
{
student&stu;
node*next;
node*prev;
node(student&s)
:
stu(s)
{
}
};
classguanli
{
public:
node*head_ptr;
node*tail_ptr;
node*current_ptr;
guanli(void);
~guanli(void);
voidUserChoice(int);//用户选择
voidInsertRecord();//插入信息
voidInsertNode(node*);//插入新结点
voidInsertNodeAtHead(node*);//插入头结点
voidInsertNodeAtEnd(node*);//插入尾结点
voidShowList();//显示所有信息
voidShowSortedList1();//显示排序后链表1
voidShowSortedList2();//显示排序后链表2
voidDeleteRecord();//删除某条记录
voidDeleteNodeAtHead();//删除头结点
voidDeleteNodeAtEnd();//删除尾结点
voidDeleteNodeAtMiddle();//在中间删除
voidDeleteNode();//删除某个节点
voidChangeMes();//修改信息函数
boolVerifyDelete();//确认删除
voidDeleteList();//释放链表,保存至文件
voidSearchChoice();//选择查找方式
voidASearchByName();//A方式中的名字查找
voidASearchByStuNum();//A方式中的学号查找
voidASearchByDormNum();//A方式中的整个宿舍查找
voidBSearchByStuNum();//B方式,按学号显示个人详细信息
voidLoadFile();//读取文件
voidSaveFile();//存至文件
voidHelp();//帮助提示函数
voidUserInput();//用户输入备用
};
#include"guanli.h"
#include
usingnamespacestd;
guanli:
:
guanli(void)
{
}
guanli:
:
~guanli(void)
{
}
voidguanli:
:
UserChoice(intt)
{
switch(t)
{
case0:
InsertRecord();//添加结点(OK)
break;
case1:
ShowList();//显示所有结点信息(OK)
break;
case2:
DeleteRecord();//删除记录(OK)
break;
case3:
SearchChoice();//查找记录(OK)
break;
case4:
ChangeMes();
break;
case5:
Help();//帮助文件
break;
case6:
SaveFile();
if(head_ptr!
=NULL)
DeleteList();
break;
default:
cout<<"选择无效,请重新输入:
";
break;
}
}
voidguanli:
:
InsertRecord()
{
chartt[15];
chartemp_memory[300];
student*s=newstudent;
node*new_ptr=newnode(*s);
if(new_ptr!
=NULL)
{
system("cls");
cout<<"同学姓名:
";
cin>>new_ptr->stu.fri_name;
cout<<"邮箱:
";
cin>>new_ptr->stu.e_mail;
cout<<"性别:
";
cin>>new_ptr->stu.sex;
cout<<"电话号码:
";
cin>>new_ptr->stu.phone_num;
cout<<"珍贵回忆有(请输入一句话,不含空格,可用逗号分隔):
";
cin>>new_ptr->stu.memory;
InsertNode(new_ptr);
cin.ignore(20,'\n');
cout<<"是否继续添加?
Y/N"< charte[30]; cin.getline(te,30); if(! strcmp(te,"Y")||! strcmp(te,"y"))InsertRecord(); } else cout<<"申请内存空间失败,不能创建新结点! ! \n"; //system("cls"); } voidguanli: : InsertNode(node*new_ptr) { //system("cls"); node*temp_ptr; //若链表为空 if(head_ptr==NULL) { new_ptr->next=new_ptr; new_ptr->prev=new_ptr; head_ptr=new_ptr; tail_ptr=new_ptr; return; } //只有一个节点 if(head_ptr->next==head_ptr) { if(new_ptr->stu.fri_name InsertNodeAtHead(new_ptr); else InsertNodeAtEnd(new_ptr); return; } //多个节点,自动按姓名排序插入 if(head_ptr->next! =head_ptr) { current_ptr=head_ptr->next; while((new_ptr->stu.fri_name>current_ptr->stu.fri_name)//比较姓名进行排序 &&(current_ptr! =head_ptr))//并且当前结点不是头结点(双向链表的头尾是相连的) current_ptr=current_ptr->next;//继续向后拓展结点 if(current_ptr==head_ptr) InsertNodeAtEnd(new_ptr);//插入在链表尾 else { temp_ptr=current_ptr->prev;//此时,插入的结点在current结点和temp结点之间 temp_ptr->next=new_ptr; new_ptr->prev=temp_ptr; current_ptr->prev=new_ptr; new_ptr->next=current_ptr; } } } voidguanli: : InsertNodeAtEnd(node*new_ptr) { new_ptr->next=head_ptr; tail_ptr->next=new_ptr; new_ptr->prev=tail_ptr; head_ptr->prev=new_ptr; tail_ptr=new_ptr; } voidguanli: : InsertNodeAtHead(node*new_ptr) { new_ptr->next=head_ptr; new_ptr->prev=tail_ptr; head_ptr->prev=new_ptr; tail_ptr->next=new_ptr; tail_ptr=new_ptr; } #include"guanli.h" #include #include usingnamespacestd; voidguanli: : ShowList() { system("cls"); intn; cout<<"\t\t\t下面将显示所有同学录信息\n\n\t\t\t请输入每屏幕显示学生的个数\n\n\t\t\t每显示一屏幕暂停一次\n\n\t\t\t输入的数不大于20: \n"; cin>>n; system("cls"); inti; current_ptr=head_ptr; if(current_ptr! =NULL) do { i=1; cout< do { cout< cout< current_ptr=current_ptr->next; i++; }while(current_ptr! =head_ptr&&i<=n); cout< if(current_ptr! =head_ptr) { system("pause"); system("cls"); } elsecout<<"文件结束! "< }while(current_ptr! =head_ptr); else { cout<<"同学录为空! "< } system("pause"); system("cls"); } voidguanli: : SearchChoice() { charn; cout< "< cout<<"\t\t\t1: 姓名查询"< cout<<"\t\t\t2: 姓名缺省查询(姓氏,名字部分查询)"< cout<<"\t\t\t3: 记忆片段查询"< cout<<"\t\t\t4: 退出查询"< cout<<"输入你的选择: "< cin>>n; while(n! ='4') { switch(n) { case'1': ASearchByStuNum(); break; case'2': ASearchByName(); break; case'3': ASearchByDormNum(); break; default: cout<<"对不起,您输入的查询方式尚未做出,请重新输入: "; break; } cout<<"输入0显示菜单,输入5退出查询,其他任意键继续查询: "< charpp; cin>>pp; if(pp=='0') { cout< "< cout<<"\t\t\t1: 姓名查询"< cout<<"\t\t\t2: 姓名缺省查询(姓氏,名字部分查询)"< cout<<"\t\t\t3: 记忆片段查询"< cout<<"\t\t\t4: 退出查询"< cout<<"输入你的选择: "< cin>>n; } elseif(pp=='4')n='4'; system("cls"); } } voidguanli: : ASearchByStuNum() { system("cls"); boolnFlag=0; stringsearch_str; current_ptr=head_ptr; if(current_ptr==NULL) cout<<"学生记录为空"< else { cin.ignore(20,'\n'); cout<<"\n输入你要搜索的同学姓名: "; cin>>search_str; if(current_ptr->stu.fri_name==search_str) { nFlag=1; cout<<"姓名: "< "< cout<<"\t电话: "< "< cout<<"珍贵回忆: \n"< } else { current_ptr=current_ptr->next; while(current_ptr! =head_ptr) { if(current_ptr->stu.fri_name==search_str) { nFlag=1; cout<<"姓名: "< "< cout<<"\t电话: "< "< cout<<"珍贵回忆: \n"< break; } current_ptr=current_ptr->next; } } if(! nFlag)//搜索完所有结点都没发现 { cout<<"无记录! "< system("pause"); system("cls"); } } } voidguanli: : ASearchByName() { system("cls"); boolnFlag=0; stringsearch_str; current_ptr=head_ptr; if(current_ptr==NULL) cout<<"同学录为空"< else { cin.ignore(20,'\n'); cout<<"\n输入你要搜索的同学的姓或名或其中的一部分: "; cin>>search_str; if(current_ptr->stu.fri_name.find(search_str)! =string: : npos) { if(! nFlag)cout<<"找到记录\n"; nFlag=1; cout<<"姓名: "< "< cout<<"\t电话: "< "< cout<<"珍贵回忆: \n"< } current_ptr=current_ptr->next; while(current_ptr! =head_ptr) { if(current_ptr->stu.fri_name.find(search_str)! =string: : npos) { if(! nFlag)cout<<"找到记录\n"; nFlag=1; cout<<"姓名: "< "< cout<<"\t电话: "< "< cout<<"珍贵回忆: \n"< } current_ptr=current_ptr->next; } if(! nFlag)//搜索完所有结点都没发现 { cout<<"无记录! "< system("pause"); system("cls"); } } } voidguanli: : ASearchByDormNum() { system("cls"); boolnFlag=0; stringsearch_str; current_ptr=head_ptr; if(current_ptr==NULL) cout<<"学生记录为
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C+电话本 双向链表 C+ 电话本 双向