第2章 线性表2.doc

  1. 1、本文档共19页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 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)

cxiongxchunj + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档