线性表的基本操作与实现 文档在线提供.docx
- 文档编号:3933916
- 上传时间:2022-11-26
- 格式:DOCX
- 页数:14
- 大小:42.20KB
线性表的基本操作与实现 文档在线提供.docx
《线性表的基本操作与实现 文档在线提供.docx》由会员分享,可在线阅读,更多相关《线性表的基本操作与实现 文档在线提供.docx(14页珍藏版)》请在冰豆网上搜索。
线性表的基本操作与实现文档在线提供
课程设计任务书
2008—2009学年第二学期
专业班级:
07普本信计4班学号:
070601187姓名:
范志伟
课程设计名称:
数据结构
设计题目:
线性表的基本操作与实现
完成期限:
自2009年6月16日至2009年6月23日共1周
设计依据、要求及主要内容:
一、内容和设计目的
线性表是最基本的线性结构,任何线性结构都可以用线性表表示。
线性表的结构在信息检索、程序设计语言的编译等许多方面有广泛的应用。
本次设计主要是运用线性表的插入、删除和查找,并运用C语言的一些知识编写出程序使算法得以实现。
二、设计要求
线性表的性质和基本操作,线性表中的所有结点的数据类型是相同的,每个结点在存储器中占用大小相同的空间。
三、参考文献
[1]杨谊,喻德旷,李光明.数据结构(C++版)[M].北京:
冶金工业出版社,2003.
[2]严蔚敏,吴伟民.数据结构(C语言版)[M].北京:
清华大学出版社,2008.
[3]熊岳山,刘越.数据结构与算法[M].北京:
电子工业出版社,2007.
计划答辩时间:
2009年6月19日
工作任务与工作量要求:
查阅文献资料不少于3篇,课程设计报告1篇不少于3000字。
指导教师(签字):
教研室主任(签字):
批准日期:
年月日
线性表的基本操作与实现
摘要
线性表是最基本、最简单、也是最常用的一种数据结构。
线性表中数据元素之间的关系是一对一的关系,即除了第一个和最后一个数据元素之外,其它数据元素都是首尾相接的。
线性表的逻辑结构简单,便于实现和操作。
因此,线性表这种数据结构在实际应用中是广泛采用的一种数据结构。
关键词:
线性表;插入;删除;创建;查找.
1数据结构简述
数据结构是计算机存储、组织数据的方式。
数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。
通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。
数据结构往往同高效的检索算法和索引技术有关。
数据结构是计算机存储、组织数据的方式。
数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。
通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率的算法。
数据结构往往同高效的检索算法和索引技术有关。
数据结构在计算机科学界至今没有标准的定义。
个人根据各自的理解而有不同的表述方法:
SartajSahni在他的《数据结构、算法与应用》一书中称:
“数据结构是数据对象,以及存在于该对象的实例和组成实例的数据元素之间的各种联系。
这些联系可以通过定义相关的函数来给出。
”他将数据对象(dataobject)定义为“一个数据对象是实例或值的集合”。
CliffordA.Shaffer在《数据结构与算法分析》一书中的定义是:
“数据结构是ADT(抽象数据类型AbstractDataType)的物理实现。
”LobertLKruse在《数据结构与程序设计》一书中,将一个数据结构的设计过程分成抽象层、数据结构层和实现层。
其中,抽象层是指抽象数据类型层,它讨论数据的逻辑结构及其运算,数据结构层和实现层讨论一个数据结构的表示和在计算机内的存储细节以及运算的实现。
一般认为,一个数据结构是由数据元素依据某种逻辑联系组织起来的。
对数据元素间逻辑关系的描述称为数据的逻辑结构;数据必须在计算机内存储,数据的存储结构是数据结构的实现形式,是其在计算机内的表示;此外讨论一个数据结构必须同时讨论在该类数据上执行的运算才有意义。
在许多类型的程序的设计中,数据结构的选择是一个基本的设计考虑因素。
许多大型系统的构造经验表明,系统实现的困难程度和系统构造的质量都严重的依赖于是否选择了最优的数据结构。
许多时候,确定了数据结构后,算法就容易得到了。
有些时候事情也会反过来,我们根据特定算法来选择数据结构与之适应。
不论哪种情况,选择合适的数据结构都是非常重要的。
选择了数据结构,算法也随之确定,是数据而不是算法是系统构造的关键因素。
这种洞见导致了许多种软件设计方法和程序设计语言的出现,面向对象的程序设计语言就是其中之一。
2线性表的概念
线性表是一种线性结构,是n(n>=0)个数据元素
的有限序列,它的结构在本质上只有元素间的线性关系。
所谓线性关系,即在上述序列中,除第一个元素外,每个元素有且仅有一个直接前驱;除最后一个元素外,每个元素有且仅有一个直接后继。
这些元素,或者叫结点,或者叫记录,是独立的信息。
它可以是一个单独的符号,如英文字母表(A,B,…Z);也可以由若干数据项组成,如人员信息表,数据元素由编号、姓名、性别、职务四个数据项组成。
线性表的一般表示为:
一个线性表可用一个标识符来命名,例如:
数据元素在线性表中的位置只取决于它们自己的序号,即
是它的第一个元素,
是它的第二个元素,……,依此类推。
用二元组方式表示线性表为:
linear_list=(
)
=
其中的ElemType为基本数据类型或自定义数据类型。
线性表中数据元素的的个数,称作线性表的长度。
线性表的长度是可变的。
当插入一个元素时线性表的长度就增加1;当从线性表中删除一个元素时,线性表的长度就减少1。
线性表是一种线性结构,而任何线性结构都可以用线性表表示。
线性表的结构在信息检索、程序设计语言的编译等多方面由广泛的应用。
在日常生活中也可以见到各种线性表的应用例子,如人事管理表、商品库存表、列车时刻表、图书目录表、员工工资表等每种线性表都可以按照其中的一个字段的值进行排序。
在一个线性表中如果存在按值排序的字段,则该字段叫有序字段,该线性表为有序表,否则叫无序表。
2.1线性表的逻辑定义
线性结构是最简单且最常用的数据结构。
线性表是一种典型的线性结构。
它的逻辑定义为:
线性表(LinearList)是由
个数据元素(结点)
组成的有限序列。
①数据元素的个数n定义为表的长度(
时称为空表)。
②将非空的线性表(
)记作:
③数据元素
只是个抽象符号,其具体含义在不同情况下可以不同。
线性表的逻辑结构特征为:
①有且仅有一个开始结点
,没有直接前驱,有且仅有一个直接后继
;
②有且仅有一个终结结点
,没有直接后继,有且仅有一个直接前驱
;
③其余的内部结点
都有且仅有一个直接前趋
和一个
。
2.2关于线性表的创建
1)线性表的顺序存储
线性表的顺序存储是指用一组地址连续的存储单元依次存储线性表中的数据元素,从而使得逻辑上相邻的两个元素在物理位置上也相邻,如图8-1所示。
在这种存储方式下,存储逻辑关系无须占用额外的存储空间。
一般地,以Loc(a1)表示线性表中第一个元素的存储位置,则在顺序存储结构中,第i个元素ai的存储位置为:
Loc(ai)=Loc(a1)+(i–1)×L
其中L是表中每个元素所占空间的大小。
根据该计算关系,可随机存取表中的任一个元素
线性表采用顺序存储结构的优点是可以随机存取表中的元素,查找元素的速度很快,缺点是插入和删除操作需要移动元素。
插入元素前要移动元素以挪出空的存储单元,然后再插入元素;删除元素时同样需要移动元素,以填充被删除的元素空出来的存储单元。
2.3线性表操作
在顺序表类SeqList中增加成员函数voidReverse(),实现顺序表的逆置。
在顺序表类SeqList中增加成员函数boolDelete(constT&x),删除表中所有元素值等于x的元素。
若表中存在这样的元素,则删除之,且函数返回true;否则函数返回false。
编写main函数,调用上述新增函数。
2.4线性表的结构特点
1)均匀性:
虽然不同数据表的数据元素可以是各种各样的,但对于同一线性表的各数据元素必定具有相同的数所类长度。
2)有序性:
各数据元素在线性表中的位置只取决于它们的序与,数据元素之前的相对位置是线性的,即存在唯一的“第一个“和“最后一个“的数据元素,除了第一个和最后一个外,其它元素前面均只有一个数据元素直接前趋和后面均只有一个数据元素(直接后继)。
在实现线性表数据元素的存储方面,一般可用顺序存储结构和链式存储结构两种方法。
链式存储结构将在本网站线性链表中介绍,本章主要介绍用数组实现线性表数据元素的顺序存储及其应用。
另外栈.队列和串也是线性表的特殊情况,又称为受限的线性结构。
3实例应用
#include
#include
#include
#defineOK1
#defineERROR0
#defineOVERFLOW-2
typedefintElemType;
typedefintStatus;
#defineLIST_INIT_SIZE100
#defineLISTINCREMENT10
typedefstruct{
ElemType*elem;
intlength;
intlistsize;
}SqList;
StatusInitList_Sq(SqList&L){
inti;
L.elem=(ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));
if(!
L.elem)exit(OVERFLOW);
for(i=1;i<=5;i++)
scanf("%d",&L.elem[i-1]);
L.length=5;
L.listsize=LIST_INIT_SIZE;
returnOK;
}//InitList_Sq
StatusPrintList_Sq(SqListL){
inti;
printf("顺序表中的元素为:
");
for(i=1;i<=L.length;i++)
printf("%d",L.elem[i-1]);
printf("\n");
returnOK;
}//PrintList_Sq
StatusListInsert_Sq(SqList&L,inti,ElemTypee){
ElemType*p,*q;
if(i<1||i>L.length+1)returnERROR;
if(L.length>=L.listsize){
L.elem=(ElemType*)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(ElemType));
if(!
L.elem)exit(OVERFLOW);
L.listsize+=LISTINCREMENT;
}
q=&(L.elem[i-1]);
for(p=&(L.elem[L.length-1]);p>=q;--p)*(p+1)=*p;
*q=e;
++L.length;
returnOK;
}//ListInsert_Sq
StatusListDelete_Sq(SqList&L,inti,ElemType&e){
ElemType*p,*q;
if((i<1)||(i>L.length))returnERROR;
p=&(L.elem[i-1]);
e=*p;
q=L.elem+L.length-1;
for(++p;p<=q;++p)*(p-1)=*p;
--L.length;
returnOK;
}//ListDelete_Sq
intLocateElem_Sq(SqListL,ElemTypee){
inti=1;
ElemType*p;
p=L.elem;
while(i<=L.length&&!
(*p++==e))++i;
if(i<=L.length)returni;
elsereturn0;
}//LocateElem_Sq
voidmain(){
SqListL;
ElemTypee;
intselect,i;
printf("输入五个元素,构建顺序表:
\n");
if(InitList_Sq(L)==OVERFLOW)
printf("分配失败,退出程序!
");
else
do
{
printf("\n1:
输出顺序表中的元素\n");
printf("\n2:
在顺序表的第i个位置插入元素\n");
printf("\n3:
删除顺序表第i个元素\n");
printf("\n4:
查找顺序表第i个元素\n");
printf("\n0:
结束操作\n");
scanf("%d",&select);
switch(select){
case1:
printf("\n");PrintList_Sq(L);break;
case2:
printf("\ninputi,e=");
scanf("%d%d",&i,&e);
if(ListInsert_Sq(L,i,e)!
=OK)printf("i值不合法或当前存储空间以满\n");
elsePrintList_Sq(L);break;
case3:
printf("inputi=");
scanf("%d",&i);
if(ListDelete_Sq(L,i,e)==ERROR)printf("i值不合法\n");
elsePrintList_Sq(L);break;
case4:
printf("inpute=");
scanf("%d",&e);
if(LocateElem_Sq(L,e)==0)printf("e值不存在\n");
elseprintf("e值在第%d个位置\n",LocateElem_Sq(L,e));break;
case0:
printf("操作结束\n");break;
default:
printf("输入选择出错!
\n");
}/*switch*/
}while(select!
=0);
}
运行结果:
请输入5个元素构建顺序表
1
2
3
4
5
1:
输出顺序表中的元素
2:
在顺序表中的第i位置插入元素
3:
删除顺序表中的第i元素
4:
查找顺序表中的第i元素
0:
结束操作
1顺序表的元素为12345
1:
输出顺序表中的元素
2:
在顺序表中的第i位置插入元素
3:
删除顺序表中的第i元素
4:
查找顺序表中的第i元素
0:
结束操作
2inpui=3
3顺序表的元素为:
123345
1:
输出顺序表中的元素
2:
在顺序表中的第i位置插入元素
3:
删除顺序表中的第i元素
4:
查找顺序表中的第i元素
0:
结束操作
4inpui=5
e的位置在第6个位置
1:
输出顺序表中的元素
2:
在顺序表中的第i位置插入元素
3:
删除顺序表中的第i元素
4:
查找顺序表中的第i元素
0:
结束操作
0
操作结束!
结论
独自完成课程设计确实有些淡但让我很有满足感和成就感而且以前也做过这种设计我相信经过几天的努力,数据结构的课程设计终于完成,运用线性表的知识对礼物分配问题进行研究。
所以这次比上次轻松了许多。
综合课程设计让我把以前学习到的知识得到了巩固和进一步的提高认识,对已有知识有了更进一步的理解和认识,让我们有了更好的实践;其次,在问题中由于阶段与备选状态都不多,对过程中间的信息处理也不复杂,只要求我们会运用所学知识对问题进行研究后得出算法即可。
另外,这次设计让我忙得很有充实感,感受到了同学之间互帮互助的益处及大家团结互助的精神,同时,更感受到了代老师对我们谆谆教诲时的认真和耐心,这才使得我们在很短的时间内就完成了自己的课题设计。
在课程设计中我对数据结构有很大的认识和了解。
近几十年来,计算机的应用领域日益扩大,早已不再局限于简单的数值运算,而涉及到问题的分析、数据结构框架的设计以及插入、删除、排序、查找等复杂的非数值处理和操作。
数据结构的学习就是为以后从事非数值处理的程序设计打下坚实的理论、方法和技术基础。
数据结构是从事计算机软件开发、应用人员必备的专业知识。
随着计算机的日益普及,掌握数据结构知识已成为计算机专业的基本要求。
通过这课程设计,我也发现了自身的不足之处,在以后的学习中我会不断的完善自己、不断进取。
这次的课程设计也使我意识到了理论与实践相结合的重要作用,学习到知识应该应用到实践中,去服务人类,服务社会。
参考文献
[1]杨谊,喻德旷,李光明.数据结构(C++版)[M].北京:
冶金工业出版社,2003.
[2]严蔚敏,吴伟民.数据结构(C语言版)[M].北京:
清华大学出版社,2008.
[3]熊岳山,刘越.数据结构与算法[M].北京:
电子工业出版社,2007.
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 线性表的基本操作与实现 文档在线提供 线性 基本 操作 实现 文档 在线 提供