- 1、本文档共19页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第2章线性表2第2章线性表2
第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、将顺序表的另外几个函数实现:(参见工程:SqList)
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 线性表的链序表示和实现
顺序表的主要优点:
1)随机存取元素比较方便,如要第5个元素,可直接取:L.elem[5],其时间复杂度为O(1)。
2)查找:如果将顺序表中的元素按照某种方法排列(如排序),则使用二分查找等方法,效率非常高。
缺点:
1)每插入或删除一个元素,都需要移动大量的元素。如,目前整个顺序表中有10个元素,现在要在第3个位置上插入一个元素,则必须从第4—第9个元素向后面移动一个位置,如果要删除第3个元素,则从第4—9个元素需要向前移动。总之,平均起来,需要n/2个元素。时间复杂度为O(n)。
计算方法:
(1)插入,假设原表中已经有n个元素,现在要插入一个元素。最坏情况下,这个元素可能要插到第0个位置,则需要移动元素n个;最好情况下,也可能是要插到最末尾,则移动元素个数为0个,平均起来(n+0)/2=n/2
(2)删除,最坏情况下,要删除的是第0个元素,则共需要移动n-1个;最好的情况下,要删除的是第n-1个(
文档评论(0)