C++课程设计双向链表课程设计报告Word文档格式.docx
《C++课程设计双向链表课程设计报告Word文档格式.docx》由会员分享,可在线阅读,更多相关《C++课程设计双向链表课程设计报告Word文档格式.docx(26页珍藏版)》请在冰点文库上搜索。
![C++课程设计双向链表课程设计报告Word文档格式.docx](https://file1.bingdoc.com/fileroot1/2023-5/3/ce686d97-a6e5-468c-b3f9-d82caef5b686/ce686d97-a6e5-468c-b3f9-d82caef5b6861.gif)
2.2.3.1改进方案
2.2.3.2具体实现
2.3调试结果
三、调试报告
在设计和实现过程所遇到的问题和解决
四、总体小结
在整个设计过程中的心得体会
五、分工介绍
两人合作
原程序定义了模版数据类型的双向链表类型,并定义了链表的插入,删除和输出操作的成员函数。
(1)在原程序的基础上扩充双向链表的功能,增加排序插入,根据数据查找结点及修改结点数据等功能。
(2)将结点据数据改成通讯录中的一个纪录,增加年龄,姓名,电话等数据;
并能根据姓名进行向前或向后查找,链表根据姓名排序。
(3)可以修改某个结点,即修改其中的年龄和电话字段,修改时新旧记录要同时显示在屏幕上,新纪录按“确认”键后才替代旧记录,否则取消修改操作。
(4)将通讯录以文件的形式存在磁盘上,每次操作时将通讯录调出,操作完毕后存盘。
(5)完善主函数,使主菜单更加详尽完备。
(6)完成类的封装。
(7)增加模糊匹配的功能。
操作系统:
WindowsXP
开发工具:
VC++6.0
2.2改进方案
2.2.1改进一
2.2.1.1改进方案
完成类的封装
2.2.1.2具体实现
template<
classNodeType>
classNode//结点类
{
friendclassDoubleLinkList<
NodeType>
;
//友元类
private:
NodeTypeData;
//结点数据
Node<
*NextNode;
//结点的后向指针,指向下一结点
*PreviousNode;
//结点的前向指针,指向前一结点
public:
Node();
//默认的构造函数
Node(Telephone&
Value);
//拷贝的构造函数
voidprint()//输出结点数据
cout<
<
"
"
姓名:
setiosflags(ios:
:
left)<
setw(20)<
Data.name;
电话号码:
setw(15)<
Data.tel<
年龄:
setw(10)<
Data.age<
endl;
}
~Node();
//析构函数
};
classDoubleLinkList//双向链表类
*FirstNode;
//链表头指针结点
*RearNode;
//链表尾指针结点
DoubleLinkList();
//缺省构造函数
~DoubleLinkList();
boolIsEmpty();
//判断是否为空链表
voidInsertAtFront(Telephone&
//将结点插入到链表头
voidInsertAtRear(Telephone&
//将结点插入到链表尾
voidInsertAtMiddle(Telephone&
//将结点插入到链表中间
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);
//模糊比较
*CreateNode(Telephone&
Value);
//根据数据生成结点
2.2.2.1改进方案
主菜单具体化,使内容更加详尽完备。
2.2.2.2具体实现
intmain()
TelephoneValue;
intOption,i;
charName[20];
charstr[20];
intoption=0,index=0;
\t\t\t欢迎使用双向链表通讯录(njust_smalllion制作)"
do
\t\t\t\t主菜单"
************************************************************************"
1)添加数据"
2)删除数据"
3)输出通讯录"
4)返回通讯录记录数"
5)修改通讯录数据"
6)从文件中输入数据"
7)将数据存储进文件"
8)根据姓名查找通讯录"
9)退出程序"
请输入你的选择序号:
cin>
>
Option;
while(!
cin)//当输入的数据类型与定义的变量类型不一致的时候
cin.clear();
//清空输入缓冲区
cin.getline(str,20);
//接收原输入数据
\n\n非法输入!
请输入一个整数:
//重新输入
switch(Option)
case1:
-----------------------------------"
1)将数据插入到通讯录头"
2)将数据插入到通讯录尾"
3)将数据插入到通讯录中间"
4)排序插入数据"
5)退回主菜单"
请输入你的选择:
i;
cin||(i>
5||i<
1))//当输入的数据类型与定义的变量类型不一致的时候或超范围
请输入一个整数(1~5):
switch(i)
case1:
Value.Input();
执行任务:
将数据插入到通讯录头"
List.InsertAtFront(Value);
//将数据插入到通讯录头
提示:
任务执行成功!
数据成功插入到通讯录头!
按任意键继续"
getch();
break;
case2:
将数据插入到通讯录尾"
List.InsertAtRear(Value);
//将结点插入到链表尾
成功将数据插入通讯录尾!
case3:
List.InsertAtMiddle(Value);
//将结点插入到链表中间
case4:
List.AddNode(Value);
//排序插入链表结点
case5:
i=5;
}while(i!
=5);
case2:
1)将数据从通讯录头删除"
2)将数据从通讯录尾删除"
3)按序号删除数据"
4)按姓名删除数据"
5)返回主菜单"
请输入你的选择:
List.RemoveFromFront();
//将数据从通讯录头删除
List.RemoveFromRear();
//将数据从通讯录尾删除
do{
i=List.LenghtOfDoubleLinkList();
该通讯录的数据个数:
i<
\t请输入序号:
index;
\t序号为:
index<
\t确认吗?
?
[Y/N](输入非Y按N算)"
str;
if(strlen(str)!
=1||(str[0]!
='
Y'
&
str[0]!
y'
))i=1;
else
if(i<
index)
对不起,没有这个序号,请重新输入"
i=1;
elsei=0;
}while(i);
if(index==1)List.RemoveFromFront();
elseif(i==index)List.RemoveFromRear();
elseList.DelByIndex(index);
//按序号删除结点
请输入姓名:
Name;
姓名为:
Name<
确认吗?
List.DelByName(Name);
//按姓名删除结点
Option=1;
}while(Option!
=1);
//结束循环,退回主菜单
1)从前往后输出通讯录"
2)从后往前输出通讯录"
3)返回主菜单"
请输出你的选择"
3||i<
请输入一个整数(1~3):
List.TraverseForward();
//从前往后输出通讯录
List.TraverseBackwards();
//从后往前输出通讯录
Option=3;
\n-----------------------------------"
执行任务:
返回通讯录数据个数"
通讯录如下:
\n"
提示:
任务执行成功!
成功输出通讯录中的数据个数!
1)按姓名修改"
2)按序号修改"
List.UpdateByName(Name);
//按姓名修改结点
i=0;
List.UpdateByIndex(index);
//按序号修改结点
option=1;
}while(option!
case6:
List.LoadFromFile();
case7:
List.SaveToFile();
case8:
1)按姓名查找"
2)返回主菜单"
List.Searchname(Name);
//按姓名查找通讯录
case9:
default:
\t选择范围超出菜单给定,重新输入?
))Option=1;
elseOption=9;
while(Option!
=9);
//结束循环,测试完成
return0;
2.2.3改进三
2.2.3.1改进方案
增加模糊匹配功能
2.2.3.2具体实现
//定义模糊比较函数
boolDoubleLinkList<
compstr(char*name,char*search1,intflag)
inti,l,l1;
charname1[20];
l1=strlen(name);
strcpy(name1,name);
for(i=0;
l1;
i++)
if((name[i]>
A'
)&
(name[i]<
Z'
))
name1[i]+='
a'
-'
l=strlen(search1);
if(l1<
l)return0;
switch(flag)
l-1;
if(search1[i]!
=name1[i])
if(search1[i]=='
*'
)
returntrue;
returnfalse;
case0:
if(l1==l)
=name1[i]&
search1[i]!
?
'
l1)return0;
elsereturn1;
default:
2.2.4改进四
2.2.4.1改进方案
改将通讯录以文件的形式存在磁盘上,每次操作时将通讯录调出,操作完毕后存盘。
2.2.4.2具体实现
SaveToFile()
//ofstreamoutfile;
charFileName[20];
请输入文件名:
FileName;
ofstreamoutfile(FileName);
//以输出的方式打开数据文件
if(!
outfile)//打开文件错误,输出提示信息,退出程序
打开文件错误!
\n按任意键继续"
------------------------