1、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.2.3.1 改进方案 2.2.3.2 具体实现2.3调试结果三、调试报告在设计和实现过程所遇到的问题和解决四、总体小结在整个设计过程中的心得体会五、分工介绍 两人合作一、课题目标1.1 程序功能简介原程序定义了模版数据类型的双向链表类型,并定义了链表的插入,删除和输出操作的成员函数。1.2 课程设计要求(1)在原程序的基础上扩充双向链表的功能,增加排序插入,根据数据查找结点及修改结点数据等功能。(2)将结点据数据改成通讯录中的一个纪录,增加年龄,姓名,电话等数据;并能根据姓名进行向前或向后查找,链表根据姓名排序。(3)可以修改某个结点,即修改其中的年龄和电话字段,修改时新旧记录要同时
3、显示在屏幕上,新纪录按“确认”键后才替代旧记录,否则取消修改操作。(4)将通讯录以文件的形式存在磁盘上,每次操作时将通讯录调出,操作完毕后存盘。(5)完善主函数,使主菜单更加详尽完备。(6)完成类的封装。(7)增加模糊匹配的功能。1.3 评定难易级别A级二、具体实现2.1 程序总体方案2.1.1开发平台操作系统:Windows XP开发工具:VC+6.02.1.2程序结构或流程图 2.2改进方案2.2.1改进一 2.2.1.1 改进方案完成类的封装2.2.1.2具体实现templateclass Node/结点类friend class DoubleLinkList; /友元类private
4、:NodeType Data;/结点数据Node *NextNode; /结点的后向指针,指向下一结点Node *PreviousNode; /结点的前向指针,指向前一结点public :Node(); /默认的构造函数Node(Telephone&Value ); /拷贝的构造函数void print() /输出结点数据cout 姓名:setiosflags(ios:left)setw(20)Data.name;cout电话号码:setiosflags(ios:left)setw(15)Data.tel年龄:setiosflags(ios:left)setw(10)Data.ageendl;
5、Node(); /析构函数;templateclass DoubleLinkList/双向链表类private :Node *FirstNode; /链表头指针结点Node *RearNode; /链表尾指针结点public :DoubleLinkList(); /缺省构造函数DoubleLinkList(); /析构函数bool IsEmpty(); /判断是否为空链表void InsertAtFront( Telephone &Value ); /将结点插入到链表头void InsertAtRear(Telephone&Value ); /将结点插入到链表尾void InsertAtMid
6、dle(Telephone &Value ); /将结点插入到链表中间bool RemoveFromFront(); /删除链表头结点bool RemoveFromRear(); /删除链表尾结点bool RemoveFromMiddle(); /删除链表中间结点void TraverseForward(); /从前往后输出链表中的结点数据void TraverseBackwards(); /从后往前输出链表中的结点数据int LenghtOfDoubleLinkList(); /返回链表结点个数void AddNode(Telephone Value);/排序插入链表结点void DelBy
7、Index(int index);/根据序号删除结点void DelByName(char * name);/根据姓名删除结点bool Searchname(char*name);/根据姓名查找结点bool UpdateByName(char*name);/根据姓名修改结点bool UpdateByIndex(int index);/根据序号修改结点bool LoadFromFile();/从文件中输入数据bool SaveToFile();/将数据存储进文件bool compstr(char *name,char *search1,int flag);/模糊比较Node *CreateNod
8、e(Telephone&Value); /根据数据生成结点;2.2.2改进二2.2.2.1 改进方案主菜单具体化,使内容更加详尽完备。2.2.2.2具体实现int main()Telephone Value;int Option,i;char Name20;char str20;int option=0,index=0;coutttt 欢迎使用双向链表通讯录(njust_smalllion制作)endl;docouttttt 主菜单 endl;cout *endl;cout 1) 添加数据endl;cout 2) 删除数据 endl;cout 3) 输出通讯录endl;cout 4) 返回通讯
9、录记录数endl;cout 5) 修改通讯录数据 endl;cout 6) 从文件中输入数据 endl;cout 7) 将数据存储进文件endl;cout 8) 根据姓名查找通讯录endl;cout 9) 退出程序 endl;coutOption;while(!cin)/当输入的数据类型与定义的变量类型不一致的时候cin.clear();/清空输入缓冲区cin.getline(str,20);/接收原输入数据coutOption;/重新输入switch(Option)case 1 :docout -endl;cout 1) 将数据插入到通讯录头endl;cout 2) 将数据插入到通讯录尾en
10、dl;cout 3) 将数据插入到通讯录中间endl;cout 4) 排序插入数据endl;cout 5) 退回主菜单endl;couti;while(!cin|(i5|i1)/当输入的数据类型与定义的变量类型不一致的时候或超范围cin.clear();/清空输入缓冲区cin.getline(str,20);/接收原输入数据couti;/重新输入switch(i)case 1:Value.Input();cout 执行任务: 将数据插入到通讯录头endl;List.InsertAtFront(Value);/将数据插入到通讯录头cout 提示: 任务执行成功!数据成功插入到通讯录头!endl;
11、cout 按任意键继续endl;cout -endl;getch();break;case 2:Value.Input();cout 执行任务: 将数据插入到通讯录尾endl;List.InsertAtRear(Value);/将结点插入到链表尾cout 提示: 任务执行成功!成功将数据插入通讯录尾!endl;cout 按任意键继续endl;cout -endl;getch();break;case 3:Value.Input();List.InsertAtMiddle(Value);/将结点插入到链表中间break;case 4:Value.Input();List.AddNode(Valu
12、e); /排序插入链表结点break;case 5:i=5;break;while(i!=5);break;case 2 :docout -endl;cout 1) 将数据从通讯录头删除endl;cout 2) 将数据从通讯录尾删除endl;cout 3) 按序号删除数据endl;cout 4) 按姓名删除数据endl;cout 5) 返回主菜单endl;couti;while(!cin|(i5|i1)/当输入的数据类型与定义的变量类型不一致的时候或超范围cin.clear();/清空输入缓冲区cin.getline(str,20);/接收原输入数据couti;/重新输入switch(i)ca
13、se 1:List.RemoveFromFront();/将数据从通讯录头删除break;case 2:List.RemoveFromRear();/将数据从通讯录尾删除break;case 3:doi=List.LenghtOfDoubleLinkList();cout 该通讯录的数据个数:iendl;coutindex;while(!cin)/当输入的数据类型与定义的变量类型不一致的时候cin.clear();/清空输入缓冲区cin.getline(str,20);/接收原输入数据coutindex;/重新输入coutt序号为:indexendl;coutstr;if(strlen(str
14、)!=1|(str0!=Y&str0!=y) i=1;elseif(iindex)cout 对不起,没有这个序号,请重新输入endl;i=1;else i=0;while(i);if(index=1) List.RemoveFromFront();else if(i=index) List.RemoveFromRear();else List.DelByIndex(index);/按序号删除结点break;case 4:doi=List.LenghtOfDoubleLinkList();coutName;cout 姓名为:Nameendl;coutstr;if(strlen(str)!=1|(
15、str0!=Y&str0!=y) i=1;else i=0;while(i);List.DelByName(Name);/按姓名删除结点break;case 5:Option=1;break;while(Option!=1);/结束循环,退回主菜单break;case 3:cout -endl;cout 1) 从前往后输出通讯录endl;cout 2) 从后往前输出通讯录endl;cout 3) 返回主菜单endl;couti;while(!cin|(i3|i1)/当输入的数据类型与定义的变量类型不一致的时候或超范围cin.clear();/清空输入缓冲区cin.getline(str,20)
16、;/接收原输入数据couti;/重新输入switch(i)case 1:List.TraverseForward();/从前往后输出通讯录break;case 2:List.TraverseBackwards();/从后往前输出通讯录break;case 3:Option=3;break;break;case 4:coutn -endl;cout 执行任务:返回通讯录数据个数endl;cout 通讯录如下:n;i=List.LenghtOfDoubleLinkList();cout 该通讯录的数据个数:iendl;cout 提示:任务执行成功!成功输出通讯录中的数据个数!endl;cout 按
17、任意键继续endl;cout -endl;getch();break;case 5:docout -endl;cout 1) 按姓名修改endl;cout 2) 按序号修改endl;cout 3) 返回主菜单endl;couti;while(!cin|(i3|i1)/当输入的数据类型与定义的变量类型不一致的时候或超范围cin.clear();/清空输入缓冲区cin.getline(str,20);/接收原输入数据couti;/重新输入switch(i)case 1:doi=List.LenghtOfDoubleLinkList();coutName;cout 姓名为:Nameendl;cout
18、str;if(strlen(str)!=1|(str0!=Y&str0!=y) i=1;else i=0;while(i);List.UpdateByName(Name);/按姓名修改结点break;case 2:docout 通讯录如下:n;i=List.LenghtOfDoubleLinkList();coutindex;while(!cin)/当输入的数据类型与定义的变量类型不一致的时候cin.clear();/清空输入缓冲区cin.getline(str,20);/接收原输入数据coutindex;/重新输入coutt序号为:indexendl;coutstr;if(strlen(st
19、r)!=1|(str0!=Y&str0!=y) i=1;elseif(iindex)cout 对不起,没有这个序号,请重新输入endl;i=1;i=0;while(i);List.UpdateByIndex(index);/按序号修改结点case 3:option=1;break;while(option!=1);/结束循环,退回主菜单break;case 6:List.LoadFromFile();/从文件中输入数据break;case 7:List.SaveToFile();/将数据存储进文件break;case 8:docout -endl;cout 1) 按姓名查找endl;cout
20、2) 返回主菜单endl;couti;while(!cin|(i3|i1)/当输入的数据类型与定义的变量类型不一致的时候或超范围cin.clear();/清空输入缓冲区cin.getline(str,20);/接收原输入数据couti;/重新输入switch(i)case 1:docoutName;cout 姓名为:Nameendl;coutstr;if(strlen(str)!=1|(str0!=Y&str0!=y) i=1;else i=0;while(i);List.Searchname(Name);/按姓名查找通讯录break;case 2:option=1;break;while(o
21、ption!=1);/结束循环,退回主菜单break;case 9:break;default :coutstr;if(strlen(str)!=1|(str0!=Y&str0!=y) Option=1;else Option=9;while(Option!=9);/结束循环,测试完成return 0;2.2.3改进三2.2.3.1改进方案增加模糊匹配功能2.2.3.2具体实现template/定义模糊比较函数bool DoubleLinkList:compstr(char *name,char *search1,int flag)int i,l,l1;char name120;l1=strl
22、en(name);strcpy(name1,name);for(i=0;i=A)&(namei=Z)name1i+=a-A;l=strlen(search1);if(l1l) return 0;switch(flag)case 1:for(i=0;il-1;i+)if(search1i!=name1i)break;if(search1i=*)return true;elsereturn false;break;case 0:if(l1=l)for(i=0;il1;i+)if(search1i!=name1i&search1i!=?)break;if(il1) return 0;else ret
23、urn 1;elsereturn false;default:return 0;2.2.4改进四2.2.4.1改进方案改将通讯录以文件的形式存在磁盘上,每次操作时将通讯录调出,操作完毕后存盘。2.2.4.2具体实现template/将数据存储进文件bool DoubleLinkList:SaveToFile()/ofstream outfile;char FileName20;coutn -endl;coutFileName;ofstream outfile(FileName);/以输出的方式打开数据文件if(!outfile) /打开文件错误,输出提示信息,退出程序cout 打开文件错误!endl;coutn 按任意键继续endl;cout -