- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第2章線性表1
第2章 线性表
线性结构的特点:1)存在着一个头(第一个元素);2)存在着一个尾(最后一个元素);3)除了第一个元素外,其它的都有前驱(前面的那个元素);4)除了最后一个元素外,其它的都有后继。
2.1 线性表的类型定义
1、什么是线性表:n个数据元素存在着前后关系的元素序列。线性表有两种:顺序结构(数组)、链式结构(链表)。
2、线性表的抽象数据类型:
ADT List{
数据对象:
数据关系:
基本操作:
};
2.2 线性表的顺序表示和实现
2.2.1 顺序表
顺序表示:就是数组,但是与C语言中定义数组的方法略有不同。
在C中,定义一个100个元素的数组:
int a[100];
缺陷:将数组的长度写死,就只能装100个,多余的放不下。现在我们可以定义一个可变长度的顺序表,可以随着要求的增加而变长,要求减少而变短,必须使用C语言中malloc、realloc、free函数实现。
int *pa, *pb;
pa=(int*) mallc( 100*sizeof(int));
pb=(int*) realloc( pa, 200*sizeof(int) ); //注意:此函数非常耗时
free( pa );
free( pb );
另外,malloc和realloc都可能失败,所以需要在程序中进行判别:
if( (pa=(int*) mallc( 100*sizeof(int))==NULL )
{
printf(申请空间失败);
exit( 1 ); //直接退出程序
}
另外,一个可变长数组,当其变长后,其长度我们应该掌握,还需要掌握里面现在已经存放了多少个数据,从而可以形成一个结构体:
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
typedef int ElemType;
typedef struct{
ElemType *elem; //指向将要申请空间的首地址,其中ElemType就是用户所需要的数据类型,此处可假设为int
int length; //目前该顺序表中已经装了多少个元素,初始时为0个
int listsize; //申请到的空间的大小,一开始为100
}SqList;
第一个算法:初始化顺序表InitList_Sq函数,InitList_Sq( SqList L),用来初始化L,使得L有真实的空间。
SqList L; //定义变量L,但是L中的elem没有空间。
L.elem=(ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));
L.length=0;
L.listsize= LIST_INIT_SIZE;
2.2.2 课堂练习
1、将顺序表的另外几个函数实现:
1)LocateElemList_Sq:定位元素,从L中查找元素e所在的位置,如果存在返回TRUE,如果不存在,返回FALSE
2)ClearList_Sq:将L清空
3)DestroyList_Sq:销毁L
4)ListEmpty_Sq:判断L是否是空顺序表
5)ListInsert_Sq:将元素e插入到线性表L的第i个位置
6)ListDelete_Sq:从线性表L中删除第i个位置的元素
7)ListTraverse_Sq:遍历线性表L,从第0个元素到第L.length-1个元素,一一输出。
2.2.3 课后练习
1、MergeList_Sq:已知LA和LB均为非递减排列的顺序表,将其合并到LC中,并使LC的结果也是非递减排列的。(参照书P26)
2、练习书C语言部分的最后文件部分。
3、练习书试卷1
2.3 线性表的链序表示和实现
顺序表的主要优点:随机存取元素比较方便,如要第5个元素,可直接取:L.elem[5],其时间复杂度为O(1)。
缺点:
1)每插入或删除一个元素,都需要移动大量的元素。如,目前整个顺序表中有10个元素,现在要在第3个位置上插入一个元素,则必须从第4—第9个元素向后面移动一个位置,如果要删除第3个元素,则从第4—9个元素需要向前移动。总之,平均起来,需要n/2个元素。时间复杂度为O(n)。
2)事先很难准确地估计空间的大小,如果设得太小,后面不断地插入,使得空间不够,需要用realloc函数来扩大空间(这个函数效率非常地低)。如果事先设得太大,又浪费了空间。
线性表的链式表示,也就俗称的“链表”,Link List
2.3.1 线性链表
在顺序表中,元素都是存放在连续的空间中,所以才能够用L.elem[5]这种方法进行随机存取,因为它们的地址可以通过简单的运算得出。
链表是这样构成的:数据在内存中的位置不连续,可以乱七八糟。但是,
文档评论(0)