西安交通大学计教中心 ctec.xjtu.edu.cn

Slides:



Advertisements
Similar presentations
考场纪律&监考要求 课程主讲人和主持人要亲自参加监考。
Advertisements

数据结构概论 第2章 线性表 董黎刚 浙江工商大学信电学院
第二章 线性表 £2.4 线性表的应用 £2.1 线性表的类型定义 £2.2 线性表的顺序存储结构 £2.3 线性表的链式存储结构
第二章 线性表 2.1 线性表的逻辑结构 一. 线性表定义如下:
第二章 线性表 ⒈教学内容:2.1 线性表逻辑结构; 2.2 线性表的顺序存储及运算实现; 2.3 线性表的链式存储和实现。
第二章 线性表 1 线性表的逻辑结构及其基本操作 2 线性表的顺序存储结构 3 线性表的链式存储结构 4 静态链表 5 应用实例.
第二章 线性表.
第2章 线性表 2.1 线性表的概念及运算 2.2 线性表的顺序存储 2.3 线性表的链式存储 2.4 一元多项式的表示及相加.
Linked List Operations
第3章 栈和队列 3.1 栈 3.2 队列 3.3 应用.
第2章 线性表 线性结构 是一个数据元素的有序集合。.
其他类型的链表主要内容 静态链表 循环链表 双向链表.
主要内容: 1.第一部分 概述 2.第二部分 线性表、栈、队列
计算机软件技术基础 数据结构与算法(2).
第三章 栈和队列 Stack and Queue
第二章 线性表 线性表 顺序表 链表 顺序表与链表的比较.
数 据 结 构 Ch.2 线性表 计 算 机 学 院 肖明军
第三章 线性表 3.1 线性表的类型定义 3.2 顺序存储的线性表 3.3 链式存储的线性表 3.4 有序表 3.5 顺序表和链表的综合比较.
第2章 线性表(三) 1/.
数据结构 第二章 线性表.
制作:崔广才
数据结构 Data Structure 中南大学 主讲人:王国军,郑瑾 中南大学信息院计科系
教 师:曾晓东 电 话: E_mail: 计算机软件技术基础 教 师:曾晓东 电 话: E_mail:
第2章 线性表 2.1 线性表的基本概念 2.2 线性表的顺序存储 2.3 线性表的链式存储 2.4 线性表的应用 2.5 有序表 本章小结.
本 章 说 明 2.1 线性表的类型定义 2.2 线性表的顺序表示和实现 2.3 线性表的链式存储结构 2.4 循环链表和双向链
第2章 线性表 线性表抽象数据类型 顺序表 主要知识点 单链表 循环单链表 循环双向链表 静态链表 设计举例.
第 1 章 数据结构 1.1 基本数据结构与算法 1.2 线性表 1.3 栈和队列 1.4 树和二叉树 1.5 查找 1.6 内部排序 65
第十章 C高级程序应用—链表* 10.1链表的基本概念 10.2单向链表 10.3双向链表 10.4应用举例.
第2章 线性表 2.1 线性表 2.2 顺序表 2.3 单链表 2.4 循环单链表 2.5 双向链表 2.6 仿真链表
第2章 线性表 丽水学院工学院.
第2章 线性表 2.1 线性表的类型定义 2.2 线性表的顺序表示和实现 2.3 线性表的链式表示和实现 2.4 一元多项式的表示.
线性表是一种最简单的线性结构 线性结构的基本特征为: 线性结构 是 一个数据元素的有序(次序)集 1.集合中必存在唯一的一个“第一元素”;
第二章 线性表.
第一章 绪论.
陈海明 副教授 信息学院 计算机系 电子信息类非计算机专业选修课 程序设计实践 陈海明 副教授 信息学院 计算机系
内容回顾 线性表的定义和特点 线性表的顺序存储及查找、插入和删除.
第二章 线性表 2.1 线性表的类型定义 2.2线性表的顺序存储 2.3线性表的链式存储 2.4一元多项式的表示和相加.
(知识点三) 2.3 线性表的链式表示和实现 本节将介绍线性表的另一存储结构—— 链式存储及其对应的操作。
线性表练习.
cn/~dongeliu/dsa.html 刘 东 信息学院6系 中国科学技术大学
第三章 栈和队列.
顺序表的插入.
第2章 线性表 本章主要介绍下列内容 线性表的定义和基本操作 线性表的顺序存储结构 线性表的链式存储结构 线性表的应用举例.
3.1 线性表及逻辑结构 3.2 线性表的顺序存储 3.3 线性表的链式存储 3.4 链式存储结构的应用
严蔚敏、吴伟民编著 清华大学出版社 学习网站:中国网页设计
C++语言程序设计 C++语言程序设计 第七章 类与对象 第十一组 C++语言程序设计.
顺序表的删除.
线 性 代 数 厦门大学线性代数教学组 2019年4月24日6时8分 / 45.
数据结构习题课 信息学院 赵明 2005年秋.
单链表的基本概念.
顺序查找.
线性结构 线性结构的特点: 线性结构的种类 在数据元素的非空有限集中, (1)存在唯一的一个被称做“第一个”的数据元素;
第 四 讲 线性表(二).
第二章 线性表.
第三章 数据组织与处理.
3.16 枚举算法及其程序实现 ——数组的作用.
多层循环 Private Sub Command1_Click() Dim i As Integer, j As Integer
实验目的:掌握数据的顺序存储结构及它们在计算机中的操作。 实验内容:
第七讲 栈和队列(二) 1/.
第三章 线性表 3.1 线性表的类型定义 3.2 顺序存储的线性表 3.3 链式存储的线性表 3.4 有序表 3.5 顺序表和链表的综合比较.
第15讲 链表 计算机与通信工程学院.
基于列存储的RDF数据管理 朱敏
C语言程序设计 第9章 结构体.
西安交通大学计教中心 ctec.xjtu.edu.cn
算法3.3 void InitList_sq(SqList &L,int msize=LIST_INIT_SIZE)
Chapter 2 Entity-Relationship Model
第二章 线性表 线性表是一种最简单的线性结构 线性结构是一个数据元素的有序(次序)集.
第二部分 数据结构—— 用面向对象方法与C++描述.
本节内容 1.二叉排序树的定义 2.二叉排序树的查找操作 3.二叉排序树的插入操作 4.二叉排序树的删除操作 5.二叉排序树的总结
第二章 线性表 东南大学计算机学院 方效林 本课件借鉴了清华大学殷人昆老师 和哈尔滨工业大学张岩老师的课件.
Presentation transcript:

