数据结构顺序表的实现的课程设计报告.docx

上传人:b****8 文档编号:23713857 上传时间:2023-05-20 格式:DOCX 页数:15 大小:130.37KB
下载 相关 举报
数据结构顺序表的实现的课程设计报告.docx_第1页
第1页 / 共15页
数据结构顺序表的实现的课程设计报告.docx_第2页
第2页 / 共15页
数据结构顺序表的实现的课程设计报告.docx_第3页
第3页 / 共15页
数据结构顺序表的实现的课程设计报告.docx_第4页
第4页 / 共15页
数据结构顺序表的实现的课程设计报告.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

数据结构顺序表的实现的课程设计报告.docx

《数据结构顺序表的实现的课程设计报告.docx》由会员分享,可在线阅读,更多相关《数据结构顺序表的实现的课程设计报告.docx(15页珍藏版)》请在冰豆网上搜索。

数据结构顺序表的实现的课程设计报告.docx

数据结构顺序表的实现的课程设计报告

前言

1.1设计背景和意义

1.1.1数据结构简介

数据结构是计算机存储、组织数据的方式。

数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。

通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。

数据结构往往同高效的检索算法和索引技术有关。

1.1.2选择算法的原因

在许多类型的程序的设计中数据结构的选择是一个基本的设计考虑因素。

许多大型系统的构造经验表明,系统实现的困难程度和系统构造的质量都严重的依赖于是否选择了最优的数据结构。

许多时候,确定了数据结构后,算法就容易得到了。

有些时候事情也会反过来,我们根据特定算法来选择数据结构与之适应。

不论哪种情况,选择合适的数据结构都是非常重要的。

1.2设计的原理

线性表是最常用的而且也是最简单的一种数据结构,线性表是N个数据元素的有限序列。

例如26个英文元素的字母表:

(A,B,C,D,···)。

其数据结构的描述为:

Linearlist=(D,R)其中:

D={ai|ai属于D0,i=1,2,3,···}R={N},N={|i=2,3,4,···}。

本实验是以数组的形式把有序表存放在计算机内存的一个连续的区域内,这样便有:

LOC(ai+1)=LOC(ai)+m。

其中m是存放每个元素所占的内存字数。

LOC(ai)=LO+m·(i-1)。

其中LO是ai的地址,即首地址。

工程概况

2.1项目所用的时间

从这个项目开始到结束总共历时7天。

完成于2011年12月18日。

2.2项目负责人

李欢,男,计算机科学与技术14-4,学生。

2.3项目指导人

朱赖红,男,信息工程学院教师,讲师。

 

正文

顺序表是在计算机内存中以数组的形式保存的线性表,是指用一组地址连续的存储单元依次存储数据元素的线性结构。

线性表采用顺序存储的方式存储就称之为顺序表。

顺序表是将表中的结点依次存放在计算机内存中一组地址连续的存储单元中

3.1设计的目的和意义

我们是计算机科学与技术专业的本科生,《数据结构》是我们重要的必修课程。

当代社会学要大学培养出理论扎实,动手实践能力强的大学生。

所以,本次课程设计的目的就在于通过一次实践性的活动加深对这门课程的理解,使我们在感性的认识上进一步升华为理性的认识。

为后继课程的学习打下坚实的基础。

马克思主义唯物辩证法认为,实践是连接客观实在和人主观意识的通道和桥梁。

物质对意识的作用以及意识对物质的反作用都蕴含在实践活动当中。

也就是,实践是检验真理的唯一标准。

对这门课的学习状况的好坏,用一次课程设计便可以检验出来。

而这,就是本次我们进行设计的意义之所在。

3.2目的和总体方案

顺序表存储位置是相邻连续的,可以随即访问的一种数据结构,一个顺序表在使用前必须指定起长度,一旦分配内存,则在使用中不可以动态的更改。

他的优点是访问数据是比较方便,可以随即的访问表中的任何一个数据。

目的:

1、理解和掌握顺序表的结构类型定义方法。

2、掌握建立顺序表的基本方法。

3、掌握显示顺序表元素的基本方法。

由于时间只有十天,故做了如下的计划安排,将这项工程分为两大部分:

程序的设计和程序的调试。

首先在程序的设计部分由分为几个步骤:

第一步:

查阅有关数据结构顺序表操作的资料,用一天的时间。

第二步:

设计这个项目的整体架构和算法。

用一到两天的时间。

第三步:

选择一门程序设计语言进行算法的描述。

两天的时间。

其次,进行程序的调试。

用一天。

3.3设计方法和内容

“工欲善其事,必先利其器”。

有了总体方案后必须用一个事半功倍的设计方法来提高程序设计的效率。

