2.1 线性表的类型定义1.线性表的定义 是由n(n=0)个数据元素a1.

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第二章 线性表(Linear_List)
2.1 线性表的类型定义
1.线性表的定义:
是由n(n>=0)个数据元素a1,a2,a3, ……an组成的有限序列。 其中:n为数据元素的个数,也称为表的长度。 当n=0 时,称为空表。 非空的线性表(n>0) 记作: ( a1,a2,a3, ……an) 表中ai-1是ai的直接前驱元素,ai+1是ai的直接后继元素。
a1 a2

ai-1 ai …
an
线性表的起始地址, 称作线性表的基地址
7
2.顺序表中数据元素的存储地址
若一个数据元素仅占一个存储单元,则其存储方式参见 下图。
从图中可见,第i个数据元素的地址为: LOC(ai)=LOC(a 1)+(i-1)
8
若每个数据元素占用l个存储单元,并以所占用的第一个单 元的存储地址作为数据元素的存储地址,则第i个数据元素的存 储位置为: LOC(ai) = LOC( a i-1 )+l
ADT List { 数据对象: D={ ai | ai ∈ElemSet, i=1,2,...,n, n≥0 }
数据关系: R={ <ai-1 ,ai >|ai-1 ,ai∈D, i=2,...,n } 基本操作: P19 } ADT List
5
注意: &L和L的区别
可类比merge(int *t, int n)和merge1(int t, int n)中
2
例1:26个英文字母组成的字母表
(A,B,C、…、Z)
例2:某校从1978年到1983年各种型号的计 算机拥有量的变化情况。 (6,17,28,50,92,188) 例3:学生健康情况登记表如下:
姓 名 学 号 性 别 年龄 健康情况
王小林
陈 红 刘建平
790631
790632 790633

女 男
参数t的不同情况,前者的t是指针变量,通过指针=地址 和实参建立联系,从而t的改变将影响实参值同时改变; 后者的t与实参是值传递,所以t的改变将不影响实参值。
6
2.2 线性表的顺序表示和实现(顺序表)
1. 线性表的顺序表示: 是指用一组地址连续的存储单元依次存放线性表 的数据元素,称这种存储结构的线性表为顺序表。 特点:在顺序表中逻辑结构上相邻的数据元素, 其物理位置也是相邻的。
11
(2)插入运算 在第i(1<=i<=n+1)个元素之前插入一个新的数据元素x。 使长度为n的线性表变为长度为n+1的线性表:
(a1,a2,…,ai-1,ai,…,an)
(a1,a2,…,ai-1,x, ai,…,an)
12

插入算法的思想:
1. 将线性表中的第i个至第n个数据元素后移一个位置(共需 移动n-i+1个数据元素),
10
4.顺序表的几种基本运算
(1)初始化运算 Status InitList_Sq(Sqlist &L){ L.elem=(Elemtype *)malloc (LIST_INIT_SIZE*sizeof(Elemtype)); //分配内存单元 if (! L.elem) exit (OVERFLOW); //存储分配失败 L.Length=0; //空表长度为0 L.Listsize=LIST_INIT_SIZE; //初始存储容量 return OK; }//InitList_Sq
1
2.线性表(a1,a2,a3, ……an)的特点:
在数据元素的非空有限集中, (1)存在唯一的一个被称为“第一个”的数据元素; (2)存在唯一的一个被称为“最后一个”的数据元素; (3)除第一个之外,集合中的每个数据元素均只有一个 前驱; (4)除最后一个外,集合中的每个数据元素均只有一个 后继。 线性表中的数据元素类型多种多样,但同一线性表 中的元素必定具有相同特性,在一些复杂的线性表中, 每一个数据元素又可以由若干个数据项组成,在这种情 况下,通常将数据元素称为记录(record)。
2. 将数据元素x插入到数据元素ai-1之后,将x存入elem[i]中,
3. 将线性表长度加1。
13

插入算法描述: status ListInsert-Sq(SqList &L, int i, ElemType e) { //在顺序线性表L中第i个位置之前插入新的元素e if (i<1 || i>L.length+1) return ERROR; //i值不合法 if (L.length>=L.listsize){ //当前存储空间已满,则增 加分配 newbase=(Elemtype* )realloc(L.elem, (L.listsize+LISTINCREMENT)*sizeof(Elemtype)) if (!newbase) exit (OVERFLOW); //存储分配失败 L.elem=newbase; } //新基址 L.Listsize + =Listincrement; //增加存储容量
18
20 21
健康
一般 健康
张立立
……..Baidu Nhomakorabea
790634
……..

…….
17
…….
神经衰弱
…….
3
• 注意:
(1)线性表中的所有数据元素的数据类型是一致的。 (2)数据元素在线性表中的位置只取决于它的序号。 (3)相邻数据元素之间存在着序偶关系。 (4)结点间的逻辑关系是线性的。
4
3.抽象数据类型线性表的定义如下:
LOC(ai)=LOC(a1)+(i-1)* l LOC(a1)称为基地址(第一个数据元素的存储位置)。
显然,数据元素在顺序表中位置取决于数据元素在线性表中的 位置。
9
3.顺序表的描述:
可用C语言的一维数组实现: #define LIST_INIT_SIZE 100 //线性表存储空 间的初始分配量 #define LISTINCREMENT 10 //线性表存储空 间的分配增量 注意: typedef struct{ C语言中数组 ElemType *elem; //存储空间基址,数组 的下标是从0 开始的,因此, 指针elem指示线性表的基地址 若L是SqList int length; //线性表的当前长度 类型的顺序表, int listsize; //当前分配的存储容量,以 则表中第i个 一个数据元素存储长度为单位 数据元素是 }SqList; L.elem[i-1]。
相关文档
最新文档