C++课程设计双向链表课程设计报告.docx
- 文档编号:2382177
- 上传时间:2023-05-03
- 格式:DOCX
- 页数:26
- 大小:349.12KB
C++课程设计双向链表课程设计报告.docx
《C++课程设计双向链表课程设计报告.docx》由会员分享,可在线阅读,更多相关《C++课程设计双向链表课程设计报告.docx(26页珍藏版)》请在冰点文库上搜索。
C++课程设计双向链表课程设计报告
****大学
VC++课程设计报告
课程:
VC++课程设计
系别:
计算机科学与计算机学院
班级:
*********
学号:
***********
姓名:
njust_smalllion
选题名称:
双向链表
选题难易级别:
A级
起止时间:
2010年9月13日~2010年9月16日
指导教师:
ZY
一、课题目标
1.1程序功能简介
1.2课程设计要求
1.3评定难易级别
二、具体实现
2.1程序总体方案
2.1.1开发平台
2.1.2程序结构或流程图
2.2改进方案
2.2.1改进一
2.2.1.1改进方案
2.2.1.2具体实现
2.2.2改进二
2.2.2.1改进方案
2.2.2.2具体实现
2.2.3改进三
2.2.3.1改进方案
2.2.3.2具体实现
2.3调试结果
三、调试报告
在设计和实现过程所遇到的问题和解决
四、总体小结
在整个设计过程中的心得体会
五、分工介绍
两人合作
一、课题目标
1.1程序功能简介
原程序定义了模版数据类型的双向链表类型,并定义了链表的插入,删除和输出操作的成员函数。
1.2课程设计要求
(1)在原程序的基础上扩充双向链表的功能,增加排序插入,根据数据查找结点及修改结点数据等功能。
(2)将结点据数据改成通讯录中的一个纪录,增加年龄,姓名,电话等数据;并能根据姓名进行向前或向后查找,链表根据姓名排序。
(3)可以修改某个结点,即修改其中的年龄和电话字段,修改时新旧记录要同时显示在屏幕上,新纪录按“确认”键后才替代旧记录,否则取消修改操作。
(4)将通讯录以文件的形式存在磁盘上,每次操作时将通讯录调出,操作完毕后存盘。
(5)完善主函数,使主菜单更加详尽完备。
(6)完成类的封装。
(7)增加模糊匹配的功能。
1.3评定难易级别
A级
二、具体实现
2.1程序总体方案
2.1.1开发平台
操作系统:
WindowsXP
开发工具:
VC++6.0
2.1.2程序结构或流程图
2.2改进方案
2.2.1改进一
2.2.1.1改进方案
完成类的封装
2.2.1.2具体实现
template
classNode//结点类
{
friendclassDoubleLinkList
private:
NodeTypeData;//结点数据
Node
Node
public:
Node();//默认的构造函数
Node(Telephone&Value);//拷贝的构造函数
voidprint()//输出结点数据
{
cout<<""<<"姓名:
"< : left)< cout<<"电话号码: "< : left)< "< : left)< } ~Node();//析构函数 }; template classDoubleLinkList//双向链表类 { private: Node Node public: DoubleLinkList();//缺省构造函数 ~DoubleLinkList();//析构函数 boolIsEmpty();//判断是否为空链表 voidInsertAtFront(Telephone&Value);//将结点插入到链表头 voidInsertAtRear(Telephone&Value);//将结点插入到链表尾 voidInsertAtMiddle(Telephone&Value);//将结点插入到链表中间 boolRemoveFromFront();//删除链表头结点 boolRemoveFromRear();//删除链表尾结点 boolRemoveFromMiddle();//删除链表中间结点 voidTraverseForward();//从前往后输出链表中的结点数据 voidTraverseBackwards();//从后往前输出链表中的结点数据 intLenghtOfDoubleLinkList();//返回链表结点个数 voidAddNode(TelephoneValue);//排序插入链表结点 voidDelByIndex(intindex);//根据序号删除结点 voidDelByName(char*name);//根据姓名删除结点 boolSearchname(char*name);//根据姓名查找结点 boolUpdateByName(char*name);//根据姓名修改结点 boolUpdateByIndex(intindex);//根据序号修改结点 boolLoadFromFile();//从文件中输入数据 boolSaveToFile();//将数据存储进文件 boolcompstr(char*name,char*search1,intflag);//模糊比较 Node }; 2.2.2改进二 2.2.2.1改进方案 主菜单具体化,使内容更加详尽完备。 2.2.2.2具体实现 intmain() { TelephoneValue; intOption,i; charName[20]; charstr[20]; intoption=0,index=0; cout<<"\t\t\t欢迎使用双向链表通讯录(njust_smalllion制作)"< do { cout<<"\t\t\t\t主菜单"< cout<<"************************************************************************"< cout<<"1)添加数据"< cout<<"2)删除数据"< cout<<"3)输出通讯录"< cout<<"4)返回通讯录记录数"< cout<<"5)修改通讯录数据"< cout<<"6)从文件中输入数据"< cout<<"7)将数据存储进文件"< cout<<"8)根据姓名查找通讯录"< cout<<"9)退出程序"< cout<<"请输入你的选择序号: "; cin>>Option; while(! cin)//当输入的数据类型与定义的变量类型不一致的时候 { cin.clear();//清空输入缓冲区 cin.getline(str,20);//接收原输入数据 cout<<"\n\n非法输入! 请输入一个整数: "; cin>>Option;//重新输入 } switch(Option) { case1: do { cout<<"-----------------------------------"< cout<<"1)将数据插入到通讯录头"< cout<<"2)将数据插入到通讯录尾"< cout<<"3)将数据插入到通讯录中间"< cout<<"4)排序插入数据"< cout<<"5)退回主菜单"< cout<<"请输入你的选择: "; cin>>i; while(! cin||(i>5||i<1))//当输入的数据类型与定义的变量类型不一致的时候或超范围 { cin.clear();//清空输入缓冲区 cin.getline(str,20);//接收原输入数据 cout<<"\n\n非法输入! 请输入一个整数(1~5): "; cin>>i;//重新输入 } switch(i) { case1: Value.Input(); cout<<"执行任务: 将数据插入到通讯录头"< List.InsertAtFront(Value);//将数据插入到通讯录头 cout<<"提示: 任务执行成功! 数据成功插入到通讯录头! "< cout<<"按任意键继续"< cout<<"-----------------------------------"< getch(); break; case2: Value.Input(); cout<<"执行任务: 将数据插入到通讯录尾"< List.InsertAtRear(Value);//将结点插入到链表尾 cout<<"提示: 任务执行成功! 成功将数据插入通讯录尾! "< cout<<"按任意键继续"< cout<<"-----------------------------------"< getch(); break; case3: Value.Input(); List.InsertAtMiddle(Value);//将结点插入到链表中间 break; case4: Value.Input(); List.AddNode(Value);//排序插入链表结点 break; case5: i=5; break; } }while(i! =5); break; case2: do { cout<<"-----------------------------------"< cout<<"1)将数据从通讯录头删除"< cout<<"2)将数据从通讯录尾删除"< cout<<"3)按序号删除数据"< cout<<"4)按姓名删除数据"< cout<<"5)返回主菜单"< cout<<"请输入你的选择: "; cin>>i; while(! cin||(i>5||i<1))//当输入的数据类型与定义的变量类型不一致的时候或超范围 { cin.clear();//清空输入缓冲区 cin.getline(str,20);//接收原输入数据 cout<<"\n\n非法输入! 请输入一个整数(1~5): "; cin>>i;//重新输入 } switch(i) { case1: List.RemoveFromFront();//将数据从通讯录头删除 break; case2: List.RemoveFromRear();//将数据从通讯录尾删除 break; case3: do{ i=List.LenghtOfDoubleLinkList(); cout<<"该通讯录的数据个数: "< cout<<"\t请输入序号: "; cin>>index; while(! cin)//当输入的数据类型与定义的变量类型不一致的时候 { cin.clear();//清空输入缓冲区 cin.getline(str,20);//接收原输入数据 cout<<"\n\n非法输入! 请输入一个整数: "; cin>>index;//重新输入 } cout<<"\t序号为: "< cout<<"\t确认吗? ? [Y/N](输入非Y按N算)"; cin>>str; if(strlen(str)! =1||(str[0]! ='Y'&&str[0]! ='y'))i=1; else { if(i { cout<<"对不起,没有这个序号,请重新输入"< i=1; } elsei=0; } }while(i); if(index==1)List.RemoveFromFront(); elseif(i==index)List.RemoveFromRear(); elseList.DelByIndex(index);//按序号删除结点 break; case4: do{ i=List.LenghtOfDoubleLinkList(); cout<<"请输入姓名: "; cin>>Name; cout<<"姓名为: "< cout<<"确认吗? ? [Y/N](输入非Y按N算)"; cin>>str; if(strlen(str)! =1||(str[0]! ='Y'&&str[0]! ='y'))i=1; elsei=0; }while(i); List.DelByName(Name);//按姓名删除结点 break; case5: Option=1; break; } }while(Option! =1);//结束循环,退回主菜单 break; case3: { cout<<"-----------------------------------"< cout<<"1)从前往后输出通讯录"< cout<<"2)从后往前输出通讯录"< cout<<"3)返回主菜单"< cout<<"请输出你的选择"; cin>>i; while(! cin||(i>3||i<1))//当输入的数据类型与定义的变量类型不一致的时候或超范围 { cin.clear();//清空输入缓冲区 cin.getline(str,20);//接收原输入数据 cout<<"\n\n非法输入! 请输入一个整数(1~3): "; cin>>i;//重新输入 } switch(i) { case1: List.TraverseForward();//从前往后输出通讯录 break; case2: List.TraverseBackwards();//从后往前输出通讯录 break; case3: Option=3; break; } break; } case4: { cout<<"\n-----------------------------------"< cout<<"执行任务: 返回通讯录数据个数"< cout<<"通讯录如下: \n"; i=List.LenghtOfDoubleLinkList(); cout<<"该通讯录的数据个数: "< cout<<"提示: 任务执行成功! 成功输出通讯录中的数据个数! "< cout<<"按任意键继续"< cout<<"-----------------------------------"< getch(); break; } case5: do { cout<<"-----------------------------------"< cout<<"1)按姓名修改"< cout<<"2)按序号修改"< cout<<"3)返回主菜单"< cout<<"请输入你的选择: "; cin>>i; while(! cin||(i>3||i<1))//当输入的数据类型与定义的变量类型不一致的时候或超范围 { cin.clear();//清空输入缓冲区 cin.getline(str,20);//接收原输入数据 cout<<"\n\n非法输入! 请输入一个整数(1~3): "; cin>>i;//重新输入 } switch(i) { case1: do{ i=List.LenghtOfDoubleLinkList(); cout<<"请输入姓名: "; cin>>Name; cout<<"姓名为: "< cout<<"确认吗? ? [Y/N](输入非Y按N算)"; cin>>str; if(strlen(str)! =1||(str[0]! ='Y'&&str[0]! ='y'))i=1; elsei=0; }while(i); List.UpdateByName(Name);//按姓名修改结点 break; case2: do{ cout<<"通讯录如下: \n"; i=List.LenghtOfDoubleLinkList(); cout<<"\t请输入序号: "; cin>>index; while(! cin)//当输入的数据类型与定义的变量类型不一致的时候 { cin.clear();//清空输入缓冲区 cin.getline(str,20);//接收原输入数据 cout<<"\n\n非法输入! 请输入一个整数: "; cin>>index;//重新输入 } cout<<"\t序号为: "< cout<<"\t确认吗? ? [Y/N](输入非Y按N算)"; cin>>str; if(strlen(str)! =1||(str[0]! ='Y'&&str[0]! ='y'))i=1; else { if(i { cout<<"对不起,没有这个序号,请重新输入"< i=1; } i=0; } }while(i); List.UpdateByIndex(index);//按序号修改结点 case3: option=1; break; } }while(option! =1);//结束循环,退回主菜单 break; case6: List.LoadFromFile();//从文件中输入数据 break; case7: { List.SaveToFile();//将数据存储进文件 break; } case8: do { cout<<"-----------------------------------"< cout<<"1)按姓名查找"< cout<<"2)返回主菜单"< cout<<"请输入你的选择: "; cin>>i; while(! cin||(i>3||i<1))//当输入的数据类型与定义的变量类型不一致的时候或超范围 { cin.clear();//清空输入缓冲区 cin.getline(str,20);//接收原输入数据 cout<<"\n\n非法输入! 请输入一个整数(1~3): "; cin>>i;//重新输入 } switch(i) { case1: do{ cout<<"请输入姓名: "; cin>>Name; cout<<"姓名为: "< cout<<"确认吗? ? [Y/N](输入非Y按N算)"; cin>>str; if(strlen(str)! =1||(str[0]! ='Y'&&str[0]! ='y'))i=1; elsei=0; }while(i); List.Searchname(Name);//按姓名查找通讯录 break; case2: option=1; break; } }while(option! =1);//结束循环,退回主菜单 break; case9: { break; } default: { cout<<"\t选择范围超出菜单给定,重新输入? [Y/N](输入非Y按N算)"; cin>>str; if(strlen(str)! =1||(str[0]! ='Y'&&str[0]! ='y'))Option=1; elseOption=9; } } } while(Option! =9);//结束循环,测试完成 return0; } 2.2.3改进三 2.2.3.1改进方案 增加模糊匹配功能 2.2.3.2具体实现 template boolDoubleLinkList : compstr(char*name,char*search1,intflag) { inti,l,l1; charname1[20]; l1=strlen(name); strcpy(name1,name); for(i=0;i { if((name[i]>='A')&&(name[i]<='Z')) name1[i]+='a'-'A'; } l=strlen(search1); if(l1 switch(flag) { case1: { for(i=0;i { if(search1[i]! =name1[i]) break; } if(search1[i]=='*') returntrue; else returnfalse; } break; case0: { if(l1==l) { for(i=0;i { if(search1[i]! =name1[i]&&search1[i]! ='? ') break; } if(i elsereturn1; } else returnfalse; } default: return0; } } 2.2.4改进四 2.2.4.1改进方案 改将通讯录以文件的形式存在磁盘上,每次操作时将通讯录调出,操作完毕后存盘。 2.2.4.2具体实现 template boolDoubleLinkList : SaveToFile() { //ofstreamoutfile; charFileName[20]; cout<<"\n-----------------------------------"< cout<<"请输入文件名: "; cin>>FileName; ofstreamoutfile(FileName);//以输出的方式打开数据文件 if(! outfile)//打开文件错误,输出提示信息,退出程序 { cout<<"打开文件错误! "< cout<<"\n按任意键继续"< cout<<"------------------------
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C+ 课程设计 双向 报告