第二章-线性表-数据结构-教学课件.ppt
《第二章-线性表-数据结构-教学课件.ppt》由会员分享,可在线阅读,更多相关《第二章-线性表-数据结构-教学课件.ppt(93页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第2章 线性表学习目的要求学习目的要求:1.线性表的定义和线性表的特征。线性表的定义和线性表的特征。2.线性表的顺序存储结构及其算法的实现。线性表的顺序存储结构及其算法的实现。3.线性链表的描述及其算法的实现。线性链表的描述及其算法的实现。4.循环链表和双向循环链表的描述。循环链表和双向循环链表的描述。5.数组的顺序存储和矩阵的压缩存储的描述。数组的顺序存储和矩阵的压缩存储的描述。2.1 线性表的基本概念2.2 线性表的顺序存储结构及其算法2.3 线性表的链式存储结构及其运算2.4 算法应用举例2.5 数组第2章 线性表第2章 线性表线性结构线性结构是一个数据的是一个数据的有序(次序)有序(次
2、序)集合集合【线性结构的【线性结构的基本特征基本特征】:】:集合中一定存在唯一的一个集合中一定存在唯一的一个“第一元素第一元素”集合中一定存在唯一的一个集合中一定存在唯一的一个“最后元素最后元素”除最后一个元素外,均有除最后一个元素外,均有“唯一后继唯一后继”除第一个元素外,均有除第一个元素外,均有“唯一前驱唯一前驱”2.1 线性表的基本概念 2.1.1 线性表的定义线性表的定义 线性表线性表(linear list)是由)是由 n个数据元素组成的个数据元素组成的有有限序列限序列,数据元素之间是一对一的关系,即数据元素之间是一对一的关系,即线性关系线性关系.线性表的二元组可以表示线性表的二元组
3、可以表示:S=(D,R)D=a1,a2,ai,an R=,称称i为线性表的位序为线性表的位序,称称n为线性表的为线性表的表长表长,n0时的线性表为时的线性表为空表空表【引用型操作】【引用型操作】1.ListEmpty(List)2.ListLength(List)3.GetElement(List,i)4.PriorElement(List,x)5.NextElement(List,x)6.LocateElement(List,x)2.1 线性表的基本概念线性表的基本概念2.1.2 线性表的基本操作线性表的基本操作【加工型操作】【加工型操作】1.ListInsert(List,i,x)2.Li
4、stDelete(List,i)2.1 线性表的基本概念线性表的基本概念2.1.2 线性表的基本操作线性表的基本操作2.2 线性表的顺序存储结构及其算法线性表的顺序存储结构及其算法线性表的线性表的顺序存储结构顺序存储结构简称为简称为顺序表顺序表(Sequential List)在线性表中在线性表中逻辑关系相邻逻辑关系相邻的数据元素,在计算机的的数据元素,在计算机的内存中内存中物理位置也是相邻物理位置也是相邻的。的。2.2.1 线性表的顺序存储结构线性表的顺序存储结构【顺序存储结构的特点】【顺序存储结构的特点】a1a2.aian线性表的线性表的起始地址起始地址称作线性表的称作线性表的基地址基地址
5、2.2 线性表的顺序存储结构及其算法线性表的顺序存储结构及其算法 顺序结构的顺序结构的c语言描述:语言描述:#define MAXLEN 100typedef int elementtype;typedef struct elementtype sMAXLEN;/*线性表的最大容量线性表的最大容量*/int len;/*线性表当前的长度线性表当前的长度*/Sqlist;1.插入运算插入运算InsertsqList(i,x,&List)的实现的实现:2.2 线性表的顺序存储结构及其算法线性表的顺序存储结构及其算法2.2.2 顺序表的运算顺序表的运算问:插入元素时,线性表的逻辑结问:插入元素时,线
6、性表的逻辑结构发生什么变化?构发生什么变化?int insertsqlist(int i,elementtype x,SqList*sql)/*在顺序表(*sql)的第i个元素之前插入一个新元素x*/int j;if(isql-len)/*i值非法,返回值为0*/return(0);else for(j=sql-len;j=i;j-)sql-sj+1=sql-sj;sql-sj+1=x;/*修正插入位置为j+1*/(sql-len)+;/*表长加1*/return(1);/*插入成功,返回值为1*/2.2 线性表的顺序存储结构及其算法线性表的顺序存储结构及其算法判断插入得位置是否合判断插入得位
7、置是否合法,位置得合法取值是法,位置得合法取值是1sql-len/*向后移动数向后移动数据,腾出要插据,腾出要插入的空位入的空位*/【算法】【算法】2.2 线性表的顺序存储结构及其算法线性表的顺序存储结构及其算法2.2.2 顺序表的运算顺序表的运算问:删除元素时,线性表的逻辑结构发生什么变化?问:删除元素时,线性表的逻辑结构发生什么变化?(a1,a2,ai-1,ai,ai+1an)改变为 (a1,a2,ai-1,ai+1,an)a1a2.ai-1aiai+1ana1a2.ai-1ai+1an删除后删除后删除元素平均次数为(n-1)/2int delsqlist(int i,SqList*sql
8、)/*删除顺序表(*sql)的第i个元素*/int j;if(i sql-len)/*i值非法,返回值为0*/return(0);else for(j=i+1;jlen;j+)sql-sj-1=sql-sj;(sql-len)-;/*表长度减1*/return(1);/*删除成功,返回值为1*/2.2 线性表的顺序存储结构及其算法线性表的顺序存储结构及其算法【算法】【算法】/*向前移动数据,向前移动数据,覆盖前一数据覆盖前一数据*/a1a3 a2以线性表中第一个数据元素以线性表中第一个数据元素a1的存储地址的存储地址作为线性表的地址,称作线性表的作为线性表的地址,称作线性表的头指针头指针加上表
9、头指针的线性表逻辑结构如下图所示:加上表头指针的线性表逻辑结构如下图所示:当链表为空时,则表头指针为空。如图(当链表为空时,则表头指针为空。如图(b)所示。)所示。线性表的每个结点都有一个链接指针,所以不要求链表中的结点必须按照结点先后次序存储在一个地址连续的存储区中。在链式存储结构中,线性表中数据元素的逻辑关系是用指示元素存储位置的指针来表示的。下图是线性表(a1 1,a2 2,a3 3,a4 4,a5 5)的链式存储结构。为了便于实现各种运算,通常在链表的第一个结点之前设置一个附加结点,称之为表头结点。而其他结点称为表中结点。表头结点结构与表中结点结构相同,只是数据域不存放数据元素,如图2
10、.8(a)所示。图2.8(b)为带头结点的空表的情况。图图图图2.8 2.8 带表头结点的线性链表带表头结点的线性链表带表头结点的线性链表带表头结点的线性链表a1a3 a2 因此,存放数据元素的空间(称为结点)至少包括因此,存放数据元素的空间(称为结点)至少包括两个域,一个域存放该元素的值,称为数据域两个域,一个域存放该元素的值,称为数据域;另一个域另一个域存放后继结点的存储地址,称为指针域或链域。其结点存放后继结点的存储地址,称为指针域或链域。其结点结构如图所示。结构如图所示。typedef struct node int data;/*数据域数据域*/struct node*next;/*
11、指针域指针域*/NODE;/*这里以整型为例,这里以整型为例,实际上可以为任意实际上可以为任意类型数据类型数据*/*指针类型,存放指针类型,存放下一个结点的地址下一个结点的地址*/*用用NODE来替代来替代struct node型的结构类型名,以后可以用型的结构类型名,以后可以用NODE来定义来定义 struct node型的结构变量型的结构变量*/线性链表是通过结点指针域中的指针表示各结点之间的线性关系的。线性表的每个结点都有一个链接指针,所以不要求链表中的结点必须按照结点先后次序存储在一个地址连续的存储区中。在链表中插入或删除数据元素比在顺序表中要容易得多,但是链表结构需要的存储空间较大。
12、2.3 线性表的链式存储结构及其运算线性表的链式存储结构及其运算【特点】【特点】1.建立带表头结点的单链表建立带表头结点的单链表建立链表时,首先要建立表头结点,此时为空链表。建立链表时,首先要建立表头结点,此时为空链表。然后将新的结点逐一插入到链表中,其过程如下然后将新的结点逐一插入到链表中,其过程如下:(1)申请存储单元,用申请存储单元,用C语言的动态分配库函数语言的动态分配库函数malloc得到。得到。malloc(sizeof(NODE)函数)函数(2)读入新结点的数据,新结点的指针域为空。读入新结点的数据,新结点的指针域为空。(3)把新结点链接到链表上去(有前插和后插两种把新结点链接到
13、链表上去(有前插和后插两种方式)。方式)。重复以上步骤,直到将所有结点都链接到链表上为止。重复以上步骤,直到将所有结点都链接到链表上为止。2.3 线性表的链式存储结构及其运算线性表的链式存储结构及其运算2.3.2 单链表的运算单链表的运算NODE*create()/*此函数采用后插入方式建立单链表*/NODE*head,*q,*p;/*定义指针变量*/char ch;int a;head=(NODE*)malloc(sizeof(NODE);/*申请新的存储空间,建立表头结点*/q=head;ch=*;printf(nInput the list:);2.3 线性表的链式存储结构及其运算线性表
14、的链式存储结构及其运算(Continue)【算法【算法1】while(ch!=?)/*ch为是否建立新结点的标志,若ch为?则输入结束*/scanf(%d,&a);/*输入新元素*/p=(NODE*)malloc(sizeof(NODE);p-data=a;q-next=p;q=p;ch=getchar();/*读入输入与否的标志*/q-next=NULL;return(head);/*返回表头指针head*/2.3 线性表的链式存储结构及其运算线性表的链式存储结构及其运算 while(n0)scanf(%d,&a);/*输入新元素*/p=(NODE*)malloc(sizeof(NODE);
15、p-data=a;q-next=p;q=p;n-;/*读入输入与否的标志*/q-next=NULL;return(head);/*返回表头指针head*/2.3 线性表的链式存储结构及其运算线性表的链式存储结构及其运算2.单链表中结点的查找单链表中结点的查找单链表有两种查找方法,即按单链表有两种查找方法,即按序号查找序号查找和和按按给定值查找给定值查找。在单链表中,即使知道了要查找的结点的在单链表中,即使知道了要查找的结点的序号,也只能从序号,也只能从头指针头指针开始查找。与顺序表不开始查找。与顺序表不一样,单链表一样,单链表不能实现随机查找不能实现随机查找。2.3 线性表的链式存储结构及其运
16、算线性表的链式存储结构及其运算NODE*locate(NODE*head,int x)/*在已知链表中查找给定的值在已知链表中查找给定的值x*/NODE*p;p=head-next;while(p!=NULL)&(p-data!=x)p=p-next;/*指向下一个元素指向下一个元素*/return(p);(1)按值查找按值查找 2.3 线性表的链式存储结构及其运算线性表的链式存储结构及其运算/*未到表尾且未未到表尾且未找到给定数据则找到给定数据则p指向下一个元素指向下一个元素*/【算法】【算法】(2)按序号查找按序号查找2.3 线性表的链式存储结构及其运算线性表的链式存储结构及其运算在单链表
17、中查找第 i 个位置上的结点,若找到,则返回它的地址,否则返回NULL。2.单链表中结点的查找单链表中结点的查找 线性表的操作:线性表的操作:GetElement(List,i)在链表中的实现:在链表中的实现:基本操作为基本操作为:使指针使指针p始终指向线性表中第始终指向线性表中第j个数据元素个数据元素(指针指针p,计数器计数器j)NODE*find(NODE*head,int i)/*在已知链表中查找给定的值在已知链表中查找给定的值x*/int j=1;NODE*p;p=head-next;/*初始化,初始化,p指向第一个结点,指向第一个结点,j为计数器为计数器*/while(p!=NULL
18、)&(jnext;/*指向下一个元素指向下一个元素*/j+;/*计数器计数器j加加1*/return(p);(2)按序号查找按序号查找2.3 线性表的链式存储结构及其运算线性表的链式存储结构及其运算/*未到表尾且未找未到表尾且未找到给定数据则到给定数据则p指指向下一个元素向下一个元素*/【算法】【算法】3.单链表上的插入运算单链表上的插入运算在顺序表中,插入运算时,将会有大量元素向在顺序表中,插入运算时,将会有大量元素向后移动。而在单链表中,后移动。而在单链表中,插入一个结点不需要移动插入一个结点不需要移动元素,只需要修改指针即可元素,只需要修改指针即可。2.3 线性表的链式存储结构及其运算
19、线性表的操作:线性表的操作:InsertsqList(i,x,&List)在链表中的实现:在链表中的实现:基本操作为基本操作为:找到线性表中的第找到线性表中的第i1个结点,个结点,修改其指向后继的指针修改其指向后继的指针有序对有序对改变为改变为若将x插入到a1 和a2 之间,其过程如下:(1)建立一个新结点 q,将x值赋给q-data。(2)修改有关结点的指针域。3.单链表上的插入运算单链表上的插入运算2.3 线性表的链式存储结构及其运算p-next=q;q-data=x;q-next=p-next;void insert(NODE*p,int x)/*在链表的在链表的p结点后插入给定元素结点
20、后插入给定元素x*/NODE*q;q=(NODE*)malloc(sizeof(NODE);/*申请新的存储空间申请新的存储空间*/q-data=x;q-next=p-next;/*实现图的实现图的*/p-next=q;/*实现图的实现图的,将新结点,将新结点q链接到链接到p结点之后结点之后*/2.3 线性表的链式存储结构及其运算线性表的链式存储结构及其运算3.单链表上的插入运算单链表上的插入运算【算法】【算法】4.单链表上的删除运算单链表上的删除运算2.3 线性表的链式存储结构及其运算线性表的链式存储结构及其运算 线性表的操作线性表的操作:DeletesqList(x,&List)在链表上的
21、实现在链表上的实现基本操作基本操作:找到线性表中的找到线性表中的x元素,修改其指向后继的指针。元素,修改其指向后继的指针。假设元素假设元素x的位置是的位置是i则有序对则有序对改变为改变为4.单链表上的删除运算单链表上的删除运算 删除单向链表中的结点删除单向链表中的结点x,并由系统收回其占用,并由系统收回其占用的存储空间,其过程如下的存储空间,其过程如下:(1)设定两个指针设定两个指针p和和q,p指针指向被删除结点指针指向被删除结点,q为跟踪指针,为跟踪指针,指向被删除结点的直接前驱结点指向被删除结点的直接前驱结点。(2)p从表头指针从表头指针 head 指向的第一个结点开始依次指向的第一个结点
22、开始依次向后搜索。当向后搜索。当p data 等于等于x时,被删除结点找到。时,被删除结点找到。(3)修改)修改p的前驱结点的前驱结点q的指针域。使的指针域。使p结点被删除,结点被删除,然后释放存储空间。然后释放存储空间。2.3 线性表的链式存储结构及其运算线性表的链式存储结构及其运算q-next=p-next;free(p);2.3 线性表的链式存储结构及其运算线性表的链式存储结构及其运算【算法】【算法】void delete(NODE*head,int x)/*删除链表中的给定元素x*/NODE*p,*q;q=head;/*q用来指向删除结点的前驱结点*/p=q-next;/*q用来指向删
23、除结点*/while(p!=NULL)&(p-data!=x)/*查找要删除的元素*/q=p;p=p-next;if(p=NULL)printf(%d not found.n,x);/*x结点未找到*/else q-next=p-next;/*链接x直接后继结点*/free(p);/*删除x结点,释放x结点空间*/5.输出单链表输出单链表若要将单链表按其逻辑顺序输出,就必须从若要将单链表按其逻辑顺序输出,就必须从头到尾访问单链表中的每一个结点。头到尾访问单链表中的每一个结点。2.3 线性表的链式存储结构及其运算线性表的链式存储结构及其运算void print(NODE*head)/*输出单向链
24、表各元素输出单向链表各元素*/NODE*p;p=head-next;printf(Output the list:);while(p!=NULL)printf(%3d,p-data);p=p-next;5.输出单链表输出单链表2.3 线性表的链式存储结构及其运算线性表的链式存储结构及其运算【算法】【算法】如果将如果将单链表最后一个结点的指针指向头结点单链表最后一个结点的指针指向头结点,使链表形成一个环形,此链表就称为使链表形成一个环形,此链表就称为循环链表循环链表(Circular Link List)。)。2.3 线性表的链式存储结构及其运算线性表的链式存储结构及其运算2.3.3 循环链表结
25、构循环链表结构【解析书上的例子】【解析书上的例子】1.双向链表的基本概念双向链表的基本概念 在循环链表的结点中再增加一个指针域,这个在循环链表的结点中再增加一个指针域,这个指针直接指向该结点的指针直接指向该结点的 直接前驱。这样,链表中一直接前驱。这样,链表中一个结点就有了两个指针域,我们把这样的链表称个结点就有了两个指针域,我们把这样的链表称为为双向链表双向链表。2.3 线性表的链式存储结构及其运算线性表的链式存储结构及其运算2.3.4 双向链表结构双向链表结构双向链表中结点结构如图所示:双向链表的双向链表的C C语言描述如下语言描述如下:2.3 线性表的链式存储结构及其运算线性表的链式存储
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第二 线性 数据结构 教学 课件
限制150内