数据结构-课件-链表部分.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《数据结构-课件-链表部分.ppt》由用户(三亚风情)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 课件 部分
- 资源描述:
-
1、回顾上次课内容回顾上次课内容n数据结构的相关概念n数据的存储结构逻辑结构存储结构集合集合线性结构线性结构树形结构树形结构图状结构或网图状结构或网状结构状结构顺序存储结构顺序存储结构链接存储结构链接存储结构n 算法分析方法第二章第二章 线性表线性表主要内容:l 线性表的类型定义线性表的类型定义l 线性表的顺序表示和实现线性表的顺序表示和实现l 线性表的链式表示和实现线性表的链式表示和实现l 线性表的应用举例线性表的应用举例 存在惟一的一个开始结点,称做存在惟一的一个开始结点,称做“第一个第一个”的数据元素的数据元素存在惟一的一个终端结点,称做存在惟一的一个终端结点,称做“最后一个最后一个”的数据
2、元素的数据元素除第一个外,每个数据元素只有一个前驱除第一个外,每个数据元素只有一个前驱除最后一个外,每个数据元素只有一个后继除最后一个外,每个数据元素只有一个后继 线性表是由线性表是由n (n=0)个数据元素个数据元素(结点结点)a1,a2,.,ai,.,an组成的有限序列。其中,数据元素的个数组成的有限序列。其中,数据元素的个数n定义为表长。定义为表长。当当n=0时称为空表,非空的线性表时称为空表,非空的线性表(n0)记为:记为: (a1,a2,.,ai,.,an) 1.数据元素数据元素ai是一个抽象的符号是一个抽象的符号 2. ai可取各种数据类型可取各种数据类型 3. 同一线性表中的元素
3、必定具有相同的特性,属于同一数同一线性表中的元素必定具有相同的特性,属于同一数 据对象据对象 4. 相邻数据元素之间存在序偶关系相邻数据元素之间存在序偶关系 5. i是数据元素是数据元素ai在线性表中的位序在线性表中的位序 (1i n) :仅有一个开始结点和一个终端结点,并且所有结:仅有一个开始结点和一个终端结点,并且所有结点都最多只有一个前驱和一个后继点都最多只有一个前驱和一个后继2.1 线性表的类型定义线性表的类型定义二、抽象数据类型线性表的定义二、抽象数据类型线性表的定义ADT List 数据对象:数据对象:D=aiai Elemset, i=1,2,n , n0数据关系:数据关系:R1
4、= ai-1 , ai D, i=2, ,n基本操作:基本操作:构造、销毁、置空、判空、获取元素、插入、删除、构造、销毁、置空、判空、获取元素、插入、删除、定位等。定位等。ADT Listna1是第一个元素,有且仅有一个直接后继元素是第一个元素,有且仅有一个直接后继元素a2;nan是最后一个元素,有且仅有一个直接前趋元素是最后一个元素,有且仅有一个直接前趋元素an-1 ;n其余其余ai(1in)有且仅有一个直接前趋有且仅有一个直接前趋ai-1,有且仅有一,有且仅有一个直接后继个直接后继ai+1一一顺序表示(存顺序表示(存储):储):指在内存中用地址连续的一块存储空间顺序存放线性表的各元素,用这
5、种存储形式存储的线性表称其为顺序表顺序表。线性表顺序存储结构示意图线性表顺序存储结构示意图2.2 线性表的顺序表示和实现线性表的顺序表示和实现n数据元素存储位置表示数据元素存储位置表示设设 a的存储地址为的存储地址为Loc(a),每个数据元素占,每个数据元素占l l个存储地址,则第个存储地址,则第i个数据元素的地址为:个数据元素的地址为: Loc(ai)=Loc(a)+(i-1)* l l ,1inn逻辑上相邻的逻辑上相邻的ai和和ai+1以相邻的存储位置。以相邻的存储位置。n确定起始位置后,顺序表中任一数据元素都可确定起始位置后,顺序表中任一数据元素都可随机存取。随机存取。n顺序表是一种随机
6、存取的存储结构。顺序表是一种随机存取的存储结构。n 高级语言中一般用数组来描述顺序存储。高级语言中一般用数组来描述顺序存储。#include#define MAXSIZE 100typedef int ElemType;typedef structElemType aMAXSIZE;int length;Sqlist;因为线性表长度可变,且所需最大空间随问题不同因为线性表长度可变,且所需最大空间随问题不同而不同,所以用动态分配的一维数组而不同,所以用动态分配的一维数组(P22)。为使得。为使得算法简明扼要,暂使用静态数组。算法简明扼要,暂使用静态数组。线性表的建立、输出算法线性表的建立、输出算
7、法初始化初始化void initlist(Sqlist *L) L-length=0;建立顺序表建立顺序表void creat_sqlist(Sqlist &L) int i,n; coutn; L.length=n; for (i=0; iL.ai;void initlist(Sqlist &L) L.length=0;Sqlist Sl;initlist(&Sl);Sqlist Sl;initlist(Sl);输出顺序表输出顺序表void outputl(Sqlist L) int i; coutList length L.lengthendl; for (i=0; iL.length;
8、i+) coutL.ai ;if (i+1)%10=0) coutendl; coutendl; (a1, , ai-1, ai, , an) 改变为 (a1, , ai-1, e, ai, , an)a1 a2 ai-1 ai ana1 a2 ai-1 ai ean表的长度加11. 插入:在线性表第插入:在线性表第i (1i n+1)个位置上插入元)个位置上插入元素素e线性表主要操作的实现线性表主要操作的实现注意:注意:C语言中的数组下标从语言中的数组下标从“0”开始,因此,若开始,因此,若L是是Sqlist类型的顺序表,则表中第类型的顺序表,则表中第i个元素是个元素是L.ai-1。void
9、 insert_sq(Sqlist &L, int i, ElemType e)int j;if (L.length=MAXSIZE) coutERROR! endl;elseif (iL.length+1) coutERROR! i-1; j-)L.aj=L.aj-1;L.ai-1=e;L.length+; 这里的问题规模是表的长度,设它的值为这里的问题规模是表的长度,设它的值为n。该算。该算法的时间主要花费在循环的元素后移语句上,所需移法的时间主要花费在循环的元素后移语句上,所需移动元素的次数不仅依赖于表的长度,而且还与插入位动元素的次数不仅依赖于表的长度,而且还与插入位置有关。置有关。i
10、位置位置 移动次数移动次数 1n 2 n-1 i n-i+1 n 1 n+10插入操作时间复杂度分析插入操作时间复杂度分析n最好情况下:T(n)=O(1)n最坏情况下:T(n)=O(n)n平均时间复杂度: 长度为n的顺序表中,插入一个结点,令E(n)表示移动结点的期望值(移动平均次数),在表中第i个位置插入一个结点移动的次数为n-i+1.其中pi表示在表中第i位置插入结点的概率。Pi1/(n+1)计算得 E(n)=n/2,所以平均时间复杂度为O(n)11)1(*)(niiinpnE (a1, , ai-1, ai, ai+1, , an) 改变为 (a1, , ai-1, ai+1, , an
11、) (1 i n)ai+1 an表的长度减1a1 a2 ai-1 ai ai+1 ana1 a2 ai-1 2.2.删除:在线性表中删除第删除:在线性表中删除第i i个元素,使个元素,使ElemType delete_sq(Sqlist &L, int i)int x,j;if (L.length=0)coutERROR! endl;return(-1);else if (iL.length)coutERROR!“endl;return(-1);else x=L.ai-1;for (j=i; j0),否则返回,否则返回-1,表示未找到。,表示未找到。int locate_sq(Sqlist L
12、, ElemType e)int i;i=0;while (i=L.length-1 & L.ai!=e) i+;if (i=L.length-1) return (i+1);return(-1);4. 合并:两表分别非递减有序合并:两表分别非递减有序(递增或等值递增或等值),合并后,合并后仍然非递减有序。仍然非递减有序。void merge_list(Sqlist a, Sqlist b, Sqlist &c)int i,j,k;i=j=k=0;c.length=a.length+b.length;while (i=a.length-1 & j=b.length-1)if (a.ai=b.a
13、j) c.ak=a.ai; i+; k+;else c.ak=b.aj; j+; k+;while (i=a.length-1) c.ak=a.ai; i+; k+; while (jdata 表示数据域表示数据域p-next 表示指针域表示指针域函数函数mallocfree(p);访问结点访问结点P=(LNode*) malloc(sizeof(LNode);产生一个产生一个Lnode类型结点,把首地址送给类型结点,把首地址送给P变量变量系统回收系统回收P所指向的结点(若干字节),所指向的结点(若干字节),P中无中无所指向所指向Lnode *p, s;p-data=20; p-next=nu
14、ll;(s.data=20; s.next=null; 用的少用的少) 指针指向结点指针指向结点 p=qq p指针指向后继指针指向后继 p=q-next指针移动指针移动 p=p-nextqppppqp-next =qp-next =q-nextpq1. 创建链表创建链表单链表的基本运算单链表的基本运算void creat_list() ElemType x;LNode *ptr,*p;p=head;coutx;while (x!=999)ptr=new LNode;ptr-data=x;ptr-next=NULL;p-next=ptr;p=ptr;coutx;调用语句:head=new LNo
15、de;head-next=NULL;creat_list();定义定义head 为全局变量为全局变量void create(LNode *L)int i,n;LNode *s,*p;p=L;coutn;for (i=1; i=n; i+) s=new LNode;couts-data;p-next=s;p=s;p-next=NULL;调用语句:head=new LNode;head-next=NULL;create(head);定义定义head 为局部变量为局部变量LNode *Creat_L(int n)int i;LNode *L,*p;L=new LNode;L-next=NULL;fo
展开阅读全文