数据结构课程设计报告数据结构演示系统.docx
- 文档编号:10014822
- 上传时间:2023-02-07
- 格式:DOCX
- 页数:41
- 大小:401.27KB
数据结构课程设计报告数据结构演示系统.docx
《数据结构课程设计报告数据结构演示系统.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计报告数据结构演示系统.docx(41页珍藏版)》请在冰豆网上搜索。
数据结构课程设计报告数据结构演示系统
中南大学
数据结构课程设计报告
题目:
数据结构演示系统
(1)
院系:
信息科学与工程学院
班级:
计算机0904
姓名:
张学程
学号:
指导老师:
陈再良
完成时间:
2011.07
第1章
需求分析
一、顺序表部分
1.创建根据用户输入,创建顺序表,表中各元素以空格分隔显示。
非空顺序表为后续其它操作的前提。
输入数据为各合法字符(含中文)。
2.插入根据用户输入,在指定位置插入指定元素,其中位置标识从0开始。
若用户输入位置超出顺序表位置范围,给出越界错误提示;若用户未输入插入元素,亦给出相应提示。
插入元素为各合法字符,插入位置为0-100间整数。
3.删除根据用户输入,删除顺序表中指定位置对应元素,并返回被删除元素,其中位置标识从0开始。
若用户输入位置超出顺序表位置范围,给出相应错误提示。
删除位置输入为0-100间整数。
4.合并根据用户输入,将输入无序表排序后,进行有序合并。
输入数据为各合法字符。
二、链表部分
1.创建根据用户输入,创建顺序表,表中各元素以->分隔显示。
创建过程中采用头插法创建。
非空链表为后续其它操作的前提。
输入数据为各合法字符(含中文)。
2.查找根据用户输入,返回指定元素在链表中的位置(其中位置坐标从0开始)。
若所查找元素在链表中不存在,给出提示相应信息,并设置坐标位置为-1。
查找输入为各合法字符。
3.插入根据用户输入,在指定位置插入指定元素,若输入位置超出链表范围,给出越界错误提示;若用户未输入插入元素,亦给出相应提示提示。
入元素为各合法字符,插入位置为0-100间整数。
4.删除根据用户输入,删除链表中指定位置对应元素,并返回被删除元素。
若用户输入位置超出链表范围,给出相应错误提示。
删除位置输入为0-100间整数。
5.合并根据用户输入,将输入无序表排序后,进行有序合并。
输入数据为各合法字符。
三、KMP部分
1.数据输入输入主串及模式串元素为各合法输入(含中文)。
2.求解next对用户输入模式串T根据KMP算法求解各元素对应next值。
3.模式匹配利用求得的next值对用户输入的主串S及模式串T进行模式匹配,并返回匹配结果信息。
4.求解nextval对用户输入模式串T根据改进算法求解各元素对应nextval值。
第2章
概要设计
一、数据结构
1.主对话框
classCDS_DEMO_1Dlg:
publicCDialog
{
……//构造函数及其它基本数据元素与操作
public:
各控件事件
}
2.顺序表
classCSqDialog:
publicCDialog
{
……//构造函数及其它基本数据元素与操作
protected:
各控件变量及其它相关变量
public:
各控件事件及其它成员函数
全局友元
}
3.链表
classCListDialog:
publicCDialog
{
……//构造函数及其它基本数据元素与操作
protected:
各控件变量及其它相关变量
public:
各控件事件及其它成员函数
全局友元
}
4.KMP
classCKmpDialog:
publicCDialog
{
……//构造函数及其它基本数据元素与操作
protected:
各控件变量及其它相关变量
public:
各控件事件及其它成员函数
全局友元
}
二、程序主流程
三、模块层次
主对话框响应三个不同单击事件,对应打开三个模态对话框:
顺序表演示、链表演示、KMP演示。
1.顺序表演示
创建按钮:
响应事件,将用户输入转换为以空格分隔的顺序表输出到对应文本框。
若此时顺序表非空,启用插入、删除按钮。
插入按键:
响应事件,在顺序表非空及插入位置合法时,按用户输入将元素插入到指定位置。
删除按钮:
响应事件,在顺序表非空及删除位置合法时,将用户指定位置对应元素从顺序表中删除,并返回该元素。
合并按钮:
响应事件,将用户输入的两个无序表排序后进行有序合并。
合并操作不依赖于创建操作。
2.链表演示
创建按钮:
响应事件,将用户输入转换为以->分隔的链表输出到对应文本框。
若此时链表非空,启用查找、插入、删除按钮。
查找按钮:
响应事件,从链表中查找用户输入元素。
查找成功时,返回元素位置;查找失败时,给出提示信息。
插入按钮:
响应事件,在链表非空及插入位置合法时,在链表中指定位置插入指定元素。
删除按钮:
响应事件,在链表非空及删除位置合法时,删除链表中指定位置元素,并返回被删除元素。
合并按钮:
响应事件,将用户输入的两个无序表排序后进行有序合并。
合并操作不依赖于创建操作。
3.KMP演示
输入按钮:
响应事件,获取用户主串及模式串数据输入。
当模式串非空时,启用求NEXT、求NEXTVAL按钮;当模式串及主串均非空时,启用匹配按钮。
求NEXT按钮:
响应事件,求取KMP算法中模式串各元素的next值。
匹配按钮:
响应事件,根据KMP算法,对主串及模式串进行匹配操作。
求NEXTVAL按钮:
响应事件,求取KMP改进算法中模式串各元素的nextval值。
4.窗口关闭按钮
无演示操作时,单击关闭按钮,关闭当前对话框并返回上级对话框或退出演示程序;演示操作进行过程中,关闭按钮禁用,防止意外程序终止发生。
第3章
详细设计
一、数据类型
1.顺序表
CStringm_CurrSq;//当前顺序表各元素以空格分隔
intm_CurrLength;//当前顺序表表长
intm_CurrSize;//当前顺序表容量
intm_InsertPos;//元素插入位置
CStringm_InsertValue;//待插入元素
CStringm_OpValue;//当前操作元素
intm_OpPos;//当前操作位置
intm_DeletePos;//删除元素位置
CStringm_DeleteValue;//删除元素值
CStringm_StringA;//待排序原始表A
CStringm_StringB;//待排序原始表B
CStringm_SortedA;//已排序有序表A
CStringm_SortedB;//已排序有序表B
CStringm_SortedC;//排序后合并表C
intm_PosA;//当前有序A操作元素位置
intm_PosB;//当前有序表B操作元素位置
CStringm_ValueA;//当前有序表A操作元素
CStringm_ValueB;//当前有序表B操作元素
2.链表
CStringm_CreateList;//创建操作中原始链表
intm_CurrLength;//当前表长不含头结点
CStringm_CurrList;//当前链表以->分隔
CStringm_OpValue;//当前操作元素
intm_OpPos;//当前操作元素原始位置
CStringm_ListA;//待排序原始链表A
CStringm_ListB;//待排序链表B
CStringm_SortedC;//合并后链表C->分隔
CStringm_SortedA;//已排序链表A
CStringm_SortedB;//已排序链表B
intm_PosA;//当前操作中链表A元素位置
intm_PosB;//当前操作中链表B元素位置
CStringm_ValueA;//当前操作中链表A元素值
CStringm_ValueB;//当前操作中链表B元素值
intm_DeletePos;//待删除元素位置
CStringm_DeleteValue;//待删除元素值
CStringm_FindValue;//待查找元素
intm_FindPos;//待查找元素所以位置-1为元素不存在
intm_InsertPos;//元素待插入位置
CStringm_InsertValue;//待插入元素
3.KMP
CStringm_S;//原始输入主串无空格分隔
CStringm_T;//原始输入子串无空格分隔
CStringm_IndexS;//模式匹配过程中主串S以空格分隔操作字符以()标识
CStringm_IndexT;//模式匹配过程中子串T以空格分隔操作字符以()标识
CStringm_NextT1;//求next过程中模式串T1
CStringm_NextT2;//求next过程中模式串T2
CStringm_Next;//模式串的next值
CStringm_NextvalT1;//求nextval操作中模式串T1
CStringm_NextvalT2;//求nextval操作中模式串T2
CStringm_Nextval;//求nextval操作中nextval值
二、相关函数
1.顺序表
afx_msgvoidOnSqCreateButton();//响应创建按钮事件
afx_msgvoidOnSqInsertButton();//响应插入按钮事件
afx_msgvoidOnSqDeleteButton();//响应删除按钮事件
afx_msgvoidOnSqMergeButton();//响应合并按钮事件
afx_msgLRESULTOnSqUpdate(WPARAMwParameter,LPARAMlpParameter);//响应对话框数据更新
2.链表
afx_msgvoidOnListCreateButton();//响应创建按键事件
afx_msgvoidOnListFindButton();//响应查找按钮事件
afx_msgvoidOnListInsertButton();//响应插入按钮事件
afx_msgvoidOnListDeleteButton();//响应删除按钮事件
afx_msgvoidOnListMergeButton();//响应合并按钮事件
afx_msgLRESULTOnListUpdate(WPARAMwParameter,LPARAMlpParameter);//响应对话框数据更新
3.KMP
afx_msgvoidOnKmpInputButton();//响应数据输入事件
afx_msgvoidOnKmpIndexButton();//响应模式匹配事件
afx_msgvoidOnKmpNextButton();//响应求Next值事件
afx_msgvoidOnKmpNextvalButton();//响应求Nextval事件
afx_msgLRESULTOnKmpUpdate(WPARAMwParameter,LPARAMlpParameter);//响应对话框数据更新
4.线程处理
UINTsqDlgCreate(LPVOIDlpParam);//顺序表创建
UINTsqDlgInsert(LPVOIDlpParam);//顺序表插入
UINTsqDlgDelete(LPVOIDlpParam);//顺序表删除
UINTsqDlgMerge(LPVOIDlpParam);//顺序表合并
UINTlistDlgCreate(LPVOIDlpParam);//链表创建
UINTlistDlgFind(LPVOIDlpParam);//链表查找
UINTlistDlgInsert(LPVOIDlpParam);//链表插入
UINTlistDlgDelete(LPVOIDlpParam);//链表删除
UINTlistDlgMerge(LPVOIDlpParam);//链表合并
UINTkmpDlgIndex(LPVOIDlpParam);//模式匹配
UINTkmpDlgNext(LPVOIDlpParam);//求Next值
UINTkmpDlgNextval(LPVOIDlpParam);//求Nextval值
5.其它函数
voidGetNext(CKmpDialog*pDlg,intnext[]);//求Next用于模式匹配
三、详细流程
四、重要算法
1.顺序表
算法1.1
//顺序表创建线程函数
UINTsqDlgCreate(LPVOIDlpParam)
{
CSqDialog*pDlg=(CSqDialog*)lpParam;
//更新过程中禁用相关按钮及系统菜单关闭按钮
…………
for(inti=0;i
{
pDlg->m_OpPos=i;
pDlg->m_CurrSq+=pDlg->m_CreateSq.GetAt(i);
pDlg->m_OpValue.SetAt(0,pDlg->m_CreateSq.GetAt(i));
pDlg->m_CurrSq+=_T("");
++(pDlg->m_CurrLength);
if(pDlg->m_CurrSize<=pDlg->m_CurrLength)
pDlg->m_CurrSize*=2;//增加容量到原容量2倍
Sleep(1000);
//发送消息给主线程更新对话框
pDlg->SendMessage(WM_USER+1,NULL,NULL);
}
//重新启用创建按钮及系统菜单关闭按钮
…………
//若顺序表不为空启用相关控件
if(0!
=pDlg->m_CurrLength)
{
(pDlg->GetDlgItem(IDC_SQ_INSERT_BUTTON))->EnableWindow(TRUE);
(pDlg->GetDlgItem(IDC_SQ_DELETE_BUTTON))->EnableWindow(TRUE);
}
return0;
}
算法1.2
//顺序表插入线程函数
UINTsqDlgInsert(LPVOIDlpParam)
{
CSqDialog*pDlg=(CSqDialog*)lpParam;
if(pDlg->m_InsertValue.IsEmpty())
{
MessageBox(NULL,_T("不能插入空元素!
"),_T("插入元素非法"),MB_OK);
return0;
}
if(pDlg->m_InsertPos>pDlg->m_CurrLength)
{
MessageBox(NULL,_T("请输入正确的插入位置!
"),_T("插入位置越界"),MB_OK);
return0;
}
//更新过程中禁用相关按钮及系统菜单关闭按钮
…………
++(pDlg->m_CurrLength);//元素长度加1
if(pDlg->m_CurrSize<=pDlg->m_CurrLength)
pDlg->m_CurrSize*=2;
pDlg->m_CurrSq+=_T("");//给显示串增加两个空字符
for(inti=pDlg->m_CurrLength-1;i>pDlg->m_InsertPos;--i)
{
pDlg->m_OpPos=i;
if(1==i)
{//当i为1时保留紧接元素0的空格
pDlg->m_CurrSq.SetAt(2,pDlg->m_CurrSq.GetAt(0));
pDlg->m_OpValue.SetAt(0,pDlg->m_CurrSq.GetAt(0));
}
else
{
pDlg->m_CurrSq.SetAt(2*i,pDlg->m_CurrSq.GetAt(2*i-2));
pDlg->m_CurrSq.SetAt(2*i-1,pDlg->m_CurrSq.GetAt(2*i-3));
pDlg->m_OpValue.SetAt(0,pDlg->m_CurrSq.GetAt(2*i-2));
}
Sleep(1000);
pDlg->SendMessage(WM_USER+1,NULL,NULL);
}
//插入元素
pDlg->m_OpPos=pDlg->m_InsertPos;
pDlg->m_CurrSq.SetAt(2*pDlg->m_InsertPos,pDlg->m_InsertValue.GetAt(0));
pDlg->m_OpValue.SetAt(0,pDlg->m_InsertValue.GetAt(0));
Sleep(1000);
pDlg->SendMessage(WM_USER+1,NULL,NULL);
//重新启用相关按钮及系统菜单关闭按钮
…………
return0;
}
算法1.3
//顺序表删除线程函数
UINTsqDlgDelete(LPVOIDlpParam)
{
CSqDialog*pDlg=(CSqDialog*)lpParam;
if(pDlg->m_DeletePos>pDlg->m_CurrLength-1)
{
MessageBox(NULL,_T("请输入正确的删除位置!
"),_T("删除位置越界"),MB_OK);
return0;
}
//更新过程中禁用相关按钮及系统菜单关闭按钮
…………
//获取待删除元素
pDlg->m_DeleteValue.SetAt(0,pDlg->m_CurrSq.GetAt(2*pDlg->m_DeletePos));
//删除前顺序表只有一个元素
if(1==pDlg->m_CurrLength)
{
pDlg->m_OpPos=0;
pDlg->m_OpValue.SetAt(0,pDlg->m_CurrSq.GetAt(0));
pDlg->m_CurrLength=0;
pDlg->m_CurrSq=_T("");//清空顺序表
Sleep(1000);
pDlg->SendMessage(WM_USER+1,NULL,NULL);
//删除成功后顺序表空只启用创建按钮和合并按钮
(pDlg->GetDlgItem(IDC_SQ_CREATE_BUTTON))->EnableWindow(TRUE);
(pDlg->GetDlgItem(IDC_SQ_MERGE_BUTTON))->EnableWindow(TRUE);
EnableMenuItem(hSysMenu,nCloseItemID,MF_ENABLED);
return0;
}
for(inti=pDlg->m_DeletePos;i
{
pDlg->m_OpPos=i;
if(0==i)
{
pDlg->m_CurrSq.SetAt(0,pDlg->m_CurrSq.GetAt
(2));
pDlg->m_OpValue.SetAt(0,pDlg->m_CurrSq.GetAt
(2));
}
else
{
pDlg->m_CurrSq.SetAt(2*i,pDlg->m_CurrSq.GetAt(2*i+2));
pDlg->m_CurrSq.SetAt(2*i+1,pDlg->m_CurrSq.GetAt(2*i+3));
pDlg->m_OpValue.SetAt(0,pDlg->m_CurrSq.GetAt(2*i+2));
}
Sleep(1000);
pDlg->SendMessage(WM_USER+1,NULL,NULL);
}
pDlg->m_CurrSq.Delete(pDlg->m_CurrSq.GetLength()-2,2);
--(pDlg->m_CurrLength);
Sleep(1000);
pDlg->SendMessage(WM_USER+1,NULL,NULL);
//重新启用相关按钮及系统菜单关闭按钮
…………
return0;
}
算法1.4
//顺序表合并线程函数
UINTsqDlgMerge(LPVOIDlpParam)
{
CSqDialog*pDlg=(CSqDialog*)lpParam;
//更新过程中禁用相关按钮及系统菜单关闭按钮
…………
intpa=0;
intpb=0;
intpc=0;
//m_SortedAm_SortedB含空格分隔符长度判断时应忽略
while(pa
{
if(pDlg->m_SortedA.GetAt(2*pa)
{
pDlg->m_SortedC+=pDlg->m_SortedA.GetAt(2*pa);
pDlg->m_CurrSq+=pDlg->m_SortedA.GetAt(2*pa);
pDlg->m_SortedC+=_T("");
pDlg->m_CurrSq+=_T("");
pDlg->m_OpPos=pc;
pDlg->m_OpValue=pDlg->m_SortedA.GetAt(2*pa);
pDlg->m_PosA=pa;
pDlg->m_ValueA=pDlg->m_SortedA.GetAt(2*pa);
++pa;
++pc;
}
else
{
pDlg->m_SortedC+=pDlg->m_SortedB.GetAt(2*pb);
pDlg->m_CurrSq
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 课程设计 报告 演示 系统