在这个项目的设计上,我选择了C语言作为算法的描述语言,因为C语言具有丰富的表达能力以及代码的高效性,并且有着良好的移植性和灵活性。

同时,采用“自顶向下,个个击破”的程序设计思路和思想,充分运用C语言强大的功能。

我将这个项目整体设分成了两个模块。

一个是功能函数模块群,主要实现设计方案中的具体功能,是整个项目的执行部分;另一个是主函数模块,主要实现对数据流和控制流的控制,使整个项目的控制部分。

这两大模块有机的结合共同构成了这个项目的全部面貌。

3.3.1硬件环境

微型计算机:

联想台式品牌机

中央处理器:

Pentuim4主频:

3.0GHz

主存容量:

512M

硬盘容量:

80G

3.3.2软件环境

WindowsXP操作系统

MicrosoftNotePad记事本程序

MicrosoftVisualC++编译器

3.3.3设计流程图

图3-1程序流程图

3.3.4设计内容

一、程序设计的基本算法介绍

1、顺序表的存储特点是:

只要确定了起始位置,表中任一元素的地址都通过下列公式得到:

LOC(ai)=LOC(a1)+(i-1)*L1≤i≤n其中,L是元素占用存储单元的长度。

3.4程序的设计思想和内容

1顺序实现设计思路:

我没有直接用数组的存储方式,而是采用连续分配内存的方式或者说我把数组实现的代码写了出来,没有直接用库里面的数组形式。

每次分配的数量为常量LISTINCREASMENT。

程序流程:

新建一个顺序表(初始表长为7)→显示构建的表及表长→依次检验删除,插入检索功能并显示操作后的顺序表

3.4.1程序设计的初始运行环境

这个项目是由主函数模块和功能函数模块组成的。

其中主函数模块是项目的控制部分,很重要的一个作用就是对整个程序的初始化功能。

在设计初始运行环境时,为了每一次栈操作后都可以进行对程序的初始化,采用了do…while循环语句构成一个无限循环,使得每一次栈操作之后都可以将程序初始化重新选择对栈的另一个操作,例如:

选择2,将若干个数据压入栈中之后,程序便又回到了初始的界面,我们可以选择4进行出栈操作。

代码如下:

#include

#include

#include

#include

#include

#defineLISTINCREASMENT2

#defineLISTSIZE5

typedefintElemType;

typedefstruct

{

ElemType*elem;

intlength;

intlistsize;

}Sqlist;

voidSqInitial(Sqlist*ps)

{

ps->elem=(ElemType*)malloc(LISTSIZE*sizeof(ElemType));

ps->length=0;

ps->listsize=LISTSIZE;

}

voidListInsert(Sqlist*ps,inti,ElemTypee)

