第九课
本课主题: 循环链表与双向链表
教学目的: 掌握循环链表的概念,掌握双向链表的的表示与实现
教学重点: 双向链表的表示与实现
教学难点: 双向链表的存储表示
授课内容:
一、复习线性链表的存储结构
二、循环链表的存储结构
循环链表是加一种形式的链式存储结构。它的特点是表中最后一个结点的指针域指向头结点。
循环链表的操作和线性链表基本一致,差别仅在于算法中的循环条件不是p或p->next是否为空,而是它们是否等于头指针。
三、双向链表的存储结构
提问:单向链表的缺点是什么?
提示:如何寻找结点的直接前趋。
双向链表可以克服单链表的单向性的缺点。
在双向链表的结点中有两个指针域,其一指向直接后继,另一指向直接前趋。
1、线性表的双向链表存储结构
typedef struct DulNode{
struct DulNode *prior;
ElemType data;
struct DulNode *next;
}DulNode,*DuLinkList;
对指向双向链表任一结点的指针d,有下面的关系:
d->next->priou=d->priou->next=d
即:当前结点后继的前趋是自身,当前结点前趋的后继也是自身。
2、双向链表的删除操作
Status ListDelete_DuL(DuLinkList &L,int i,ElemType &e){
if(!(p=GetElemP_DuL(L,i)))
return ERROR;
e=p->data;
p->prior->next=p->next;
p->next->prior=p->pror;
free(p);
return OK;
}//ListDelete_DuL
3、双向链表的插入操作
Status ListInsert_DuL(DuLinkList &L,int i,ElemType &e){
if(!(p=GetElemP_DuL(L,i)))
return ERROR;
if(!(s=(DuLinkList)malloc(sizeof(DuLNode)))) return ERROR;
s->data=e;
s->prior=p->prior;
p->prior->next=s;
s->next=p;
p->prior=s;
return OK;
}//ListInsert_DuL
四、一个完整的带头结点的线性边表类型定义:
typedef struct LNode{
ElemType data;
struct LNode *next;
}*Link,*Position;
typedef struct{
Link head,tail;
int len;
}LinkList;
Status MakeNode(Link &p,ElemType e);
//分配由p指向的值为e的结点,并返回OK;若分配失败,则返回ERROR
void FreeNode(Link &p);
//释放p所指结点
Status InitLinst(LinkList &L);
//构造一个空的线性链表L
Status DestroyLinst(LinkList &L);
//销毁线性链表L,L不再存在
Status ClearList(LinkList &L);
//将线性链表L重置为空表,并释放原链表的结点空间
Status InsFirst(Link h,Link s);
//已知h指向线性链表的头结点,将s所指结点插入在第一个结点之前
Status DelFirst(Link h,Link &q);
//已知h指向线性链表的头结点,删除链表中的第一个结点并以q返回
Status Append(LinkList &L,Link s);
//将指针s所指(彼此以指针相链)的一串结点链接在线性链表L的最后一个结点
//之后,并改变链表L的尾指针指向新的尾结点
Status Remove(LinkList &L,Link &q);
//删除线性链表L中的尾结点并以q返回,改变链表L的尾指针指向新的尾结点
Status InsBefore(LinkList &L,Link &p,Link s);
//已知p指向线性链表L中的一个结点,将s所指结点插入在p所指结点之前,
//并修改指针p指向新插入的结点
Status InsAfter(LinkList &L,Link &p,Link s);
//已知p指向线性链表L中的一个结点,将s所指结点插入在p所指结点之后,
//并修改指针p指向新插入的结点
Status SetCurElem(Link &p,ElemType e);
//已知p指向线性链表中的一个结点,用e更新p所指结点中数据元素的值
ElemType GetCurElem(Link p);
//已知p指向线性链表中的一个结点,返回p所指结点中数据元素的值
Status ListEmpty(LinkList L);
//若线性链表L为空表,则返回TRUE,否则返回FALSE
int ListLength(LinkList L);
//返回线性链表L中的元素个数
Position GetHead(LinkList L);
//返回线性链表L中头结点的位置
Position GetLast(LinkList L);
//返回线性链表L中最后一个结点的位置
Position PriorPos(LinkList L,Link p);
//已知p指向线性链表L中的一个结点,返回p所指结点的直接前趋的值
//若无前趋,返回NULL
Position NextPos(LinkList L,Link p);
//已知p指向线性链表L中的一个结点,返回p所指结点的直接后继的值
//若无后继,返回NULL
Status LocatePos(LinkList L,int i,Link &p);
//返回p指示线性链表L中第i个结点的位置并返回OK,i值不合法时返回ERROR
Position LocateElem(LinkList L,ElemType e,
Status(*compare)(ElemType,ElemType));
//返回线性链表L中第1个与e满足函数compare()判定关系的元素的位置,
//若下存在这样的元素,则返回NULL
Status ListTraverse(LinkList L,Status(*visit)());
//依次对L的每个元素调用函数visit()。一旦visit()失败,则操作失败。
五、总结本课内容
循环链表的存储结构
双向链表的存储结构

