数据结构-02线性表.ppt
《数据结构-02线性表.ppt》由会员分享,可在线阅读,更多相关《数据结构-02线性表.ppt(61页珍藏版)》请在三一办公上搜索。
1、,数据结构(C语言描述)DATA STRUCTURES,第二章 线性表,2.1 线性表的类型定义2.1.1 线性表的定义2.1.2 线性表的基本操作2.2 线性表的顺序表示和实现2.2.1 顺序表-线性表的顺序存储表示2.2.2 顺序表中基本操作的实现2.2.3 顺序表其他算法举例2.3 线性表的链式表示和实现2.3.1 单链表和指针2.3.2 单链表的基本操作2.3.3 单链表的其他操作举例2.3.4 循环链表2.3.5 双向链表2.4 有序表2.5 顺序表和链表的综合比较,2.1 线性表的类型定义,线性表(Linear_List)是最简单,也是最基本的一种线性数据结构。它有两种存储表示:顺
2、序表和链表,它主要的操作是插入、删除和查找等。2.1.1 线性表的定义1)(3,8,5,7,10)是一个线性表,其中的数据元素是整数,按上述顺序排列,表中共有5个数据元素。2)(A,B,C,D,X,Y,Z)是一个线性表,其中的数据元素是英文字母,按字母顺序排列,共有26个数据元素。3)按字母顺序排列的学生姓名表。4)按字母顺序排列的商品列表。5)(1分、2分、5分、1角、2角、5角),2.1.1 线性表的定义,6)下图的学生学籍档案表,是稍复杂的线性表,表中元素可以由多个数据项组成,在这里每个学生档案是一个线性表,它由学号、姓名、和各项成绩组成。(和绪论中介绍的图书目录表类似),学生学籍档案表
3、,学号 姓名 入学分 数分,0101 赵前进 601 90,0102 华罗庚 640 98,0103 李龙 580 80,2.1.1 线性表的定义,线性表(Linear_List)是n(n0)个数据元素的有限序列,表中各个数据元素具有相同的特性,既属于同一数据对象,表中相邻的数据元素之间存在“序偶”关系。通常将线性表记做(a1,a2,ai-1,ai,ai+1,an-1,an,)(2-1)则表中ai-1领先于ai,ai领先于ai+1,称ai-1是ai的直接前驱元素,ai+1是ai的直接后继元素。n是表的长度。当n=0时,表为空。a1 是第一个数据元素,an 是最后一个数据元素,ai 是第i个数据
4、元素,其中i为数据元素ai 在线性表中的位序。除了这种优先关系之外,在线性表中不再有其他的结构。,2.1.2 线性表的基本操作,在应用程序中会经常用到线性表,虽然每一个具体应用使用的操作不尽相同,但以下基本操作会经常用到:InitList(&L):构造一个空线性表LDestroyList(&L):在线性表L存在的条件下,摧毁线性表LClearList(&L):在线性表L存在的条件下,将L重置为空表ListEmpty(L):若L为空,返回TRUE,否则返回FALSEListLength(L):返回表中元素的个数GetElem(L,i,&e):在1 i ListLength(L)条件下,用e返回L
5、中第i个元素,more,2.1.2 线性表的基本操作,LocateElem(L,e):返回L中第一个与e满足相等关系的元素的位序,如不存在,返回0PriorElem(L,cur_e,&pre_e):如果cur_e是L中的元素,并且不是第一个,则用pre_e返回它的前驱。否则失败。NextElem(L,cur_e,&next_e):如果cur_e是L中的元素,并且不是最后一个,则用next_e返回它的后继。否则失败。ListInsert(&L,i,e):在1i ListLength(L)+1条件下,在L中第i个位置之前插入新的数据元素e,L的长度加1。ListDelete(&L,i,&e):在1
6、i ListLength(L)条件下,删除L的第i个数据元素,并用e返回其值,L的长度减1。ListTraverse(L):依次输出L中的每个数据元素。,2.1.2 线性表的基本操作,前面各个操作的定义仅对抽象的线性表而言,定义中尚未涉及线性表的存储结构以及实现这些操作所用的编程语言。但利用这些操作可以完成例如研究算法、求解算法及分析算法等重要工作。在这一层次研究问题可以避开技术细节,面向应用,深入讨论问题。下面我们可以通过例子来看如何设计应用。,例2.1 合并两个线性表:La和Lb是分别表示两个集合A、B,现求一个新的集合A=AB就这个问题我们可以有两种算法来实现,下面是算法1:Void U
7、nion1(List/Union1,2.1.2 线性表的基本操作,Void Union2(List/Union2前面两个算法使用不同的基本操作来实现A=AB的计算。在实际的应用中可根据情况来选用。,2.1.2 线性表的基本操作,2.1.2 线性表的基本操作,例2.2 已知一非纯集合B,试构造一个纯集A,使得A中只包含B中所有值不相同的成员。void purge(List/purge,例2.A 已知线性表La和Lb的数据元素按值非递减有序排列,现要求将La和Lb归并成一个新的线性表Lc,且Lc中的数据元素仍按值非递减有序排列。Void MergeList(List La,List Lb,List
8、,2.1.2 线性表的基本操作,1,3,3,7,2,3,4,1,2,3,3,3,4,7,2.2.1 顺序表-线性表的顺序存储表示线性表的顺序表示指的是用一组地址连续的存储单元依次存储线性表的数据元素。此时线性表也称为顺序表。假设线性表的每个存储单元需占用L个存储单元,并以所占的第一个单元的存储地址作为数据单元的存储地址,则下列关系成立:LOC(ai+1)=LOC(ai)+L LOC(ai)=LOC(a1)+(i-1)*L其中LOC(a1)是线性表的第一个数据元素的存储位置,通常称为线性表的起始位置或基地址。由前面的公式可知:只要确定存储线性表的起始位置,线性表中任一数据元素都可随机存取,所以线
9、性表的顺序存储结构是一种随机存取的存储结构。,2.2 线性表的顺序表示和实现,由于高级程序设计语言中的数组类型也有随机存取的特性,因此,通常都用数组来描述数据结构中的顺序存储结构。由于线性表的长度可变,且所需最大存储空间随问题不同而不同,所以在C语言中可用动态分配的一维数组来描述。#define LIST_INIT_SIZE 100#define LISTINCREMENT 10Typedef struct ElemType*elem;/存储空间基地址 intlength;/当前长度 intlistsize;/当前分配的存储容量intincrementsize;/约定的增补空间量 SqList
10、;/listsize和incrementsize以ElemType为单位,2.2.1 顺序表-线性表的顺序存储表示,根据前面的定义,如果SqList L;则L为顺序表,表中含有L.length个数据元素,依次存储在L.elem0至L.elemL.length-1 中,其中L.elemi-1的值线性表中第i个数据元素。该顺序表最多可容纳L.listsize个数据元素;ElemType为线性表中数据元素所属类型。,2.2.1 顺序表-线性表的顺序存储表示,Typedef struct ElemType*elem;/存储空间基地址 intlength;/当前长度 intlistsize;/当前分配的
11、存储容量 intincrementsize;/约定的增补空间量 SqList;,a1,a2,ai,an,L.length,L.listsize,根据线性表的上述顺序表表示,我们可以看出,线性表的许多基本操作很容易实现。例如:ListEmpty(L):若L为空,返回TRUE,否则返回FALSEListLength(L):返回表中元素的个数GetElem(L,i,&e):在1 i ListLength(L)条件下,用e返回L中第i个元素所以下面我们将详细地讨论其他操作。,2.2.2 顺序表中基本操作的实现,初始化操作:void InitList_Sq(SqList/InitList_Sq 复杂度为
12、O(1)用(1)表示更为恰当,2.2.2 顺序表中基本操作的实现,查找元素操作:int LocateElem_Sq(SqList L,ElemType e)/返回L中第一个与e满足相等关系的元素的位序,如不存在,返回0i=1;p=L.elem;while(i=L.length/LocateElem_Sq 复杂度为O(n),2.2.2 顺序表中基本操作的实现,2.2.2 顺序表中基本操作的实现,下面我们重点讨论一下插入和删除操作。,5,6,9,12,15,20,30,37,40,50,Length=10,1,2,3,4,5,6,7,8,9,10,18,5,6,9,12,15,20,30,37,4
13、0,50,18,Length=11,5,6,9,12,15,30,37,40,50,18,Length=10,2.2.2 顺序表中基本操作的实现,void ListInsert_Sq(SqLisst/ListInsert_Sq,假设插入概率相等,平均移动次数为:1/(n+1)n+1i=1(n-i+1)=n/2,O(n),void incrememt(SqLisst,#include#include void ErrorMessage(char*s)/出错异常处理 cout s endl;exit(1);,2.2.2 顺序表中基本操作的实现,void ListDelete_Sq(SqLisst/
14、ListDelete_Sq,假设删除概率相等,平均次数为:(1/n)ni=1(n-i)=(n-1)/2,O(n),销毁结构操作:void DestroyList_Sq(SqList/DestroyList_Sq 复杂度为O(1),2.2.2 顺序表中基本操作的实现,例2.4 试写一个按字典顺序比较两个西文单词大小的算法。在这里我们用线性表A、B来表示两个单词。int compare(SqList A,SqList B)/if AB return 1j=0;while(j B.elemj return(1);else j+;if(A.length=B.length)return(0);else
15、if(A.lengthB.length)return(-1);else return(1);,2.2.3 顺序表其他算法举例,O(Min(A.length,B.length),例2.5 试设计一个算法,用最少的辅助空间将顺序表的前m个元素和后n个元素进行整体互换。void exchang1(SqList/end for/exchang1,2.2.3 顺序表其他算法举例,O(mXn),a1,a2,am,b1,b2,bn,b1,a1,a2,am,b1,void exchang2(SqList/exchang2,2.2.3 顺序表其他算法举例,O(m+n),a1,a2,am,b1,b2,bn,voi
16、d invert(ElemType/end for/exchang1,a1,a2,am,b1,b2,bn,b1,b2,bn,a1,a2,am,例2.2 已知一个非纯集合B(可能有相同的元素),试构造一个纯集合A,使A中只包含B中所有值各不相同的成员。,2.2.3 顺序表其他算法举例,void purge(List/例2.2 purge,void purge_Sq(SqList/例2.6 purge_Sq,O(n2),我们在前面的讨论中发现线性表顺序存储结构(顺序表)的特点是逻辑上相邻的两个元素在物理位置上也相邻,因此可以随机存取表中任意元素,它的存储可以用一个简单直观的公式来表示。这是它的优点
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 02 线性

链接地址:https://www.31ppt.com/p-6578835.html