第2章线性表课件.ppt
《第2章线性表课件.ppt》由会员分享,可在线阅读,更多相关《第2章线性表课件.ppt(90页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第第2 2章章 线性表线性表 2.1 2.1 线性表的基本概念线性表的基本概念 2.2 2.2 线性表的顺序存储线性表的顺序存储2.3 2.3 线性表的链式存储线性表的链式存储2.4 2.4 线性表的应用线性表的应用 本章小结本章小结 2.1 2.1 线性表的基本概念线性表的基本概念 2.1.1 线性表的定义线性表的定义2.1.2 线性表的运算线性表的运算2.1.1 2.1.1 线性表的定义线性表的定义 线性表是由零个或多个具有相同特性的数据线性表是由零个或多个具有相同特性的数据元素组成的一个有限序列。元素组成的一个有限序列。该序列中所含元素的该序列中所含元素的个数叫做线性表的长度个数叫做线性
2、表的长度,用用n表示表示,n0。 当当n=0时时,表示线性表是一个空表表示线性表是一个空表,即表中不包即表中不包含任何元素。设序列中第含任何元素。设序列中第i (i表示位序表示位序)个元素为个元素为ai(1in)。 线性表的一般表示为线性表的一般表示为: (a1,a2,ai,ai+1,an) 其中其中a1为第一个元素为第一个元素,又称做表头元素又称做表头元素, a2为第为第二个元素二个元素, an为最后一个元素为最后一个元素,又称做表尾元素。又称做表尾元素。 例如例如,在线性表在线性表 (1,4,3,2,8,10)中中, 1为表头元素为表头元素,10为表尾元素。为表尾元素。二元组表示二元组表示
3、List=(D,R)D=ai|ai Elemset, i=1,2,n, n=0R=| ai-1, ai D , i=2,3,n, n=0 2.1.2 2.1.2 线性表的运算线性表的运算 线性表的基本运算如下线性表的基本运算如下: (1)初始化线性表初始化线性表InitList(&L): 构造一个空的线性构造一个空的线性表表L。 (2)销毁线性表销毁线性表DestroyList(&L):释放线性表释放线性表L占用占用的内存空间。的内存空间。 (3)判线性表是否为空表判线性表是否为空表ListEmpty(L):若若L为空表为空表,则返回真则返回真,否则返回假。否则返回假。 (4)求线性表的长度求
4、线性表的长度ListLength(L):返回返回L中元素个中元素个数。数。 (5)输出线性表输出线性表DispList(L):当线性表当线性表L不为空时不为空时,顺序显示顺序显示L中各结点的值域。中各结点的值域。 (6)求线性表求线性表L中指定位置的某个数据元素中指定位置的某个数据元素GetElem(L,i, &e):用用e返回返回L中第中第 i(1iListLength(L)个元素的值。个元素的值。 (7)定位查找定位查找LocateElem(L,e):返回返回L中第中第1个值域个值域与与e相等的位序。若这样的元素不存在相等的位序。若这样的元素不存在,则返回值为则返回值为0。 (8)插入数据
5、元素插入数据元素ListInsert(&L,i,e):在在L的第的第i(1iListLength(L)+1)个元素之前插入新的元素个元素之前插入新的元素e,L的长度增的长度增1。 (9)删除数据元素删除数据元素ListDelete(&L,i,&e):删除删除L的第的第i(1iListLength(L)个元素个元素,并用并用e返回其值返回其值,L的长度的长度减减1。例例1 在线性表在线性表La中删除所有值为中删除所有值为x的结点。的结点。例例2 假设有两个集合假设有两个集合 A 和和 B 分别用两个线性表分别用两个线性表 LA 和和 LB 表示表示,即线性表中的数据元素即为集合中的成即线性表中的
6、数据元素即为集合中的成员。编写一个算法求一个新的集合员。编写一个算法求一个新的集合AB。 本算法思想本算法思想:先初始化线性表先初始化线性表LC,将将LA的所有的所有元素复制到元素复制到LC中中,然后扫描线性表然后扫描线性表LB,若若LB的当前的当前元素不在线性表元素不在线性表LA中中,则将其插入到则将其插入到LC中。算法如中。算法如下下:void unionList(List &LA,List LB) /将所有在将所有在Lb中但不在中但不在La中的元素插入到中的元素插入到LaLa_len=listlength(La); Lb_len=listlength(Lb);/求表的长度求表的长度 fo
7、r (i=1;i=Lb_len;i+) GetElem(Lb,i,e);/取取lb中第中第i个元素到个元素到e中中 if(!LocateElem(La,e) ListInsert(Lc,i,e); /union2.2 2.2 线性表的顺序存储线性表的顺序存储2.2.1 线性表的顺序存储线性表的顺序存储顺序表顺序表2.2.2 顺序表基本运算的实现顺序表基本运算的实现2.2.1 2.2.1 线性表的顺序存储线性表的顺序存储顺序表顺序表 线性表的顺序存储结构就是线性表的顺序存储结构就是:把线性表中的所有把线性表中的所有元素按照其逻辑顺序依次存储到从计算机存储器元素按照其逻辑顺序依次存储到从计算机存储
8、器中指定存储位置开始的一块连续的存储空间中。中指定存储位置开始的一块连续的存储空间中。 这样这样, 线性表中第一个元素的存储位置就是指线性表中第一个元素的存储位置就是指定的存储位置定的存储位置, 第第i+1个元素个元素(1in-1)的存储的存储位置紧位置紧接在第接在第i i个元素的存储位置的后面。个元素的存储位置的后面。 用一组地址连续的存储单元依次存储用一组地址连续的存储单元依次存储线性表中的元素,以元素在计算机内物线性表中的元素,以元素在计算机内物理地址相邻表示线性表中数据元素之间理地址相邻表示线性表中数据元素之间的逻辑关系的逻辑关系。 假定线性表的元素类型为假定线性表的元素类型为Elem
9、Type,则每个元素则每个元素所占用存储空间大小所占用存储空间大小(即字节数即字节数)为为sizeof(ElemType),整个线性表所占用存储空间的大小为整个线性表所占用存储空间的大小为: n*sizeof(ElemType)其中其中,n表示线性表的长度。表示线性表的长度。 a a1 1 LOC(A) 0 a a2 2 LOC(A)+sizeof(ElemType) 1 线性表存储空间线性表存储空间 存储地址存储地址 下标位置下标位置 a ai i LOC(A)+(i-1)*sizeof(ElemType) i-1 a an n LOC(A)+(n-1)*sizeof(ElemType) n
10、-1 LOC(A)+(MaxSize-1)*sizeof(ElemType) MaxSize-1 顺序表示意图顺序表示意图 Loc(ai+1)=Loc(ai)+l Loc(ai)=Loc(a1)+(i-1)*l 线性表的顺序存储结构是一种线性表的顺序存储结构是一种随机存取随机存取的的存储结构。存储结构。 描述:描述:/define LIST_Init_Size 100/define LISTINCREMENT 10Typedef Struct ElemType *elem; /存储空间基地址存储空间基地址 int length; /有效长度有效长度 int listsize;/分配的容量分配的
11、容量SqList;2.2.2 2.2.2 顺序表基本运算的实现顺序表基本运算的实现 一旦采用顺序表存储结构一旦采用顺序表存储结构,我们就可以用我们就可以用C/C+语言实现线性表的各种基本运算。为了方便语言实现线性表的各种基本运算。为了方便,假设假设数据类型为数据类型为ElemType。 (1)初始化线性表初始化线性表InitList(L) 该运算的结果是构造一个空的线性表该运算的结果是构造一个空的线性表L。实际上只。实际上只需将需将length成员设置为成员设置为0即可。即可。Status InitList(SqList &L) /构造一个空的线性表构造一个空的线性表LL.elem=(Elem
12、Type*)malloc(LIST_Init_Size*sizeof(ElenType); if (!L.elem) exit (overflow); / 存储分配失败存储分配失败 L.length=0; L.listsize=LIST_Init_Size; return(OK); /InitList_Sq本算法的时间复杂度为本算法的时间复杂度为O(1)。 (2)销毁线性表销毁线性表DestroyList(L) 该运算的结果是释放线性表该运算的结果是释放线性表L占用的内存空间。占用的内存空间。 void DestroyList(SqList &L) free(L); 本算法的时间复杂度为本算法
13、的时间复杂度为O(1)。 (3)判定是否为空表判定是否为空表ListEmpty(L) 该运算返回一个值表示该运算返回一个值表示L是否为空表。若是否为空表。若L为空为空表表,则返回则返回1,否则返回否则返回0。 int ListEmpty(SqList L) return(L.length=0); 本算法的时间复杂度为本算法的时间复杂度为O(1)。 (4)求线性表的长度求线性表的长度ListLength(L) 该运算返回顺序表该运算返回顺序表L的长度。实际上只需返回的长度。实际上只需返回length成员的值即可。成员的值即可。 int ListLength(SqList L) return(L.
14、length); 本算法的时间复杂度为本算法的时间复杂度为O(1)。 (5)输出线性表输出线性表DispList(L) 该运算当线性表该运算当线性表L不为空时不为空时,顺序显示顺序显示L中各元素的中各元素的值。值。 void DispList(SqList L) if (ListEmpty(L) return;for (i=0;iL.length;i+)printf(%c,L.elemi);printf(n); 本算法中基本运算为本算法中基本运算为for循环中的循环中的printf语句语句,故时间复杂度为故时间复杂度为: O(L.length)或或O(n) (6)求某个数据元素值求某个数据元素
15、值GetElem(L,i,e) 该运算返回该运算返回L中第中第 i(1iListLength(L)个元素的值个元素的值,存放在存放在e中。中。 int GetElem(SqList *L,int i,ElemType &e) if (iL.length) return 0;e=L.elemi-1;return 1; 本算法的时间复杂度为本算法的时间复杂度为O(1)。 (7)按元素值查找按元素值查找LocateElem(L,e) 该运算顺序查找第该运算顺序查找第1个值域与个值域与e相等的元素的相等的元素的位序位序。若这样的元素不存在若这样的元素不存在,则返回值为则返回值为0。 int Locat
16、eElem(SqList L, ElemType e) i=0;while (i=L.length)return 0;else return i+1; (8)插入数据元素插入数据元素ListInsert(L,i,e) 该 运 算 在 顺 序 表该 运 算 在 顺 序 表 L 的 第的 第 i 个 位 置个 位 置(1iListLength(L)+1)上插入新的元素上插入新的元素e。 思路:思路:如果如果i值不正确值不正确,则显示相应错误信息;则显示相应错误信息;否则将顺序表原来第否则将顺序表原来第i个元素及其后元素均后移个元素及其后元素均后移一个位置一个位置,空出一个位置插入新元素;最后顺序空
17、出一个位置插入新元素;最后顺序表长度增表长度增1。 int ListInsert(SqList &L,int i,ElemType e) /在顺序表在顺序表L中第中第i个元素前插入个元素前插入e if (iL.length+1) return ERROR;/i值不合法值不合法 if(L.Length=L.Listsize)/当前分配已满,增加空间当前分配已满,增加空间 newbase=(ElemType*) realloc(L.elem, (L.Listsize+LISTINCREMENT)*sizeof(ElemType); if (!newbase) exit(Overflow);/存储分
18、配失败存储分配失败 L.elem=newbase; L.listsize+=LISTINCREMENT; q=&(L.elemi-1);/q为插入位置为插入位置 for (p=&(L.elemL.length-1; p=q; -p) *(p+1)=*p;/元素后移元素后移 *q=e; + L.length /顺序表长度增顺序表长度增1 return (ok); 对于本算法来说对于本算法来说,元素移动的次数不仅与表长元素移动的次数不仅与表长L.length=n有关有关,而且与插入位置而且与插入位置i有关有关:当当i=n+1时时,移移动次数为动次数为0;当;当i=1时时,移动次数为移动次数为n,达
19、到最大值。在达到最大值。在线性表线性表sq中共有中共有n+1个可以插入元素的地方。假设个可以插入元素的地方。假设pi(= )是在第是在第i个位置上插入一个元素的概率个位置上插入一个元素的概率,则在则在长度为长度为n的线性表中插入一个元素时所需移动元素的线性表中插入一个元素时所需移动元素的平均次数为的平均次数为: 因此插入算法的平均时间复杂度为因此插入算法的平均时间复杂度为O(n)。11n)(2)1(11)1(1111nOninninniniip (9)删除数据元素删除数据元素ListDelete(L,i,e) 该运算删除顺序表该运算删除顺序表L的第的第i(1iListLength(L)个元素。
20、个元素。 思路思路:如果:如果i值不正确值不正确,则显示相应错误信息;则显示相应错误信息;否则将线性表第否则将线性表第i个元素以后元素均向前移动一个个元素以后元素均向前移动一个位置位置,这样覆盖了原来的第这样覆盖了原来的第i个元素个元素,达到删除该元达到删除该元素的目的;最后顺序表长度减素的目的;最后顺序表长度减1。int ListDelete(SqList &L, int i, ElemType &e) if (iL.length)return ERROR; p=&(L.elemi-1); e=*p; q=L.elem+L.length-1; /表尾的位置表尾的位置 for (+p; p=q
21、; +p) *(p-1)=*p;/被删位置以后的元素前移被删位置以后的元素前移 -L.length;/顺序表长度减顺序表长度减1 return Ok; 对于本算法来说对于本算法来说,元素移动的次数也与表长元素移动的次数也与表长n和和删除元素的位置删除元素的位置i有关有关:当当i=n时时,移动次数为移动次数为0;当;当i=1时时,移动次数为移动次数为n-1。在线性表。在线性表sq中共有中共有n个元素可以个元素可以被删除。假设被删除。假设pi(pi= )是删除第是删除第i个位置上元素的概个位置上元素的概率率,则在长度为则在长度为n的线性表中删除一个元素时所需移的线性表中删除一个元素时所需移动元素的
22、平均次数为动元素的平均次数为: = 因此删除算法的平均时间复杂度为因此删除算法的平均时间复杂度为O(n)。)(21)(1)(11nOninninpninii n1 例例3 设计一个算法设计一个算法,将将x插入到一个有序插入到一个有序(从从小到大排序小到大排序)的线性表的线性表(顺序存储结构即顺序表顺序存储结构即顺序表)的适当位置上的适当位置上,并保持线性表的有序性。并保持线性表的有序性。 解解:先通过比较,在顺序表先通过比较,在顺序表L中找到存放中找到存放x的的位置位置i,然后将然后将x插入到插入到L.elemi中中,最后将顺序表最后将顺序表的长度增的长度增1。 void Insert(SqL
23、ist &L, ElemType x) i=0; while (iL.length & L.elemi=i;j-) L.elemj+1=L.elemj; L.elemi=x; L.length+; 例例4 设计一个算法设计一个算法,将两个元素有序将两个元素有序(从小到从小到大大)的顺序表合并成一个有序顺序表。的顺序表合并成一个有序顺序表。 思路思路:将两个顺序表进行二路归并。例如将两个顺序表进行二路归并。例如: 顺序表顺序表p:1,3,5 i扫描扫描p 顺序表顺序表q:2,4,10,20 j扫描扫描q 归并到顺序表归并到顺序表r中中 k记录记录r中元素个数中元素个数 1(i=0) 2(j=0)
24、 将将1(i=1)插入插入r(k=1) 3(i=1) 2(j=0) 将将2(j=1)插入插入r(k=2) 3(i=1) 4(j=1) 将将3(i=2)插入插入r(k=3) 5(i=2) 4(j=1) 将将4(j=2)插入插入r(k=4) 5(i=2) 10(j=2) 将将5(j=3)插入插入r(k=5)k=5) 将将q q中余下元素插入中余下元素插入r r中。中。 SqList merge(SqList p, SqList q, SqList &r) i=j=k=0; r=(SqList *)malloc(sizeof(SqList); while (ip.length & jq.length
25、) if (p.elemiq.elemj) r. elemk=p.elem i; i+;k+; else r.elemk=q. elemj; j+;k+; while (ip.length) r.elemk=p.elemi; i+;k+; while (jq.length) r.elemk=q.elemj; j+;k+; r.length=k; /或或p.length+q.length 例例5 已知长度为已知长度为n的线性表的线性表A采用顺序存储结构采用顺序存储结构,编写一个时间复杂度为编写一个时间复杂度为O(n)、空间复杂度为、空间复杂度为O(1)的的算法算法,该算法删除线性表中所有值为该算
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 线性 课件
限制150内