本文出自 51CTO.COM技术博客

转载于:https://blog.51cto.com/1539867/396246

第九课:循环链表与双向链表相关推荐

  1. C#之windows桌面软件第九课:汉字串口助手

    C#之windows桌面软件第九课:汉字串口助手 using System; using System.Collections.Generic; using System.ComponentModel ...

  2. 数据结构——线性表:顺序表、单向链表、循环链表、双向链表

    线性表   是一种数据结构:n个数据元素的有限序列 表示形式: L = (a1,a2...an) a1是线性表的元素,小写. n=0时候为空表 数据元素具有相同特性 相邻元素之间存在序偶关系:即有唯一 ...

  3. 投资学习网课笔记(part9)--基金第九课

    学习笔记,仅供参考,有错必纠 文章目录 基金第九课 估值指标 市盈率 市净率 股息率 盈利收益率 PEG 基金第九课 估值指标 什么是估值指标 估值指标是衡量股票内在价值的指标,它可以用来判断股票的价 ...

  4. 综合日语第一册第九课

    第九课 第一单元 复习 自动词:当主语做完动作后,被改变的是主语本身的状态,这个动词就叫自动词,即自动词改变的是自身的状态: 他动词:当主语做完动作后,被改变的是主语之外的事物的状况,那么这样的动词就 ...

  5. 榆树计算机课,吉林省榆树市弓棚镇武龙中学校七年级信息技术:第九课 Excel表格计算 教案+课件 (2份打包)...

    ID:8701298 分类: 吉林 , 2018 资源大小:2626KB 资料简介: 课 题Word表格 课型新授课第 1 课时教材分析本节课内容是长春版<信息技术>第九课的内容,学习制作 ...

  6. 《幸福就在你身边》第九课、确信自己有好命【哈佛大学幸福课精华】

    一.确信自己一定会走运 "只要相信自己,就会走运".世上无难事,只怕有心人.一个人能否成功,完全取决于他对自己信任的程度.只要找准了方向,充满信心地去努力,就没有实现不了的愿望.要 ...

  7. 基于QT实现的可视化链表(单链表、循环链表、双向链表)

    1.1 题目 题号1:分别以单链表.循环链表.双向链表为例,实现线性表的建立.插入.删除.查找等基本操作. 要求:能够把建立.插入.删除等基本操作的过程随时显示输出来. 1.2 软件功能 功能分为三个 ...

  8. C语言之链表:单向链表,循环链表,双向链表

    C语言之链表:单向链表,循环链表,双向链表 提起链式存储结构,其与数组是两个非常基础的数据结构,每当提到链式存储结构时,一般情况下我们都会将其与数组放到一块儿来比较. 对于数组与链表,从结构上来看,数 ...

  9. 【PHP MySQL】数据库专题 第九课 自连接

    [PHP & MySQL]✔️数据库专题✔️ 第九课 自连接 概述 自连接 子查询 in 子查询 EXISTS 概述 从今天开始, 小白我将带领大家一起来补充一下 数据库的知识. 自连接 自连 ...

最新文章

  1. Java中? extends T和? super T的理解
  2. 智源研究院发布“智能体系架构与芯片”重大研究方向,打造通用智能处理器,突破“算法共性特征”难题...
  3. CSS布局之品字布局
  4. 并发模型与IO模型梳理
  5. 说说JSON和JSONP,也许你会豁然开朗,含jQuery用例
  6. spring 源码-context
  7. 汇编语言(一)之反转字符串输出
  8. python情感分析预测模型_python snownlp情感分析简易demo
  9. android driver log,Android调试驱动抓log的方法
  10. 心形图案爱心代码编程c语言
  11. C++11之final详解
  12. 战争英雄、同性恋和计算机科学的奠基人
  13. fastposter v2.7.1 紧急发布 电商海报编辑器
  14. 刷脸支付行业代理的几个坑,你踩了吗?
  15. 【C语言】用1,2,3,4四个数字组成不相同并且没有相同数字的三位数
  16. NTC热敏电阻设计高精度温度计的方案1
  17. 在php中调用java的方法
  18. History 和 Hash 路由模式
  19. mybatis的parameterType可以不写(我一般都不写)
  20. hadoop集群web页面无法显示节点信息的解决方法

热门文章

  1. PMP知识点(七、资源管理)
  2. 《系统集成项目管理工程师》必背100个知识点-09初步可行性研究可能出现的结果...
  3. 笔记-项目沟通管理-沟通表达方式
  4. 笔记-项目管理基础知识-复习要点
  5. Leaflet中通过setStyle实现图形样式编辑
  6. JS中调用本地exe程序
  7. Vue+Openlayers实现显示图片并分优先级多图层加载
  8. VS中的C#项目怎样引入另一个项目
  9. SpringBoot中使用fastjson将map转换成json
  10. Eclipse中实现SpringBoot与Mybatis整合(图文教程带源码)