学位论文数据结构顺序表.docx
《学位论文数据结构顺序表.docx》由会员分享,可在线阅读,更多相关《学位论文数据结构顺序表.docx(24页珍藏版)》请在冰点文库上搜索。
学位论文数据结构顺序表
课程设计报告
课程设计名称:
数据结构和算法课程设计
课程设计题目:
顺序表结构和算法
课程设计任务书
课程设计名称
XXXX课程设计
专业
学生姓名
班级
学号
题目名称
起止日期
年
月
日起至
年
月
日止
课设内容和要求:
参考资料:
教研室审核意见:
教研室主任签字:
指导教师(签名)
年
月
日
学生(签名)
年
月
日
课程设计总结:
课程设计课程设计结束了,在这次的课程设计中不仅检验了我所学习的知识,也培养了我如何去把握一件事情,如何去做一件事情,又如何完成一件事情的方法和技巧。
在设计过程中,和同学们相互探讨,相互学习,相互监督。
我学会了运筹帷幄,学会了宽容,学会了理解,也学会了做人与处世,这次课程设计对我来说受益良多。
课程设计是我们专业课程知识综合应用的实践训练,着是我们迈向社会,从事职业工作前一个必不少的过程“千里之行始于足下”,通过这次课程设计,我深深体会到这句千古名言的真正含义。
我今天认真的进行课程设计,学会脚踏实地迈开这一步,就是为明天能稳健地在社会大潮中奔跑打下坚实的基础。
由于本课题中的许多知识点都没有学过都要靠自己到课外的资料中去查找,在用的时候难免出现这样那样的错误。
如开始设计出来的菜单不是预想的那样,而是总个窗中出现混乱。
解决的这个问题的办法是调整。
一个系统的菜单和提示信息非常重要。
如果没有这些用户根本不知道怎么用你设计的这个系统。
在设计的调试过程中也无法顺利的完成调试工作。
有了一个清晰简单的菜单和一些提示信息这后,调试过程完成的非常顺利。
回顾起此次课程设计,至今我仍感慨颇多,的确,从拿到题目到完成整个编程,从理论到实践,虽然只有几天,但可以学到很多的东西,不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。
通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。
在设计的过程中遇到问题,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固,比如说结构体通过这次课程设计之后,一定把以前所学过的知识都用上。
本次课程设计结束了,对于我的影响很大。
我通过这次实践学到了许多知识。
学到了设计一个简单的系统。
要注意哪些方面。
也使我知道自己哪些方面做得还不够。
目录
目录
学术诚信声明I
1问题分析和任务定义1
1.1题目1
1.2内容1
2系统功能模块结构图2
3数据结构设计及使用说明3
3.1定义线性表抽象数据类型3
3.1.1基本操作:
3
3.2详细设计和编码4
3.2.1类型定义4
3.2.2顺序表初始化4
3.2.3子函数输出函数4
4相关函数的描述6
4.1本函数包含的十个函数6
4.1.1各函数之间的调用关系6
4.2主函数的代码7
4.3用法说明7
5算法的程序流程图8
6程序测试结果9
7参考文献11
8附录(程序清单)12
2
1问题分析和任务定义
1.1题目
顺序表结构和算法。
1.2内容
1、设计出顺序表结构的相关函数库,以便在程序设计中调用。
2、实现顺序表的各种基本函数以及常用函数。
3、给出1-2个例子,通过调用自己的库函数来实现问题的求解。
4、设计顺序表的相关函数,以便在程序调用中调用,进行顺序表中元素的插
入、查找、取出、删除等操作。
1.3要求
1、设计软件的系统功能模块及各模块的程序流程图。
2、采用模块化编程,系统中的各项功能分别用函数编写。
3、学生独立完成系统的设计,编码和调试工作并通过指导老师的检查。
4、按课程设计规范撰写课程设计报告。
2系统功能模块结构图
图1-顺序表结构功能模块图
3数据结构设计及使用说明
3.1定义线性表抽象数据类型
3.1.1基本操作:
SqLsetnull(L)
操作前提:
L是一个未初始化的线性表
操作结果:
将L初始化为一个空的线性表
操作前提:
L是一个已初始化的空表
操作结果:
建立一个非空的线性表L
SqLinsert(L,s,i)
操作前提:
线性表L已存在
操作结果:
将元素s插入到线性表L的i位置
SqLdelete(L,i)
操作前提:
线性表L已存在
操作结果:
将线性表L中i位置的元素删除,
SqLlocate(L,x)
操作前提:
线性表L已存在
操作结果:
在线性表L中查找元素x,
若存在,返回元素在表中的序号位置;
若不存在,返回-1
SqLlength_L(L)
初始条件:
线性表L已存在
操作结果:
返回L中数据元素个数
SqLget(L,i)
初始条件:
线性表L已存在
操作结果:
判断第i个数据元素值是否存在,存在则返回1;否则,返回0;
3.2详细设计和编码
3.2.1类型定义
typedefstruct
{Datatypedata[maxlen];
intlast;
}Sequenlist;/*将data和len封装成一个结构体*/
3.2.2顺序表初始化
Sequenlist*SqLsetnull()
{
Sequenlist*L;
L=(Sequenlist*)malloc(sizeof(Sequenlist));
L->last=-1;
return(L);
}
3.2.3子函数输出函数
voidprint(Sequenlist*L)
{
inth;
printf("显示结果为:
");
for(h=0;hlast+1;h++)
{
printf("%d",L->data[h]);
}/*输出顺序表中所有元素*/
printf("\n");
}
判表满
intSqLempty(Sequenlist*L)
{
if(L->last+1>=50)
return
(1);
else
return(0);
}
插入函数
intSqLinsert(Sequenlist*L,Datatypes,inti)
{
intj;
if(SqLempty(L)==1)
{
printf("表满溢出\n");
return(0);
}
elseif(i<1||i>L->last+2)
{
printf("位置出错\n");
return(0);
}
else
{
for(j=L->last;j>=i-1;j--)
L->data[j+1]=L->data[j];/*节点往后移动一个位置*/
L->data[i-1]=s;/*插入新元素s*/
L->last++;/*last仍指向最后一个元素*/
return
(1);
}
取数函数
intSqLget(Sequenlist*L,inti)
{
intx;
if(i<1||i>L->last+1)
{
printf("取数出错!
");
return(0);
}
else
x=L->data[i-1];
return
(1);
}
更新函数
intSqLupdate(Sequenlist*L,inti,ints)
{
if(i<1||i>L->last+2)
{
printf("位置出错\n");
return(0);
}
else
{
L->data[i-1]=s;
return
(1);
}
}
其中用switch来做选择操作,从而实现个子函数对应的功能。
4相关函数的描述
4.1本函数包含的十个函数
•主函数main()
•初始化顺序表函数SqLsetnull()
•显示顺序表内容函数print()
•插入元素函数SqLinsert()
•删除元素函数SqLdelete()
•查找元素函数SqLlocate()
•取值函数SqLget()
•判表满
4.1.1各函数之间的调用关系
4.2主函数的代码
main()
{说明一个单链表L;
初始化L;
建立L;
显示L;
}
4.3用法说明
程序执行后,首先输出:
“请输入表长:
”n
输入表长后,输出:
“请输入n个元素值:
”
输入n个元素值后,输出:
“请选择:
”
任意选择指定操作的某一操作序号:
如3
“输入需要删除的元素”
然后程序自动执行结果并显示出来
5算法的程序流程图
图二-顺序表的程序流程图
6程序测试结果
执行情况如下:
请正确输入4个元素:
1234
请选择:
1:
显示所有元素
2:
增加一个元素
3:
按数值删除某个元素
4:
按位置删除某个元素
5:
按位置更新
6:
按数值更新
7:
按位置查找某元素
8:
按值查找某元素
9:
退出程序
3
需要删除的元素:
4
显示结果为:
123
测试结果如下图所示:
图三插入一个数字
图四删除一个数字图五更改一个数字
7参考文献
【1】严蔚敏、陈文博,数据结构应用算法教程【M】.北京:
清华大学出版社,2011.5
【2】张小莉、王淼、罗文劼,数据结构与算法【M】.北京:
机械工业出版社,2014.4
8附录(程序清单)
#include
#include
typedefintDatatype;
typedefstructSequenlist
{
Datatypedata[50];
intlast;
}Sequenlist;
Sequenlist*SqLsetnull()
{
Sequenlist*L;
L=(Sequenlist*)malloc(sizeof(Sequenlist));
L->last=-1;
return(L);
}
voidprint(Sequenlist*L)
{
inth;
printf("显示结果为:
");
for(h=0;hlast+1;h++)
{
printf("%d",L->data[h]);
}/*输出顺序表中所有元素*/
printf("\n");
}
intSqLempty(Sequenlist*L)
{
if(L->last+1>=50)
return
(1);
else
return(0);
}
intSqLinsert(Sequenlist*L,Datatypes,inti)
{
intj;
if(SqLempty(L)==1)
{
printf("表满溢出\n");
return(0);
}
elseif(i<1||i>L->last+2)
{
printf("位置出错\n");
return(0);
}
else
{
for(j=L->last;j>=i-1;j--)
L->data[j+1]=L->data[j];/*节点往后移动一个位置*/
L->data[i-1]=s;/*插入新元素s*/
L->last++;/*last仍指向最后一个元素*/
return
(1);
}
}
intSqLdelete(Sequenlist*L,inti)
{
intj;
if(L->last<0)
{
printf("顺序表空!
");
return(0);
}
elseif(i<1||(i>L->last+1))/*检查空表及删除位置的合法性*/
{
printf("参数出错!
");
return(0);
}
else
{
for(j=i;j<=L->last+1;j++)
L->data[j-1]=L->data[j];
L->last--;
return
(1);
}
}
intSqLupdate(Sequenlist*L,inti,ints)
{
if(i<1||i>L->last+2)
{
printf("位置出错\n");
return(0);
}
else
{
L->data[i-1]=s;
return
(1);
}
}
intSqLget(Sequenlist*L,inti)
{
intx;
if(i<1||i>L->last+1)
{
printf("取数出错!
");
return(0);
}
else
x=L->data[i-1];
return
(1);
}
voidSqLlocate(Sequenlist*L,intx)
{
inti,z=0;
for(i=0;ilast+1;i++)
{
if(L->data[i]==x)
{
printf("该元素的位置为:
%d",i+1);
z=1;
}
}
if(z==0)
printf("不存在此元素!
");
}
voidDelete_x(Sequenlist*L,intx)
{
intj,k,z=0;
for(j=0;jlast+1;j++){
if(L->data[j]==x){
for(k=j;klast+1;k++){
L->data[k]=L->data[k+1];/*向前移动一个位置*/
}
L->last--;
j--;/*返回到删除的位置*/
z=1;
}
}
if(z==0)
printf("不存在此元素!
");
}
voidUpdate_x(Sequenlist*L,intx)
{
intj,k,z=0,t=1;
for(j=0;jlast+1;j++)
{
if(L->data[j]==x)
{
printf("将第%d次出现的数%d更改为:
",t,x);
scanf("%d",&k);
L->data[j]=k;
z=1;
t++;
}
}
if(z==0)
printf("不存在此元素!
");
}
intmain()
{
Sequenlist*L;
inti,j,t,s,h,m,n,flag=1;
L=SqLsetnull();
printf("请输入表长:
");
scanf("%d",&i);L->last=i-1;
printf("请输入%d个元素值:
",i);/*确定表长*/
for(t=0;t
scanf("%d",&L->data[t]);/*输入表中元素*/
while(flag)/*使用标识flag*/
{
printf("请选择:
\n");
printf("1:
显示所有元素\n");
printf("2:
增加一个元素\n");
printf("3:
按数值删除某个元素\n");
printf("4:
按位置删除某元素\n");
printf("5:
按位置更改\n");
printf("6:
按数值更改\n");
printf("7:
按位置查找(取)元素\n");
printf("8:
按值查找一个元素\n");
printf("9:
退出程序\n");/*输入顺序表元素之后显示选项*/
scanf("%d",&j);
switch(j)/*当输入数字j时自动调用函数库中的函数实现功能*/
{
case1:
{print(L);break;}
case2:
{
printf("输入需要插入的数值和位置:
");
scanf("%d%d",&s,&i);
h=SqLinsert(L,s,i);
if(h)
{
printf("插入之后的线性表:
");/*显示插入元素后的顺序表*/
print(L);
}
break;
}
case3:
{
printf("输入需要删除的元素:
");
scanf("%d",&s);
Delete_x(L,s);/*显示删除元素后的顺序表*/
print(L);
break;
}
case4:
{
printf("输入需要删除的数值位置:
");
scanf("%d",&s);
h=SqLdelete(L,s);
printf("\n");
if(h)
{
printf("删除之后的线性表:
\n");/*显示删除元素后的顺序表*/
print(L);
}
break;
}
case5:
{
printf("输入需要更改的位置和更改后的数据:
");
scanf("%d%d",&m,&n);
h=SqLupdate(L,m,n);
if(h)
{
printf("插入之后的线性表:
");/*显示更新元素后的顺序表*/
print(L);
}
break;
}
case6:
{
printf("输入需要更改的数");
scanf("%d",&m);
Update_x(L,m);
print(L);
break;
}
case7:
{
printf("取出第n个元素:
");
scanf("%d",&i);
h=SqLget(L,i);
if(h)
{
printf("所取的数据元素为:
");
printf("%d\n",L->data[i-1]);/*输出所取元素*/
}
else
printf("输入序号超出范围!
\n");/*输入不合法报错*/
break;
}
case8:
{
printf("输入需要查找的数值:
");
scanf("%d",&s);
SqLlocate(L,s);
printf("\n");
break;
}
case9:
flag=0;
printf("程序结束,按任意键退出!
\n");
}
}
return0;
}