(3)--第2章 线性表-单链表(完整版).ppt
《(3)--第2章 线性表-单链表(完整版).ppt》由会员分享,可在线阅读,更多相关《(3)--第2章 线性表-单链表(完整版).ppt(41页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、-线性表的链式表示及实现第2章 线性表1 1.掌握链表的定义、创建、查找、插入和删除掌握链表的定义、创建、查找、插入和删除 4.4.能够从时间和空间复杂度的角度能够从时间和空间复杂度的角度比较比较顺序顺序表和表和链表两种链表两种存储结构的不同特点及其适用场合存储结构的不同特点及其适用场合 教学目标结点结点在存储器中的位置是在存储器中的位置是任意任意的,的,即逻辑上相邻逻辑上相邻的数据元素在物理上不一定相邻的数据元素在物理上不一定相邻线性表的链式表示通过通过“链链”建立起数据元素之间的逻辑关系建立起数据元素之间的逻辑关系借助指示元素存储地址的借助指示元素存储地址的指针实现指针实现各结点由两个域组
2、成:各结点由两个域组成:数据域:数据域:存储元素数值数据存储元素数值数据指针域:指针域:存储直接后继结点的存储位置存储直接后继结点的存储位置a1heada2an单链表单链表链表的优缺点优点优点数据元素的个数可以自由扩充数据元素的个数可以自由扩充插入、删除等操作不必移动数据,只需修改链接指针,插入、删除等操作不必移动数据,只需修改链接指针,修改效率较高修改效率较高缺点缺点存储密度小存储密度小存取效率不高,访问时只能通过头指针进入链表,并通过存取效率不高,访问时只能通过头指针进入链表,并通过每个结点的指针域向后扫描其余每个结点的指针域向后扫描其余结点结点(顺藤摸瓜)(顺藤摸瓜),所以所以寻找第一个
3、结点和最后一个结点所花费的时间寻找第一个结点和最后一个结点所花费的时间不等不等这种存取元素的方法被称为这种存取元素的方法被称为顺序存取法顺序存取法单链表的两种形式单链表的两种形式ZHAOQIANLISUNZHOUWUZHENG/WANGHZHAOQIANLISUNZHOUWUZHENG/WANGH区别:区别:无头结点无头结点有头结点有头结点头头指针、头结点和首元结点指针、头结点和首元结点 头指针头指针 头结点头结点首元结点首元结点a1heada2infoan头指针头指针是指向链表中第一个结点的指针是指向链表中第一个结点的指针首元结点首元结点是指链表中存储第一个数据元素是指链表中存储第一个数据元
4、素a a1 1的结点的结点头结点头结点是在链表的首元结点之前附设的一个结点;数是在链表的首元结点之前附设的一个结点;数据域内只放空表标志和表长等信息据域内只放空表标志和表长等信息讨论讨论1.1.如何表示如何表示空表空表?有头结点时,有头结点时,当头结点的指针域为空当头结点的指针域为空时表示空表时表示空表非空表非空表 空表空表0ana0headhead表头表头结点结点第一个第一个结点结点不带头结点的单链表不带头结点的单链表L L为空的条件是()为空的条件是()L=NULL;L=NULL;L-next=NULL;L-next=NULL;A AB B提交提交单选题单选题2 2分分带头带头结点的单链表
5、结点的单链表L L为空的条件是()为空的条件是()L=NULL;L=NULL;L-next=NULL;L-next=NULL;A AB B提交提交单选题单选题2 2分分讨论讨论2 2.在链表中设置在链表中设置头结点头结点有什么好处?有什么好处?便于便于首元结点首元结点的处理的处理首元结点的地址保存在头结点的指针域中首元结点的地址保存在头结点的指针域中,所以所以在链表的第一个位置上的操作和其它位置一致,无须在链表的第一个位置上的操作和其它位置一致,无须进行特殊处理进行特殊处理;便于便于空表和非空表空表和非空表的统一处理的统一处理无论链表是否为空,头指针都是指向头结点的非无论链表是否为空,头指针都
6、是指向头结点的非空指针,因此空表和非空表的处理也就统一了。空指针,因此空表和非空表的处理也就统一了。讨论讨论3.3.头结点的头结点的数据域数据域内装的是什么?内装的是什么?头结点的头结点的数据域数据域可以为空,也可存放线性表可以为空,也可存放线性表长度长度等附加信息,但此结点不能计入链表长度值。等附加信息,但此结点不能计入链表长度值。头结点的数据域头结点的数据域H H单链表的定义和实现非空表非空表空表空表单链表是由表头唯一确定,因此单链表可单链表是由表头唯一确定,因此单链表可以用头指针的名字来命名以用头指针的名字来命名若头指针名是若头指针名是L,则把链表称为表,则把链表称为表L 单链表的存储结
7、构定义typedef struct LNodetypedef struct LNode ElemType data;ElemType data;/数据域数据域 struct LNode *next;struct LNode *next;/指针域指针域LNode,*LinkList;LNode,*LinkList;/*LinkList/*LinkList为为LnodeLnode类型的指针类型的指针LNode*pLinkListpLNode*p注意区分指注意区分指针变量和量和结点点变量两个不同的概念量两个不同的概念指指针变量量p:表示:表示结点地址点地址结点点变量量*p:表示一个:表示一个结点点若
8、若p-data=ai,则则p-next-data=ai+1对于对于链表,常用的三条语句链表,常用的三条语句如下:如下:p=L-next;/p指向首元结点指向首元结点while(p!=NULL)/p未到表尾未到表尾p=p-next;/p指向下一个结点指向下一个结点另外,另外,指针保留技术指针保留技术:q=p;p=p-next;单链表基本操作的实现n初始化初始化n求表长求表长n取值取值n查找查找n插入插入n删除删除1.1.初始化初始化(构造一个空表构造一个空表)【算法步骤算法步骤】(1)生成新结点作头结点,用头指针)生成新结点作头结点,用头指针L指向头结点。指向头结点。(2)头结点的指针域置空。)
9、头结点的指针域置空。【算法描述算法描述】StatusInitList_L(LinkList&L)L=newLNode;L-next=NULL;returnOK;pLa1a2.pi0 1p2p=NULLan2.2.求求表表长长(“数数”结点结点:)【算法算法步骤步骤】(1)指针)指针p初始化指向首元结点,计数器初始化指向首元结点,计数器i初始化为初始化为0;(2)只要)只要p不为空,重复执行:不为空,重复执行:i增增1,p后移后移n-1n【算法描述算法描述】intListLength_L(LinkListL)/返回返回L L中数据元素中数据元素个数(表长)个数(表长)LinkListp;p=L-
10、next;/p/p指向第一个结点指向第一个结点i=0;/计数器从计数器从0 0开始开始while(p)/遍历单链表遍历单链表,统计结点数统计结点数i+;p=p-next;returni;思考:顺序表里如何找到第思考:顺序表里如何找到第i i个元素?个元素?链表链表的查找:要从链表的头指针出发,的查找:要从链表的头指针出发,顺着链域顺着链域nextnext逐个结点往下搜索,直至逐个结点往下搜索,直至搜索到第搜索到第i i个结点为止。因此,链表不是个结点为止。因此,链表不是随机存取结构随机存取结构3 3.取值取值(根据位置(根据位置i i获取相应位置数据元素的内容)获取相应位置数据元素的内容)20
11、L211830754256 pppj1 2 3pp1i=3i=156p7例:分别取出表中例:分别取出表中i=3和和i=15的元素的元素从第从第1 1个结点(个结点(L-nextL-next)顺链扫描,用指针)顺链扫描,用指针p p指向当前扫描指向当前扫描到的结点,到的结点,p p初值指向首元。初值指向首元。j j做计数器,累计当前扫描过的结点数,做计数器,累计当前扫描过的结点数,j j初值为初值为1 1。当当p p不为空并且不为空并且j!=ij!=i时,重复执行:计数器时,重复执行:计数器j j加加1 1,p p后移。后移。扫描结束后,当扫描结束后,当j j=i i时,时,p p所指的结点就是
12、要找的第所指的结点就是要找的第i i个个结点,否则,不存在结点,否则,不存在【算法步骤算法步骤】【算法描述算法描述】/获取线性表获取线性表L L中中的第个的第个数据元素的内容数据元素的内容LinkListGetElem_L(LinkListL,int)/初始化,初始化,p初值指向首元,初值指向首元,j初值为初值为1/向后扫描,直到向后扫描,直到p指向第指向第i个元素或个元素或p为空为空/找到第找到第i个结点个结点/第第i个元素不存在个元素不存在p=p-next;+j;while(p&jnext;j=1;if(j=i)returnp;elsereturnNULL;用指针用指针p p指向当前扫描到
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 3-第2章 线性表-单链表完整版 线性 单链表 完整版
限制150内