单链表和循环链表.ppt_第1页
单链表和循环链表.ppt_第2页
单链表和循环链表.ppt_第3页
单链表和循环链表.ppt_第4页
单链表和循环链表.ppt_第5页
已阅读5页,还剩29页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、线性链表,链表是指用一组任意的存储单元依次存放线性表的结点,这组存储单元即可以是连续的,也可以是不连续的,甚至是零散分布在内存中的任意位置。 链表中结点的逻辑次序和物理次序不一定相同。 为了能正确表示结点间的逻辑关系,在存储每个结点值的同时,还必须存储指示其后继结点的地址(或位置)信息,这个信息称为指针(pointer)或链(link)。,1,链表中的结点结构 其中:data域是数据域,用来存放结点的值。next是指针域(亦称链域),用来存放结点的直接后继的地址(或位置)。 链表通过每个结点的链域将线性表的n个结点按其逻辑次序链接在一起的。 上述链表的每一个结点只有一个链域,故将这种链表称为单

2、链表(Single Linked)。 单链表中每个结点的存储地址是存放在其前趋结点的next域中,而开始结点无前趋,故应设头指针head指向开始结点。同时,由于终端结点无后继,故终端结点的指针域为空,即为NULL.,2,例 线性表(ZHAO,QIAN,SUN,LI,ZHOU,WU,ZHENG,WANG),3,通常我们把链表画成用箭头相链接的结点的序列,结点之间的箭头表示链域中的指针。 单链表可由头指针惟一确定,4,C语言类型描述 typedef struct node datatype data; /*数据元素类型*/ struct node *next; /*指针类型*/ node, * l

3、klist; /*结点类型*/ node是结点类型 lklist是指向node类型的指针 lklist p, 声明一个指向node类型的指针 *p由两个域组成的记录,用(*p).data和(*p).next表示,通常记成p-data和p-next,分别用来存放数据元素的值和后继结点的地址,5,有时,我们在单链表的第一个结点之前附设一个结点,称为头结点 头结点的数据域可以不储存任何信息,也可存储如线性表的长度等附加信息 头结点的指针域存储指向第一个结点的指针。 非空表 空表,6,单链表上的一些基本操作 初始化 initiate_lklist(l) 定义 建立如右图所示的一个空表 算法 void

4、initiate_lklist(lklist ,7,2. 求表长 length_lklist(l) 定义 求单链表中结点数目 基本思想 从头到尾数一遍 算法 int length_lklist(lklist l) lklist p=l; /*工作指针 p从头结点开始*/ int j=0; /*计数器从0开始,因为有头结点*/ while (p-next!=NULL) /*p所指结点不是尾结点*/ p=p-next; /*p指向下一个结点,即往下数*/ j+; /*计数器加1*/ return (j); ,8,3. 按序号查找 find_lklist(l, i) 定义 查找单链表第i个元素,否则

5、返回NULL 基本思想 从头指针出发,顺链域next逐个往下搜索,直到找到第i个结点为止,9,算法 node *find_lklist(lklist l, int i) lklist p=l; int j=0; /*初始化*/ while (p-next!=NULL) ,10,4. 定位 locate_lklist(l,x) 定义 按值查找,返回线性表l中第一个值与x相等的结点序号,否则为0 基本思想 从头指针出发,顺链域next逐个往下搜索,直到找到值为x的结点为止,11,算法 int locate_lklist(lklist l, datatype x) lklist p=l; int j

6、=0; /*初始化*/ while (p-next!=NULL) /*没找到,返回0*/ ,12,5.读表元 get_lklist(l,i) 定义 求链表 l 第 i 个结点的值,若找不到返回NULL 基本思想 类似按序号查找,13,算法 datatype get_lklist(lklist l ,int i ) lklist p=l; int j=0; /*初始化*/ while (p-next!=NULL) ,14,6. 插入 insert_lklist(l,x,i) 定义 在线性表l的第i个结点前插入一个数值为e的结点,使之成为第i个结点 基本思想 找到插入位置 生成一个数值为e的新结点

7、 修改某些结点的链域,15,e,算法 void insert_lklist(lklist ,16,7. 删除 delete_lklist(l,i) 定义 删除线性表的第i个结点 基本思想 找到第i个结点 从单链表上摘除该结点(修改某些结点的指针域),17,算法 void delete_lklist(lklist ,18,插入 删除 求表长 初始化 O(1) 按序号查找 定位(按值查找) 读表元,19,O(n),O(n),单链表的其它操作 1.建表 create_lklist1 定义 将一个线性表中的数据元素依次输入并建立该线性表的单链表 基本思想 初始化表l 依次输入各数据元素,并插入到表l中

8、,20,算法 void create_lklist1(lklist ,21,分析 特点 利用基本运算 时间复杂性 查找 0+1+2+(n-1)=n(n-1)/2 O(n2) 结论 效率不高 原因 每次插入都从头开始查找到表尾 改进 用一个工作指针始终指向表尾(称为尾指针),用它指示链入位置,22,void create_lklist2(lklist /* 尾指针标志*/ ,23,分析方法二 算法较前者复杂 时间效率比前者高,O(n) 结论 要求时间效率,用方法二 无时间要求,用方法一,简单,24,循环链表,定义 与单链表区别在于其尾结点的链域不是NULL ,而是一个指向头结点的指针 特点 从表

9、中任一结点出发都能通过后移操作而扫描整个链表 示意图,25,循环链表类型说明 #define datatype int typedef struct node datatype data; /*数据元素类型*/ struct node *next; /*指针类型*/ node, * clklist; /*结点类型*/ node是结点类型 cklist是指向node类型的指针,26,基本运算在循环表上的实现 类似于在单链表上的实现 区别:判断表尾条件不同 p-next!=NULL 改成 p-next!=H,其中H为头指针,27,初始化 initiate_clklist(l) 算法 void in

10、itiate_clklist(clklist ,28,2. 求表长 length_clklist( l ) 算法 int length_clklist(clklist l) clklist p=l; /*工作指针p从头结点开始*/ int j=0; /*计数器清0*/ while (p-next!=l) /*p所指结点不是尾结点*/ p=p-next; /*p指向下一个结点,即往下数*/ j+; /*计数器加1*/ return (j); ,29,3. 按序号查找 find_clklist(l,i) 算法 node *find_clklist(clklist l, int i) clklist p=l; int j=0; /*初始化*/ while (p-next!=l) ,30,4.定位 locate_clklist(l,x) 算法 int locate_clklist(clklist l, datatype x) clklist p=l; int j=0; /*初始化*/ while (p-next!=l) ,31,5. 读表元 get_clklist( l , i) 算法 datatype get_clklist(clklist l ,int i ) clkli

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论