【教学课件】第二章线性表.ppt
《【教学课件】第二章线性表.ppt》由会员分享,可在线阅读,更多相关《【教学课件】第二章线性表.ppt(81页珍藏版)》请在三一办公上搜索。
1、第二章 线性表,学习要点 了解线性表的逻辑结构是数据元素之间存在着线性关系,在计算机中表示这种关系的两种不同的存储结构是顺序存储结构和链式存储结构。熟练掌握线性表的两种存储结构,即顺序存储结构和链式存储结构。熟练掌握线性表的两种存储结构的基本算法:查找、插入、删除等。,2.1 线性表的基本概念,线性表的定义线性表是n 个类型相同数据元素的有限序列,Linear-list=(D,R)其中:D=ai|ai datatype,i=0,1,n-1 R=|ai,ai+1 D,1in-1 或记作(a0,a1,a2,an-1)。,例1、数学中的数列(11,13,15,17,19,21)例2、英文字母表(A,
2、B,C,D,E Z)。例3、某单位的电话号码簿。,说明:设 A=(a0,a1,.,ai-1,ai,ai+1,an-1)是一线性表1)不同线性表中数据元素的类型可以是各种各样的,但同一线性表中的元素必须是同一类型的;2)在表中 ai-1 领先于ai,ai 领先于ai+1,称ai-1 是ai 的直接前驱,ai+1 是ai 的直接后继;3)在线性表中,除第一个元素和最后一个元素之外,其他元素都有且仅有一个直接前驱,有且仅有一个直接后继,这是所有线性结构的共同特征。线性表是一种线性数据结构;4)线性表中元素的个数n 称为线性表的长度,n=0 时称空表;5)ai是线性表的第i+1个元素,称i+1 为数据
3、元素ai 的序号,每一个元素在线性表中的位置,仅取决于它的序号;,线性表的其他表示方式二元组表示 L=,其中D=a0,a1,a2,.an-1 S=R R=,图示表示,顶点:表示一个数据元素边:表示是数据间的顺序结构关系,线性表的基本操作初始化操作:Initiate(L)设定一个空的线性表L;求长度函数:Length(L)求线性表L中数据元素的个数;查找函数:Get(L,i)取得线性表L的第i个数据元素;定位函数:Locate(L,x)求数据元素x在线性表L中的位置;插入操作:Insert(L,i,x)在线性表中第i个位置插入一个数据元素;删除操作:Delete(L,i)在线性表中第i(0in-
4、1)个结点;,为了存储线性表,至少要保存两类信息:1)线性表中的数据元素;2)线性表中数据元素的顺序关系;,2.2 线性表的顺序存储结构,一、线性表的顺序存储结构顺序表,线性表的顺序存储结构,就是用一组连续的内存单元依次存放线性表的数据元素。,线性表(a0,a1,a2.an-1)的顺序存储结构,用顺序存储结构存储的线性表称为顺序表,说明:在顺序存储结构下,线性表元素之间的逻辑关系,通过元素的存储顺序反映(表示)出来,即逻辑关系相邻,物理位置也相邻;假设线性表中每个数据元素占用d 个存储单元,那么,在顺序存储结构中,线性表的第i个元素的存储位置与第1个元素的存储位置的关系是:Loc(ai-1)=
5、Loc(a0)+(i 1)*d,因为高级语言中的一维数组是采用顺序结构储存的,因此我们使用一维数组来表示线性表,数组的类型由线性表中的数据元素的性质决定。,顺序表的类型定义#define Maxnum 200/*分配的顺序表总长度*/elementtype elementMaxnum;/*定义元素类型数组*/int n;/*当前顺序表存储数据的个数*/为了把线性表的表元素和当前长度整合作为该线性表的特性,我们定义一个结构体如下:struct sqlistelementtype elementMaxnum;/*顺序表数组*/int n;/*当前线性表长度*/;typedef struct sql
6、ist*ptsqlist;,设 A=(a0,a1,a2,.an-1)是一线性表,L是sqlist 类型的结构变量,用于存放线性表A,则L在内存中的状态如图所示:,12i-1ii+1n,存放线性表元素 的一维数组,顺序表通过元素的存储顺序反映线性表元素间的逻辑关系,二、顺序表的基本操作算法1.创建并初始化顺序表 2.在顺序表中查找下标为i的元素(0in-1)并返回该元素 3.顺序表的判空操作,int Empty(ptsqlist list)if list-n=0return(1);return(0);,ptsqlist Initiate(void)ptsqlist list;list=(ptsq
7、list)malloc(sizeof(struct sqlist)if!listprintf(overflow!n);return(null);elselist-n=0;return(list);,elementtype Get(ptsqlist list,int i)if(i=list-n)printf(not existn);return(null);return(list-elementi);,4.插入 insert(L,i,x)功能:在顺序表L中第i个位置后插入一元素插入一个新元素x,插入前线性表为(a0,a1,a2,ai-1,ai,an-1)插入后,线性表长度为n+1,线性表为(a0
8、,a1,a2,ai-1,x,ai,an-1),插入前n=7,插入后n=8,插入操作示意图:insert(p,3,11),插入操作算法,int Insert(ptsqlist list,int i,elementtype x)int j;if(i=list-n)/*位置不合理*/printf(“not exit!n”);return(0);if(list-n=Maxnum)/*空间已满*/printf(“out of space!n”);return(0);for(j=list-n-1;j=i;j-)/*向后移动元素*/list-elementj+1=list-elementj;list-ele
9、menti=x;/*插入元素*/list-n+;/*长度加1*/return(1);,演示,5.删除 delete(L,i)功能:删除顺序表L中下标为i(0in-1)的数据元素,删除前线性表为(a0,a1,an-1)删除后,线性表长度为n-1,线性表为(a0,a1,ai-1,ai+1,an-1),删除前n=8,删除后n=7,删除操作示意图:Delete(p,3),删除操作算法,int Delete(ptsqlist list,int i)int j;if(i=list-n)/*位置不合理*/printf(“not exist!n”);return(0);for(j=i;jn-1;j+)/*向前
10、移动元素*/list-elementj=list-elementj+1;list-n-;/*长度减1*/return(1);,演示,6.顺序表的反转操作,viod fanzhuanlist(ptsqlist list)elementtype mid;int a,z;a=0;z=list-n-1;for(;aelementa;list-elementa=list-elementz;list-elementz=mid;,在下标为i的位置(第i+1个位置)前插入 元素下标 移动元素个数0n1n-1in-in-11n0,三、算法时间复杂度分析在顺序表中插入元素,时间主要耗费在移动元素上,而移动的个数取
11、决于插入的位置以及表的长度。,12i-1ii+1n,假设在线性表的任何位置插入元素的概率相同,即 pi=1/(n+1)则有:,假设pi是在第i个元素之前插入元素的概率,在长度为n的顺序表中插入一个元素,所需移动元素个数数学期望值为:,假设在线性表的任何位置删除元素的概率相同,即 pd=1/n则有:,删除下标为i的元素(第i+1个)需移动n-i-1个元素,设在相应位置删除元素的概率是pd,则删除的平均移动次数是:,在顺序表中插入或删除元素的时间时间复杂度为O(n),相关例题,例1 利用顺序表设计一算法,用以清除表L中的多余的重复结点。如表L(21,3,5,3,21,3,90,5)运算后变为L(2
12、1,3,5,90),算法思想应该是怎样的呢?,相关代码:,void Purge(ptsqlist list)int i,j,k;i=0;while(in)j=i+1;while(jn)if(list-elementi=list-elementj)for(k=j+1;kn;k+)list-elementk-1=list-elementk;list-n=list-n-1;else j=j+1;i=i+1;,作业:设计相关算法,完成线性表的其它操作:Locate(p,x);Union(p,q).,小结顺序表的特点:1 通过元素的存储顺序反映线性表中 数据元素之间的逻辑关系;2 可随机存取顺序表的元素
13、;3 顺序表的插入、删除操作要通过移动 元素实现;,线性表的链式存储结构是用一组任意的存储单元存储线性表的数据元素。为了表示线性表中元素的先后关系,每个结点除了需要存储自身的信息外,还需存储一个指示其直接后继的信息(直接后继的存储位置)。,2.3 线性表的链式存储结构,101010121014101610181020102210241026,用线性链表存储线性表时,数据元素之间的关系是通过保存直接后继元素的存储位置来实现的,2.3.1 线性链表一,线性链表的概念,线性链表有关术语结点:数据元素及直接后继的存储位置(地址)组成一个数据元素的存储结构,称为一个结点;结点的数据域:结点中用于保存数据
14、元素的部分;结点的指针域:结点中用于保存数据元素直接后继存储地址的部分;,存储数据元素,存储直接后继结点的地址,怎样在计算机上实现线性链表?,?,结点变量图示,LNode:结构类型名;LNode类型结构变量有两个域:data:用于存放线性表的数据元素,next:用于存放元素直接后继结点的地址;该类型结构变量用于表示线性链表中的一个结点;,data next,LNode类型 结构变量,p是LNode类型的指针变量,线性链表的结点类型定义及指向结点的指针类型定义,typedef struct Node Etype data;struct Node*next;LNode,*LinkList;,顺序建
15、立单链表(尾插法),H,p,q,H,p,q,H,p,q,q,H,p,q,q,Lnode*Screat_List(void)char ch;LinkList H,p,q;H=NULL;q=H;scanf(ch);while(ch!=n)p=(LinkList)malloc(sizeof(LNode);p-data=ch;if(H=NULL)H=p;else q-next=p;q=p;scanf(ch);p-next=NULL;return H;,head是头指针,头结点,空指针,head,头指针:用于存放线性链表中第一个结点的存储地址;空指针:不指向任何结点,线性链表最后一个结点的指针通常是空指
16、针;头结点:线性链表的第一元素结点前面的一个附加结点,称为头结点;带头结点的线性链表:第一元素结点前面增加一个附加头结点的线性链表称为 带头结点的线性链表;,非空表,空表,二,线性链表基本操作的算法,如何在线性链表上实现线性表的基本操作?如何建表?查找?如何插入?删除?,?,约定用带头结点的线性链表存储线性表,1.建立单链表(前插法),1.建立单链表(前插法),LinkList CreateList(int n)LinkList L,p;int i;L=(LinkList)malloc(sizeof(LNode);L-next=NULL;for(i=n;i0;-i)p=(LinkList)ma
17、lloc(sizeof(LNode);scanf(%d,2.按序号查找,LNode*Get_List_Node(LinkList head,int i)/*在单链表中查找第i个结点,返回其指针,若失败返回空*/LNode*p;int j;p=head;j=0;while(p-next!=NULL),3.按值查找,LNode*Locate_List_Node(LinkList head,Etype x)/*在单链表中查找值为x的结点,返回其指针,查找失败返回空*/LNode*p;p=head-next;while(p!=NULL),4.插入操作 int ListInsert(LinkList L
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 教学课件 教学 课件 第二 线性
链接地址:https://www.31ppt.com/p-5662171.html