数据结构课程设计报告含菜单docWord文档格式.docx
- 文档编号:22741304
- 上传时间:2023-02-05
- 格式:DOCX
- 页数:19
- 大小:181.46KB
数据结构课程设计报告含菜单docWord文档格式.docx
《数据结构课程设计报告含菜单docWord文档格式.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计报告含菜单docWord文档格式.docx(19页珍藏版)》请在冰豆网上搜索。
然后要在线性表里创建一个子菜单实现“创建链表”、“插入元素”、“删除元素”、“查找元素”的功能。
并且可以退出这个子菜单回到上一级菜单。
栈和队列创建一个子菜单,包含进制转换和括号匹配的功能。
进制转换里又分为十进制转八进制、十进制转二进制。
串、数组、广义表里可以创建子菜单包含矩阵乘法、矩阵转置的功能。
树里创建子菜单,有树的创建、先序遍历、中序遍历、后序遍历、树的高度、叶子数这几个选项。
这些子菜单都能退出回到上一级菜单。
四.总体设计
设计菜单类
根据实际使用,我们知道菜单类的主要功能就是显示菜单项与响应用户选项。
所以我们可以这样设计一个菜单基类:
classCMenuBase
{
public:
CMenuBase(void);
~CMenuBase(void);
virtualvoidShowMenu()=0;
virtualvoidEvent(intEvenID)=0;
protected:
CMenuBase*m_pParent;
};
根据所绘制的知识结构图,设计DOS菜单。
例如
在此基础上,所有菜单类都继承这个类,以此来实现“显示”与“响应事件”的多态性。
例如,主菜单类的设计为:
classCMainMenu:
publicCMenuBase
CMainMenu(void);
~CMainMenu(void);
virtualvoidShowMenu();
virtualvoidEvent(intEvenID);
和基类基本没有区别。
其实现可以为
voidCMainMenu:
:
ShowMenu(){
cout<
<
"
\n**************《数据结构课程设计》*****************\n"
;
*1线性表2栈与队列3串、数组和广义表*\n"
*4树5图6查找*\n"
*7排序8退出*\n"
***************************************************\n"
}
Event(intEvenID){
CMenuBase*tmp;
switch(EvenID){
caseID_LIST:
SUBMENU(CListMenu)
break;
caseID_STACK_QUEUE:
SUBMENU(CStackMenu)
caseID_EXIT:
MAIN_EXIT=true;
default:
InvalidateAction();
}
注意:
这里的关键是如何进入子菜单,我们用了一个宏命令,例如SUBMENU(CListMenu),其定义为:
#defineSUBMENU(submenu)tmp=pBase;
\
pBase=newsubmenu(tmp);
pBase->
ShowMenu();
通过构造函数,将当前菜单对象作为子菜单的父菜单,以后退出子菜单时,子菜单将将显示权让给其父菜单:
#defineEXIT_SUBMENUtmp=m_pParent;
deletepBase;
pBase=tmp;
这样设计,无论有多少级菜单,其编程风格都是一样的,只需管理当前的菜单交接,而无需知道它是从哪儿来的。
还定义了线性表、栈和队列、数组串和广义表、树等模板类。
线性表的类如下:
classCListMenu:
CListMenu(CMenuBase*);
~CListMenu(void);
voidCreateList_L(intn);
StatusListInsert_L(inti,ElemTypee);
StatusListOut_L();
StatusListDelete_L(inti,ElemType&
e);
StatusGetElem_L(inti,ElemType&
LinkListL;
栈和队列的类如下
classCStackMenu:
charname[20];
CStackMenu(CMenuBase*);
~CStackMenu(void){}
virtualvoidShowMenu();
virtualvoidEvent(intEvenID);
StatusInitStack();
StatusPush(SElemTypee);
StatusPop(SElemType&
voidKuohao();
SqStackS;
进制转换的类定义如下
classCJinzhiMenu:
charname[20];
CJinzhiMenu(CMenuBase*);
~CJinzhiMenu(void){}
voidconversion_8();
voidconversion_2();
StatusInitStack();
StatusPush(JElemTypex);
StatusPop(JElemType&
x);
JSqStacks;
数组的类定义如下:
classCShuzuMenu:
charname[200];
CShuzuMenu(CMenuBase*);
~CShuzuMenu(void){}
StatusCreat_2(RLSMatrix&
M,intx,inty);
StatusPutout_2(RLSMatrix&
M);
StatusMultSMatrix(RLSMatrix&
M,RLSMatrix&
N,RLSMatrix&
Q);
StatusFastTransposeSMatrix(TSMatrix&
M,TSMatrix&
T);
voidzhuanzhi();
voidChengfa();
树的类定义如下:
classCShuMenu:
CShuMenu(CMenuBase*);
~CShuMenu(void){}
StatussVisit(TElemTypee);
StatussCreateBiTree(BiTree&
T1);
StatussxianOrderTraverse(BiTreeT1);
StatussZhongOrderTraverse(BiTreeT1);
StatussHouOrderTraverse(BiTreeT1);
intDepth(BiTreeT1);
intcountleaf(BiTreeT1);
BiTreeT;
每一级的菜单函数都可以根据以上类的模板来写。
方便且不容易遗漏出错。
5.详细设计与实现
线性表菜单显示如下:
线性链表菜单的设计则可能为
其实现则类似于
CListMenu:
CListMenu(CMenuBase*parent){
m_pParent=parent;
voidCListMenu:
************《线性表》*************\n"
*1创建线性表2插入元素*\n"
*3查找元素4删除元素*\n"
*5浏览6退出*\n"
***********************************\n"
caseID_CREATE_LIST:
cout<
创建几个元素的链表"
cin>
>
n;
list.CreateList_L(n);
当前链表元素为"
endl;
list.ListOut_L();
system("
pause"
);
caseID_LIST_INSERT:
输入插入元素位置"
i;
cout<
请输插入元素的值"
e;
list.ListInsert_L(i,e);
system("
caseID_LIST_SHOW:
list.ListOut_L();
caseID_LIST_RETURN:
EXIT_SUBMENU
caseID_LIST_DELETE:
请输删除元素的位置"
list.ListDelete_L(i,e);
break;
caseID_LIST_FIND:
输入查找元素位置"
list.GetElem_L(i,e);
break;
线性链表各功能具体实现代码如下:
创建链表:
CreateList_L(intn){
inti;
LinkListp;
L=(LinkList)malloc(sizeof(LNode));
L->
next=NULL;
for(i=n;
i>
0;
i--){
p=(LinkList)malloc(sizeof(LNode));
cin>
p->
data;
p->
next=L->
next;
L->
next=p;
界面如下:
查找元素:
StatusCListMenu:
GetElem_L(inti,ElemType&
e){
intj;
p=L->
j=1;
while(p&
&
j<
i){
p=p->
j++;
if(!
p||j>
i)returnERROR;
e=p->
data<
returnOK;
插入元素:
ListInsert_L(inti,ElemTypee){
LinkListp,s;
p=L;
intj=0;
i-1){p=p->
++j;
i)return0;
s=(LinkList)malloc(sizeof(LNode));
s->
data=e;
s->
next=p->
next=s;
return1;
删除元素:
ListDelete_L(inti,ElemType&
LinkListp,q;
j=0;
while(p->
next&
j++;
(p->
next)||j>
i-1)return0;
q=p->
next=q->
e=q->
data;
free(q);
浏览所有元素:
ListOut_L(){
p=L->
next;
while(p)
{
p=p->
return0;
栈和队列菜单显示界面如下:
栈和队列的菜单设计如下:
其菜单函数为:
voidCStackMenu:
cls"
//清屏
************《栈和队列》***************************\n"
*1括号匹配2进制转换3迷宫问题4退出*\n"
CStackMenustack(pBase);
CMenuBase*tmp;
switch(EvenID){
caseID_KUO_HAO:
stack.Kuohao();
caseID_JIN_ZHI:
SUBMENU(CJinzhiMenu);
caseID_MI_GONG:
此小项未完成"
caseID_STACK_RETURN:
default:
InvalidateAction();
}
其他项目做法与线性链表类似。
由于字数有限,其他项目功能的具体实现就不一一介绍了。
我们这里定义了一些菜单常量,其定义可以放在一个resource.h文件中:
#defineID_LIST1
#defineID_STACK_QUEUE2
#defineID_STR_ARR_GL3
#defineID_TREE4
#defineID_GRAPH5
#defineID_SEARCH6
#defineID_SORT7
#defineID_EXIT8
#defineID_CREATE_LIST1
#defineID_LIST_INSERT2
#defineID_LIST_FIND3
#defineID_LIST_DELETE4
#defineID_LIST_SHOW5
#defineID_LIST_RETURN6
#defineID_KUO_HAO1
#defineID_JIN_ZHI2
#defineID_MI_GONG3
#defineID_STACK_RETURN4
#defineID_BA1
#defineID_ER2
#defineID_JINZHI_RETURN3
#defineID_CHENG_FA1
#defineID_ZHUAN_ZHI2
#defineID_SHUZU_RETURN3
#defineID_CHUANG_SHU1
#defineID_XIAN2
#defineID_ZHONG3
#defineID_HOU4
#defineID_YE_ZI_SHU5
#defineID_JIAO_HUAN6
#defineID_GAO_DU7
#defineID_SHU_RETURN8
voidInvalidateAction();
在主函数中应用菜单对象。
boolMAIN_EXIT;
CMenuBase*pBase;
List<
int>
*pList;
voidmain()
MAIN_EXIT=false;
pBase=newCMainMenu;
pBase->
intEventID=0;
charCammandLine[255]={0};
while(MAIN_EXIT==false){
cin>
CammandLine;
if(strlen(CammandLine)==0){
非法操作,非正常退出\n"
}
EventID=atoi(CammandLine);
pBase->
Event(EventID);
if(pBase)
deletepBase;
if(pList)
deletepList;
在这儿定义了两个全局指针,菜单指针pBase和链表指针pList(要的话还可以添加其他指针)。
6.课程设计小节
经过一学期的数据结构课程的学习,我现在编程已经比以前模块化多了,这样既不容易出错,而且出了错也较容易查出,其可读性也加强了。
学会了运用类,知道了继承、多态。
在做数组那个大项时出现了问题,运行处结果了,但同时也弹出了一个debugerror,经过老师的指导,原来是差一个引用字符,也就是要使形参和实参指向同一个字母。
还有树里也出了问题,不能遍历,请教张凡凡同学,也得到了解决,是因为我重复定义了visit。
程序的实用性是很重要的,这就是我的收获。
另外,由于编程的积累,我发现调试程序的速度明显加快了,这是个很好的进步,不过,我编程的速度仍然有待提高,我思考过了,导致慢的原因可能有以下几点:
1、打字速度慢。
(这点的确的克服)
2、算法没有很熟,只是想一想能出来,而远没有应到的境界。
3、编程时精神不能太集中,不过这点一比以前好多了。
4、这是最后,也是最重要的一点,编的程序还不够多,所谓熟能生巧嘛。
综上所述,我还是要好好努力,继续历练的,以提高编程能力目标而继续热情的奋斗!
指导老师意见:
成绩:
教师签名:
年月日
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 课程设计 报告 菜单 doc