{

if(i<1)printf("ERROR!

");

if(ps->length>=ps->listsize)

{ElemType*newbase=(ElemType*)realloc(ps->elem,(ps->listsize+LISTINCREASMENT)

*sizeof(ElemType));

ps->elem=newbase;

ps->listsize+=LISTINCREASMENT;

}

ElemType*q=&(ps->elem[i-1]);

ElemType*p;

for(p=&(ps->elem[ps->length-1]);p>=q;--p)

*(p+1)=*p;

*q=e;

++ps->length;

}

voidListDelete(Sqlist*ps,inti,ElemTypee)

{

if(i<1||i>ps->length)printf("ERROR!

");

ElemType*p=&(ps->elem[i-1]);

e=*p;

ElemType*q=ps->length+ps->elem-1;

for(++p;p<=q;++p)*(p-1)=*p;

--ps->length;

}

ElemTypeGetElem(Sqlist*ps,inti)

{

if(i<1||i>ps->length)printf("ERROR!

");

returnps->elem[i-1];

}

voidmain()

{

Sqlist*L;

intt=1,d;

L=newSqlist;

SqInitial(L);

printf("构建长度为7的顺序表。

\n");

for(t=1;t<=7;t++)

{

printf("Pleaseinputthe%dthlistelem:

",t);

scanf("%d",&d);

ListInsert(L,t,d);

}

printf("表长:

%d\n",L->length);

for(t=1;t<=L->length;t++)

printf("%d",L->elem[t-1]);

printf("\n删除的位置:

");

scanf("%d",&t);

ListDelete(L,t,d);

printf("删除元素的值:

%d\n",d);

printf("删除后的表:

");

for(t=1;t<=L->length;t++)

printf("%d",L->elem[t-1]);

printf("\n要插入的位置");

scanf("%d",&t);

printf("要插入的值");

scanf("%d",&d);

ListInsert(L,t,d);

printf("插入以后的表:

");

for(t=1;t<=L->length;t++)

printf("%d",L->elem[t-1]);

printf("\n要检索的元素的位置:

");

scanf("%d",&t);

d=GetElem(L,t);

printf("该元素的值为:

%d\n",d);

}

具体运行截面如下图:

图3-2界面的循环初始化

3.4.2顺序表的初始化

具体代码如下:

voidSqInitial(Sqlist*ps)

{

ps->elem=(ElemType*)malloc(LISTSIZE*sizeof(ElemType));

ps->length=0;

ps->listsize=LISTSIZE;

}

3.4.3顺序表的插入

构建长度为7的顺序表

具体程序代码及运行后的界面如下:

voidmain()

{

Sqlist*L;

intt=1,d;

L=newSqlist;

SqInitial(L);

printf("构建长度为7的顺序表。

\n");

for(t=1;t<=7;t++)

图3-3进栈操作

3.4.4输出表长、读表

具体操作代码如下:

{

printf("Pleaseinputthe%dthlistelem:

",t);

scanf("%d",&d);

ListInsert(L,t,d);

}

printf("表长:

%d\n",L->length);

for(t=1;t<=L->length;t++)

printf("%d",L->elem[t-1]);

图为两个数据的运行结果:

图3-4栈元素的删除操作

3.4.顺序表的删除操作

顺序表的删除的具体代码如下:

printf("\n删除的位置:

");

scanf("%d",&t);

ListDelete(L,t,d);

printf("删除元素的值:

%d\n",d);

printf("删除后的表:

");

for(t=1;t<=L->length;t++)

printf("%d",L->elem[t-1]);

图为删除元素与删除后的运行结果:

3.5.元素的插入

具体代码如下:

printf("\n要插入的位置");

scanf("%d",&t);

printf("要插入的值");

scanf("%d",&d);

ListInsert(L,t,d);

printf("插入以后的表:

");

for(t=1;t<=L->length;t++)

printf("%d",L->elem[t-1]);

图为元素插入以及插入后的表:

3.6.检索元素

检索元素的具体代码如下:

printf("\n要检索的元素的位置:

");

scanf("%d",&t);

d=GetElem(L,t);

printf("该元素的值为:

%d\n",d);

}

图为检索元素后的运行:

图3-5出栈操作

3.5设计创新与关键技术

这个课程设计是一个简单的设计,如果说有“设计创新与关键技术”的话,只能勉强说有设计创新,至于关键技术应该谈不上。

谈到设计创新,只能说在设计思路、设计方法和设计内容上有别人没有的东西。

而所用的技术倒是没有多少。

主要是运用了C语言丰富的表达能力,将栈的建立、进栈、出栈等操作形象的反应出来。

3.6结论

本次设计进展顺利,如期完成,并且达到了预先的设计要求,完全贯彻和执行了设计的总体方案。

对于栈的基本操作的描述和实现比较成功。

然而,限于时间和水平,这个设计还有很多的不足之处。

3.6.1存在的问题

一、没有使用图形的形式描述栈的操作。

主要是因为本设计主要是在MicroSoftVisualC++编译器调试,但VC的根目录下的Include文件夹中没有graphics.h这个头文件。

因此,在TurboC下编译成功的地源程序在VC中无法编译通过。

二、所有的对栈的操作只能当栈被初始化以后方可进行。

当栈被一次初始化后,所有的进栈操作只能进行一次,如果想在进行了其他的栈操作后再次进栈是不行的。

3.6.2解决方案

一、针对VC中没有graphics.h头文件的问题,可以到互联网上求助高手或自己到图书馆查阅相关的书籍。

二、针对进栈要等待初始化的问题,原因在于经过其他的栈操作改变了栈顶指针的位置,而第一次进栈是在空栈的基础之上,而有了数据再想进栈便违反了栈“先进后出”的原则了。

可以进行如下操作,将栈的结构体中的栈顶指针定义为一个全局变量或静态变量。

这样,便可以保证进栈的不受限制,可随时进栈。

 

参考文献

[1]严蔚敏.吴伟民编著.数据结构(C语言版).清华大学出版社.2006

[2]李春葆.曾慧.张植民编著.数据结构程序设计题典.清华大学出版社.2002

[3]郭翠英等编著.C语言课程设计案例精编.中国水利水电出版社.2004

[4]谭浩强编著.C程序设计.清华大学出版社.2005

[5]WilliamFord.WilliamTopp.《DataStructurewithC++》.清华大学出版社

[6]许卓群.张乃孝.杨冬青.唐世渭《数据结构》.高等教育出版社.1988年

[7]李廉治.姜文清.郭福顺《数据结构》.大连理工大学出版社.1989年

[8]晋良颍《数据结构》.人民邮电出版社.2002年

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 法律文书 > 调解书

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1