下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、 第2章 线性表2.1 线性表的逻辑结构 2.2 线性表的顺序表示和实现2.3 线性表的链式表示和实现2.4 应用举例 作业上堂课要点回顾线性结构(包括表、栈、队、数组)的定义和特点: 仅一个首、尾结点,其余元素仅一个直接前驱和一个直接后继。2. 线性表逻辑结构:“一对一” 或 1:1存储结构:顺序、链式运 算 :修改、插入、删除3.顺序存储特征:逻辑上相邻,物理上也相邻;优点:随机查找快 O(1)缺点:插入、删除慢 O(n)2.3 线性表的链式表示和实现2.3.1 链表的表示2.3.2 链表的实现线性链表,循环链表,双向链表2.3.3 链表的运算效率分析本节小结作 业(续上堂课)2.3.1
2、链表的表示链式存储特点与链式存储有关的术语线性表的单链表存储结构1. 链式存储特点:逻辑上相邻,物理上不一定相邻链表存放示意图如下: a1heada2/an讨论1 :每个存储结点都包含两部分:数据和 。讨论2:在单链表中,除了首元结点外,任一结点的存储位置 由 指示。 其直接前驱结点的链域的值指针域(链域)2. 与链式存储有关的术语1)结点:数据元素的存储映像。由数据域和指针域两部分组成;2)链表: n 个结点由指针链组成一个链表。它是线性表的链式存储映像,称为线性表的链式存储结构。3)单链表、双链表、多链表、循环链表: 结点只有一个指针域的链表,称为单链表或线性链表;有两个指针域的链表,称为
3、双链表;有多个指针域的链表,称为多链表;首尾相接的链表称为循环链表。4)头指针、头结点和首元结点以教材P27 图2.5和图2.6内容为例说明。何谓头指针、头结点和首元结点?头指针是指向链表中第一个结点(或为头结点或为首元结点)的指针。 单链表可由一个头指针唯一确定。头结点是在链表的首元结点之前附设的一个结点;数据域内只放空表标志和表长等信息;首元结点是指链表中存储线性表第一个数据元素a1的结点。 头指针头结点首元结点a1一个线性表的逻辑结构为:(ZHAO,QIAN,SUN,LI,ZHOU,WU,ZHENG,WANG),其存储结构用单链表表示如下,请问其头指针的值是多少?存储地址数据域指针域1L
4、I437QIAN1313SUN119WANGNULL25WU3731ZHAO737ZHENG1943ZHOU25例答:头指针是指向链表中第一个结点的指针,因此关键是要寻找第一个结点的地址。7ZHAOH31头指针的值是31上例链表的逻辑结构示意图有以下两种形式:ZHAOQIANLISUNZHOUWUZHENG/WANGHZHAOQIANLISUNZHOUWUZHENG/WANGH区别: 无头结点 有头结点Typedef struct Lnode ElemType data; /数据域 struct Lnode *next; /指针域Lnode, *LinkList; / *LinkList为Ln
5、ode类型的指针3. 线性表的单链表存储结构2.3.2 链表的实现1. 单链表的建立和输出2. 单链表的修改3. 单链表的插入4. 单链表的删除5. 应用举例6. 其它链表形式1. 单链表的建立和输出实例:用单链表结构来存放26个英文字母组成的线性表(a,b,c,z),请写出C语言程序。难点分析:每个数据元素在内存中是“零散”存放的,其首地址怎么找?又怎么一一链接?实现思路:先开辟头指针,然后陆续为每个数据元素开辟存储空间并赋值,并及时将地址送给前面的指针。将全局变量及函数提前说明:#include#include#define TRUE 1#define FALSE 0#define OK
6、1#define ERROR 0#define INFEASIBLE -1#define OVERFLOW -2#define NULL 0/单链表的定义:typedef int DataType; /DataType可以是任何相应的数据类型如int, float或chartypedef struct Node /结点类型定义DataType data; /结点的数据域 struct Node *next; /结点的指针域ListNode,*LinkList;void main()LinkList head;/ListNode * head;ListNode *p;LinkList Creat
7、eList(int n);LinkList CreateList(int n)ListNode *p;LinkList L;L=(LinkList)malloc(sizeof(ListNode);L-next =NULL;for(int i=n;i0;-i)p=(LinkList)malloc(sizeof(ListNode);scanf(%d,&p-data);p-next=L-next;L-next =p;return L;LinkList CreateList(int n)ListNode *p;LinkList L;L=(LinkList)malloc(sizeof(ListNode)
8、;L-next =NULL;ListNode * q;q=L;for(int i=1;idata);q-next=p; q=p; q-next=NULL; return L;讨论:要统计链表中数据元素的个数,该如何改写? /求单链表的表长:int ListLength(LinkList head)ListNode *p;p=head-next ;int sum=0;while(p)sum+;p=p-next; return sum;/单链表的打印:void PrintList(LinkList head) ListNode *p; p=head-next ; while(p) printf(
9、%d ,p-data); p=p-next; printf(n);2. 单链表的修改(或读取)思路:要修改第i个数据元素,关键是要先找到该结点的指针p,然后用p-data=new_value 即可。难点:单链表中想取得第i个元素,必须从头指针出发寻找(顺藤摸瓜),不能随机存取 。核心语句:见教材P29的GetElem_L函数说明Status GetElem_L(LinkList L, int i, ElemType &e)P=L-next; j=1;while(p&jnext; +j;if(!p|ji)return ERROR;e=p-data;return OK;17LinkList Get
10、Node(LinkList head,int i)ListNode *p;p=head-next ;int j=1;while(p&jnext; return p;3. 单链表的插入在链表中插入一个元素的示意图如下:xsbapabp插入步骤(即核心语句):Step 1:s-next=p-next;Step 2:p-next=s ;p-nexts-next思考:步骤1和2能互换么?元素x结点应预先生成:S=(test*)malloc(m);S-data=x;S-next=p-next19/单链表的插入:void InsertListAfterI(LinkList head,DataType x,
11、int i)ListNode *p,*s;p=head-next ;int j=1;while(p&jnext; s=(LinkList)malloc(sizeof(ListNode);s-data=x;s-next =p-next ;p-next=s; /单链表的插入:void InsertListBeforeI(LinkList head,DataType x,int i)ListNode *p,*s;p=head-next ;int j=1;while(p&jnext; s=(LinkList)malloc(sizeof(ListNode);s-data=x;s-next =p-next
12、 ;p-next=s; 4. 单链表的删除在链表中删除某元素的示意图如下:cabp删除步骤(即核心语句):q = p-next; /保存b的指针,靠它才能指向cp-next=q-next; /a、c两结点相连free(q) ; /删除b结点,彻底释放p-next思考: 省略free(q)语句行不行?(p-next) - next21/单链表的删除:void DeleteList(LinkList head,int i)ListNode *p,*q;p=head-next ;int j=1;while(p&jnext; q=p-next ;p-next=q-next ;free(q);5.应用举
13、例:两个链表的归并(教材P31)算法要求:已知:线性表 A、B,分别由单链表 LA , LB 存储,其中数据元素按值非递减有序排列,要求:将 A ,B 归并为一个新的线性表C , C 的数据元素仍按值非递减排列 。设线性表 C 由单链表 LC 存储。假设:A=(3,5,8,11),B=(2,6,8,9,11)预测:合并后 C =( 2 , 3 , 5 , 6 , 8 , 8 , 9 , 11,11 )用链表可表示为: 3 511 / 8 La 2 611 / 8 Lb 9 2 3 6 5 Lc 8头结点算法分析:算法主要包括:搜索、比较、插入三个操作:搜索:需要两个指针搜索两个链表;比较:比较
14、结点数据域中数据的大小;插入:将两个结点中数据小的结点插入新链表。25La3 5 8 11 Lb2 6 8 119 Pa、Pb用于搜索La和Lb, Pc指向新链表当前结点LcPaPcif(pa-datadata) pc-next=pa; pc=pa; pa=pa-next; else pc-next=pb; pc=pb; pb=pb-nextPb算法实现: Void MergeList_L(LinkList &La,LinkList &Lb,LinkList &Lc) /按值排序的单链表LA,LB,归并为LC后也按值排序 free(Lb); /释放Lb的头结点 /MergeList_L pc-
15、next = pa?pa:pb ; /插入剩余段 while(pa&pb) /将pa 、pb结点按大小依次插入C中 if(pa-datadata) pc-next=pa; pc=pa; pa=pa-next; else pc-next=pb; pc=pb; pb=pb-next pa=La-next; pb=Lb-next; Lc=pc=La; /初始化 思考:1、不用Lc,直接把La表插到Lb表中;或者把Lb表 插到La表中,如何编程?2、要求不能有重复的数据元素,如何编程?6. 其它链表形式1) 循环链表:将表中最后一个结点的指针域指向头结 点(P-next=head;),整个链表形成一个
16、环。 (示例见课本P35 图2.12)A.特点:从任一结点出发均可找到表中其他结点。B. 与单链表的区别:循环条件 单链表 - p = NULL 或 p -next =NULL 循环链表- p= head 或 p-next = headC. 设立尾指针:可以使链表合并简化(课本P35-图2.13)。2)双向链表:有两个指针域的链表,称为双链表。 (示例见课本P36图2.14)A.结点结构:B.特点:可以双向查找表中结点。C.运算: 插入课本P36算法2.18,图2.16。 删除课本P37算法2.19,图2.15。 注:双向链表在非线性结构(如树结构)中将大量使用。 priordatanext2
17、.3.3 链表的运算效率分析时间效率分析1. 查找 因线性链表只能顺序存取,即在查找时要从头指针找起,查找的时间复杂度为 O(n)。2. 插入和删除 因线性链表不需要移动元素,只要修改指针,一般情况下时间复杂度为 O(1)。但是,如果要在单链表中进行前插或删除操作,由于要从头查找前驱结点,所耗时间复杂度为 O(n)。练:在n个结点的单链表中要删除已知结点*P,需找到它的前驱结点的地址,其时间复杂度为 O(n) 。空间效率分析链表中每个结点都要增加一个指针空间,相当于总共增加了n 个整型变量,空间复杂度为 O(n)。本章小结(讨论题形式)问1:线性表的逻辑结构特点是什么?其顺序存储结构和链式存储结构的特点是什么?答:线性表逻辑结构特点是,只有一个首结点和尾结点;除首尾结点外其他结点只有一个直接前驱和一个直接后继。简言之,线性结构反映结点间的逻辑关系是一对一(1:1)的。 顺序存储时,相邻数据元素的存放地址也相邻(逻辑与物理统一);要求内存中可用存储单元的地址必须是连续的。 链式存储时,相邻数据元素可随意存放,但所占存储空间分两部分,一部分存放结点值,另一部分存放表示结点间关系的指针。问2:顺序存储和链式存储各有哪些优缺点?答:顺序存储的优点是存储密度大(1),存储
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 升降系统施工方案(3篇)
- 年会活动背景策划方案(3篇)
- 施工方案需要审批(3篇)
- 2025年制造业供应链管理手册
- 活动赞助方案
- 2025年高职生物电子(生物电子技术)试题及答案
- 2025年中职(酒店管理)餐饮服务技能试题及答案
- 2025年中职文化事业管理(小型文化活动组织)试题及答案
- 2025年高职铁道机车(机车维护与检修)试题及答案
- 2025年大学护理学(综合护理实操)试题及答案
- 《大学生美育》 课件 第七章 艺术美
- 4S店总经理绩效考核方案
- 电力部门春节安全生产培训
- 原辅材料领料申请单
- 04S519小型排水构筑物1
- 2023年个税工资表
- 2023新青年新机遇新职业发展趋势白皮书-人民数据研究院
- 管理学原理教材-大学适用
- 变电站一次侧设备温度在线监测系统设计
- GB/T 6579-2007实验室玻璃仪器热冲击和热冲击强度试验方法
- GB/T 16913.3-1997粉尘物性试验方法第3部分:堆积密度的测定自然堆积法
评论
0/150
提交评论