西安交通大学计教中心 ctec.xjtu.edu.cn 线性链表 西安交通大学计教中心 ctec.xjtu.edu.cn

单链表的概念 采用链式存储结构的线性表有单链表、双向链表、单循环链表以及双向循环链表等多种形式。 单链表用一组地址任意的存储单元存放线性表中的数据元素。由于逻辑上相邻的元素其物理位置不一定相邻,为了建立元素间的逻辑关系,需要在线性表的每个元素中附加其后继元素的地址信息。 这种地址信息称为指针。附加了其他元素指针的数据元素称为结点。

结点定义 结点包含数据域和指针域,结点结构可描述为: 其中data域用来存放结点本身信息,类型由具体问题而定,本节也将其设定为ElemType类型,表示某一种具体的已知类型,next域存放下一个元素地址。

带头结点单链表的逻辑结构 带头结点的单链表 为了能顺次访问每个结点,需要保存单链表第一个结点的存储地址。这个地址称为线性表的头指针,本节用head表示。 为了操作上的方便,可以在单链表的头部增加一个特殊的头结点。头结点的类型与其他结点一样,只是头结点的数据域为空。 增加头结点避免了在删除或添加第一个位置的元素时进行的特殊程序处理。 head a1 a2 an ∧ 带头结点的单链表

带头结点单链表的存储结构 单链表存储结构示意图 … … 存储地址 数据域 22 head 38 86 94 a2 86 a3 NULL … … a3 NULL a1 22 存储地址 单链表存储结构示意图

