线性表的链式表示和实现44284.ppt
《线性表的链式表示和实现44284.ppt》由会员分享,可在线阅读,更多相关《线性表的链式表示和实现44284.ppt(37页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第2章 线性表2.1 线性表的逻辑结构 2.2 线性表的顺序表示和实现2.3 线性表的链式表示和实现2.4 一元多项式的表示和相加12.3 线性表的链式表示和实现2.3.1 链表的表示2.3.2 链表的实现2.3.3 一个带头结点的单链表类型2.3.4 其它形式的链表2(1)链式存储结构特点:其结点在存储器中的位置是随意的,即逻辑上相邻的数据元素在物理上不一定相邻。如何实现?通过指针指针来实现!让每个存储结点都包含两部分:数据域和指针域指针 数据 指针 数据 数据 指针 或样式:数据域:存储元素数值数据指针域:存储直接后继或者直接前驱的存储位置设计思想:牺牲空间效率换取时间效率设计思想:牺牲空
2、间效率换取时间效率2.3.1 链表的表示3链表存放示意图如下:a1heada2/an 讨论1:每个存储结点都包含两部分:数据域和讨论2:在单链表中,除了首元结点外,任一结点的存储位置由 指示。其直接前驱结点的链域的值(2)与链式存储有关的术语:1)结点:数据元素的存储映像。由数据域和指针域两部分组成;2)链表:n 个结点由指针链组成一个链表。它是线性表的链式存储映像,称为线性表的链式存储结构。只包含一个指针域的称为单链表或线性链表指针域43)头指针、头结点和首元结点的区别头指针头结点 首元结点a1heada2 infoan首元结点是指链表中存储线性表第一个数据元素a1的结点。头结点是在链表的首
3、元结点之前附设的一个结点;数据域内只放空表标志和表长等信息,它不计入表长度。头指针是指向链表中第一个结点(或为头结点、或为首元结点)的指针;示意图如下:5讨论2:在链表中设置头结点有什么好处?讨论1:如何表示空表?因为任何元素结点都有前驱结点,而在做插入和删除操作时,都需修改其前驱结点的指针域,因此对首元结点可以统一处理。即简化插入和删除操作;表头指针是指向头结点的非空指针,因此空表和非空表的处理一样。无头结点时,当头指针的值为空时表示空表;头指针无头结点头指针 头结点有头结点有头结点时,当头结点的指针域为空时表示空表。头结点不计入头结点不计入链表长度!链表长度!6一个线性表的逻辑结构为:(Z
4、HAO,QIAN,SUN,LI,ZHOU,WU,ZHENG,WANG),其存储结构用单链表表示如下,请问其头指针的值是多少?存储地址 数据域 指针域1 LI 437 QIAN 1313 SUN 119 WANG NULL25 WU 3731 ZHAO 737 ZHENG 1943 ZHOU 25答:头指针是指向链表中第一个结点的指针,因此关键是要寻找第一个结点的地址。7 ZHAOH31称:头指针H的值是31(3)举例例1:7 现有一个具有五个元素的线性表L=23,17,47,05,31,若它以链接方式存储在下列100119号地址空间中,每个结点由数据(占2个字节)和指针(占2个字节)组成,如下
5、图所示。其中指针X,Y,Z的值分别为多少?该线性表的首结点起始地址为多少?末结点的起始地址为多少?Z Z47 47 Y Y 31 31 V V23 23 X X 17 17 U U 05 05100 100119 119104 104108 108 116 116 112 112116116NULL(0)NULL(0)100100108108112112答:X=Y=Z=,首址=末址=。例2:8讨论:链表的数据元素有两个域,不再是简单数据类型,编程时该如何表示?因每个结点至少有两个分量,且数据类型通常不一致,所以要采用结构数据类型。答:设每个结点用变量nodenode表示,其指针用pp表示,两个
6、分量分别用datadata和*nextnext表示,这两个分量如何赋值?p*next*next data datanode node方式1:直接表示为 node.dataaa;node.next=q;q;方式2:p指向结点首地址 p-data=aa;p-next=qq;方式3:p指向结点首地址(*p).data=aa;(*p).nextq;q;9单链表的抽象数据类型描述如下(参见教材P28):typedef struct LNode ElemType data;/数据域 struct LNode*next;/指针域LNode,*LinkList;/*LinkList为Lnode类型的指针Q1:
7、第一行的LNode 与最后一行的LNode是不是一回事?A1:不是。前者LNode是结构名,后者LNode是对整个struct类型的一种“缩写”,是一种“新定义名”,它只是对现有类型名的补充,而不是取代。请注意:typedef不可能创造任何新的数据类型,而仅仅是在原有的数据类型中命名一个新名字,其目的是使你的程序更易阅读和移植。10Q2:那为何两处要同名(LNode和LNode)?太不严谨了吧?A2:同名是为了表述起来方便。因为描述的对象相同,方便阅读和理解。Q3:结构体中间的那个struct LNode是何意?A3:在“缩写”LNode还没出现之前,只能用原始的struct LNode来进行
8、变量说明。此处说明了指针分量的数据类型是struct LNode。返 回1 12.3.2 链表的实现(1)单链表的存取(2)单链表的插入(3)单链表的删除(4)单链表的建立12(1)单链表的存取思路:要存取第i个数据元素,必须从头指针起一直找到该结点的指针p,然后才能执行 p-data=new_value。修改第i个数据元素的操作函数可写为:Status GetElem_L(LinkList L,int i,ElemType e)p=L-next;j=1;/带头结点的链表while(p&jnext;+j;if(!p|ji)return ERROR;/i不合法 p-data=e;/若是读取则为:
9、e=p-data;return OK;/GetElem_L缺点:想寻找单链表中第i个元素,只能从头指针开始逐一查询(顺藤摸瓜),无法随机存取。13在链表中第i个位置前插入一个元素x 的示意图如下:Xsai-1aip链表插入的核心语句:Step 1Step 1:s-next=p-next;s-next=p-next;p-nexts-next思考:思考:Step1Step1和和22能互换么?能互换么?X 结点的生成方式:s=(Lnode*)malloc(m);s-data=x;s-next=?aiai-1p插 插 入 入 X(2)单链表的插入Step2:p-next=s;Step2:p-next=
10、s;14 Status ListInsert_L(LinkList L,int i,ElemType e)/LinstInsert_L算法的时间复杂度为:O(ListLength(L)p=L;j=0;while(p&j next;+j;/寻找第 i-1 个结点if(!p|j i-1)return ERROR;/i不合法 s=(LinkList)malloc(sizeof(LNode)s-data=e;s-next=p-next;p-next=s;/插入return OK;15在链表中删除某元素ai的示意图如下:ai+1 ai-1 aip删除动作的核心语句(要借助辅助指针变量q):q=p-nex
11、t;/首先保存ai的指针,靠它才能找到ai+1 p-next(p-next)-nextq(3)单链表的删除P-next=q-next;/将ai-1与ai+1两结点相连,淘汰ai结点free(q);16 Status ListDelete_L(LinkList L,int i,ElemType&e)/删除以 L 为头指针(带头结点)的单链表中第 i 个结点/ListDelete_L算法的时间复杂度为:O(ListLength(L)p=L;j=0;while(p-next&j next;+j;/寻找第 i 个结点,并令 p 指向其前趋if(!(p-next)|j i-1)return ERROR;
12、/删除位置不合理q=p-next;p-next=q-next;/删除并释放结点 e=q-data;free(q);return OK;17空间效率分析链表中每个结点都要增加一个指针空间,相当于总共增加了n 个整型变量,空间复杂度为 O(n)。在n个结点的单链表中要删除已知结点*P,需找到它的,其时间复杂度。前驱结点的地址前驱结点的地址/指针指针 O(n)练习:18操作步骤:一、建立一个“空表”;二、输入数据元素an,建立结点并插入;三、输入数据元素an-1,建立结点并插入表头;ananan-1四、依次类推,直至输入a1为止。(4)单链表的建立例如:逆位序输入 n 个数据元素的值,建立带头结点的
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 线性 链式 表示 实现 44284
限制150内