结点的c++描述 typedef struct LNode { ElemType data; //数据域,ElemType代 //表某种数据类型 struct LNode *next; // 指针域 } *LinkList; 这个定义是自引用类型的。换言之,每个结点都包含另一个同类型结点的地址。

指针操作 假如p为指向某一结点的指针,则该结点的数据域用p->data表示,该结点的指针域用 p->next表示。它们都是变量,可以被赋值,也可向其他变量赋值。 例如: 假定data为整型变量,则 p->data=5; p->next=NULL; 将结点变为:

如果p为指向结点ai的指针,那么p->next就是指向ai后继ai+1的指针;若q为另一指针变量 q=p 指针p指向指针q所指的结点 q=p->next 指针p指向指针q所指结点的后继 ai ai-1 ai+1 q p

p=p->next 指针p向后移动一个结点 ai-1 ai ai+1

常用算法 (1)求单链表的长度 单链表长度不定,要确定链表长度需要走遍表中所有结点才能算出。 int Length( ) { LNode *p=head->next; //p指向第一个元素所在结点 int len=0; while( p!=NULL ) { //逐个检测p结点存在与否 len++; p=p->next; //指针后移 } return len; 为了保持头指针不变,使用了指针p在链表中移动。

q->next=p->next; delete p; ai-1 ai ai+1 ①若第i个结点存在则找到第i和第i-1个结点的指针p和q ②通过语句q->next=p->next将第i-1个结点的指针域赋值为第i+1个结点的指针,将第i个结点从链表中断开。 ③ 释放第i个结点所占空间以便于重用。 q p q->next=p->next; delete p; ai-1 ai ai+1

void Delete( LinkList& head,int i ) { if(i<1) cout<<”不存在第”<<i<<”个元素”; else { LNode *p=head; //p指向头结点(第0个结点) LNode *q; //q和p最终分别指向第i-1和第i个结点 int k=0; while( p!=NULL&&k<i ) { q=p; p=p->next; k++; } if(p==NULL) cout<< i<<”超出链表长度”; q->next=p->next; //从链表中删除该结点 delete p; //释放结点p

(3)在第i个位置插入新结点x ai-1 ai x s 在链表的第i个位置插入一个新结点,需进行如下操作: ① 首先找到第i-1个结点的指针p ② 建立新结点s并通过语句s->next=p->next将其指针指向第i个结点 ③ 通过语句p->next=s将第i-1个结点的指针指向新结点 ai-1 ai p x s 1 2 s->data = x; s->next=p->next; p->next=s;

void Insert(LinkList& head, int i, ElemType x) { if(i<1) cout<<"不存在第"<<i<<"个位置"; else { LNode *p=head; //p最终将指向第i-1个结点 int k=0; //p目前指向第0个结点(头结点) while( p!=NULL&&k<i-1 ) { p=p->next; k++; } if(p==NULL) cout<< i<<"超出链表最大位置"; LNode *s=new LNode; //建立新结点s s->data = x; s->next=p->next; //定义结点s的指针域 p->next=s; //修改结点p的指针域

可以按照数据元素本身的值进行查找,也可以按照数据元素的某个属性进行查找。这里仅给出按照数据元素本身的值进行查找的算法。 (4)在单链表中查找数据值为x的结点 可以按照数据元素本身的值进行查找,也可以按照数据元素的某个属性进行查找。这里仅给出按照数据元素本身的值进行查找的算法。 LNode* Find( LinkList& head, ElemType x ) { LNode *p=head->next; //p指向第一个元素所在结点 while ( p!=NULL && p->data!=x ) p = p->next; return p; }

其他形式的链表 (1)单循环链表 通过把单链表最后一个结点的指针改为指向第一个结点,就可以把一个单链表改造成单循环链表。因为单链表最后一个结点的指针总是空值,所以这样的修改总是可行的。 head head ... a1 a2 an

2)双向链表 如果每个链表结点既有指向下一个元素的指针,又有指向前一个元素的指针,那么这种链表就是双向链表,双向链表结点的定义只需在单链表结点定义的基础上增加一个前向指针即可。 head ... an a2 a1

链表应用举例 约瑟夫环问题可以解释为:将整数1至n围成一个圆圈,假定从某个整数开始顺时针从1数到m时,令该位置整数出列;然后再从下一数开始,顺时针从1数到第m时再令其出列,如此下去,直到圆圈中无整数为止。请写出所有数字出列的顺序。 【例2-2】