数据结构讲义
数据结构(第1章)讲义

树
01
02
03
树的定义
树是一种递归定义的数据 结构,其中每个节点可以 有多个子节点,但只有一 个父节点。
树的性质
树具有层次性、有序性和 无环性等性质。
树的表示方法
树可以使用多种方式表示, 如嵌套结构、邻接矩阵等。
森林
森林的定义
森林是由若干棵树组成的集合, 其中每棵树都是一个独立的数据
结构。
森林的性质
社交网络
社交网络中需要处理大量的用户关系和信息,数 据结构在其中发挥着重要的作用。例如,使用图 数据结构可以表示用户之间的关系,使用哈希表 可以快速查找用户信息。
THANKS FOR WATCHING
感谢您的观看
05 排序与查找
排序算法
• 冒泡排序:通过重复地遍历待排序的数列,比较相邻的两个元素,若它们的顺 序错误则交换它们,直到没有需要交换的元素为止。
• 选择排序:在未排序的序列中找到最小(或最大)的元素,存放到排序序列的 起始位置,然后再从剩余未排序的元素中继续寻找最小(或最大)元素,然后 放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。
的中间元素开始,如果中间元素正好是目标值,则搜索过程结束;如果目标值 大于或小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且同 样从中间元素开始比较。 • 哈希查找:通过哈希函数将关键字转化为数组下标,然后在对应的数组下标位 置上进行查找。 • 二叉查找树查找:在二叉查找树中进行查找,从根节点开始,如果当前节点的 关键字等于目标值,则查找成功;如果当前节点的关键字大于目标值,则在左 子树中继续查找;如果当前节点的关键字小于目标值,则在右子树中继续查找 。
• 插入排序:将一个数据插入到已经排好序的有序数据中,从而得到一个新的、 个数加一的有序数据。
讲数据结构概述优秀课件

✓用图形方式表示如下:
abcde
线性逻辑结构
说明: a是b的直接前驱,b是a的直接后继 a是开始结点,e为终端结点,b、c、d为内部结 点
6、存储结构(物理结构)
数据结构在计算机中的表示(或称映象)称为 数据的存储结构,与计算机密切相关。
四种基本的存储结构: (1)顺序存储结构:用数据元素在存储器 中的相对位置来表示数据元素之间的逻辑关系。 (2)链式存储结构:在每一个数据元素中 增加一个存放地址的指针(→),用此指针来表 示数据元素之间的逻辑关系。 (3)索引存储结构 (4)散列存储结构
描述客观事物的存在计算机中的并可为计算机处理的符号 的总称,是计算机程序加工的”原料”。 (分两类:数值型 数据和非数值型数据)
2、数据元素(Data Element):
是数据的基本单位,在计算机程序中通常作为一个整体进 行考虑和处理。
或称:元素、结点、顶点、记录 对于文件,每个记录就是它的数据元素 对于数组,每个数组元素就是数据元素 对于字符串,字符就是数据元素
项目 3 100 米
200 米 跳高
算法:染色
模型:无向图
----田径赛的时间安排问题解法
(1)用顶点代表比赛项目,设用如下六个不同 的代号代表不同的项目:
跳高 跳远 标枪 铅球 100米 200米
ABC D E
F
(2)不能同时进行比赛的项目之间连上一条边。
某选手比赛的项目必定有边相连(不能同时比赛)
分两大类:线性结构 集合
非线性结构 树型结构 图型结构(网状结构)
(1)集合:结构中的数据元素除了同属于一种类型外,别无其 它关系。
(2)线性结构:结构中的数据元素之间存在一对一的关系。 (3)树型结构:结构中的数据元素之间存在一对多的关系。 (4)图型结构:结构中的数据元素之间存在多对多的关系。
数据结构考研讲义全

数据结构考研讲义全考研是每个计算机科学与技术专业的学生都非常重要的一步。
在考研过程中,数据结构是一个必须重点复习的学科。
本文将为大家提供一份全面的数据结构考研讲义,以帮助大家更好地准备考研。
一、简介数据结构是计算机科学中的一个重要分支,它主要研究如何组织和存储数据以及如何高效地访问和操作这些数据。
数据结构的学习对于理解算法和解决实际问题非常关键。
二、线性表1. 顺序表顺序表是一种基本的数据结构,它使用一段连续的内存空间存储数据,并通过下标进行访问。
在讲义中,我们将详细介绍顺序表的插入、删除、查找等操作以及相关算法的复杂度分析。
2. 链表链表是另一种常见的线性表,它使用节点来存储数据,并通过指针进行链接。
在本节中,我们将讲解单链表、双链表和循环链表的实现方式以及它们的操作。
三、栈和队列1. 栈栈是一种特殊的线性表,它具有“先进后出”的特点。
我们将介绍栈的定义、实现、应用以及常用的栈算法,如括号匹配、中缀表达式转换等。
2. 队列队列是一种“先进先出”的线性表,它常用于模拟真实世界中的排队场景。
我们将学习队列的定义、实现、应用以及常用的队列算法,如循环队列、优先级队列等。
四、树1. 二叉树二叉树是一种最常用的树形结构,它的每个节点最多有两个子节点。
在本节中,我们将学习二叉树的定义、实现、遍历方式以及常用的二叉树算法,如构建二叉树、查找节点等。
2. 平衡二叉树平衡二叉树是一种特殊的二叉树,它的左子树和右子树的高度差不超过1。
我们将研究平衡二叉树的定义、实现以及常用的平衡二叉树算法,如AVL树、红黑树等。
五、图图是一种非线性的数据结构,它由节点和节点之间的边组成。
图的应用非常广泛,如网络拓扑、社交网络等。
我们将学习图的定义、实现方式以及图的遍历、最短路径等算法。
六、排序和查找1. 排序算法排序是数据处理中的常见操作,我们将介绍常用的排序算法,如冒泡排序、插入排序、选择排序、快速排序、归并排序等,并比较它们的复杂度和效率。
绪论(数据结构教程PPT课件)

在网络传输或文件读写过程中,使 用队列作为缓冲区,暂时存储待处 理的数据,以提高处理效率。
04
串、数组和广义表
串定义及基本操作
串的基本操作包括
赋值操作、连接操作、求串长、比较操作、定位操作等。
串的存储结构包括
顺序存储结构和链式存储结构。
串模式匹配算法
串模式匹配算法是指在一个主串中寻找一个子串(模式串)的位置。
函数调用
在程序执行过程中,使用 栈来保存函数调用的信息, 如函数参数、局部变量和 返回地址等。
队列定义及基本操作
01
队列(Queue)是一种特殊的线性数据结构,其操作在表 的两端进行。一端称为队头(front),另一端称为队尾 (rear)。
02
队列的基本操作包括
03
入队(enqueue):在队尾插入一个元素。
3
线性表的抽象数据类型描述
数据类型名称、数据对象集合、操作集合等
线性表顺序存储结构
01
顺序存储结构的定义
用一段地址连续的存储单元依次存储线性表的数据元素
02
顺序存储结构的基本操作实现
创建、初始化、销毁、判空、清空、求长度、获取元素、修改元素等操
作的实现方法
03
顺序存储结构的优缺点
无需为表示表中元素之间的逻辑关系而增加额外的存储空间;可以快速
线索二叉树
线索二叉树是对二叉树的每个结点增设两个标志位以及一条线索而得到的。根据线索性质的不同,线索二叉树可分为前序线 索二叉树、中序线索二叉树和后序线索二叉树三种。这里以中序线索二叉树为例来说明线索二叉树的构造方法。
中序线索二叉树的构造规则是:若将二叉树的中序遍历序列中的每个结点都看作是相应指针域为空的指针,则称这些指针为 线索,而指向其前驱或后继的指针称为线索指针。加上线索的二叉链表称为线索链表,相应的二叉树称为线索二叉树 (Threaded BinaryTree)。根据线索性质的不同,线索二叉树可分为前序线索二叉树、中序线索二叉树和后序线索二叉树三种 。
《数据结构》讲义

数据是描述客观事物的数值、字符以及能输入机器且能被处理的各种符号集合。
换句话说,数据是对客观事物采用计算机能够识别、存储和处理的形式所进行的描述;是计算机加工处理的对象。
包括数值、字符、声数据元素是组成数据的基本单位一个数据元素可由若干个数据项组成()数据对象是性质相同的数据元素的集合,是数据的一个子集。
…},字母字符数据对象是集合象。
由此可看出,不论数据元素集合是无限集(如整数集)Data Structure)数据元素相互之间的关系称为结构( Structure ),有四种基本结构。
集合结构:结构中的数据元素之间除了同属于一个集合的关系外,无任何其它关系。
线性结构:结构中的数据元素之间存在着一对一的线性关系。
图状结构或网状结构:结构中的数据元素之间存在着多对多的任意关系。
为数据结构的有限集,S是D上关系的有限集。
表示复数的虚部。
存储结构(又称物理结构)是逻辑结构在计算机中的存储映象,是逻辑结构在计算机中的实现,它包括据元素的表示和关系的表示形式化描述:要存入机器中,建立一从,使S(D逻辑结构与存储结构的关系为:数据结构的内容可归纳为三个部分:逻辑结构、存储结构和运算集合。
按某种逻辑关系组织起来的一批数据,按一定的映象方式把它存放在计算机的存储器中,并在这些数据上定义了一个运算的集合,(Data Type)数据类型是一组性质相同的值集合以及定义在这个值集合上的一组操作的总称合,即该类型的取值范围,以及该类型中可允许使用的一组运算。
例如高级语言中的数据类型就是已经实现的从这个意义上讲,数据类型是高级语言中允许的变量种类,计算机中使用的是二进制数,汇编语言中则可给出各种数据的十进制表示,如二进制数据的抽象; 使用者在编程时可以直接使用据抽象,出现了数据类型,(Abstract Data Type))是指基于一类逻辑关系的数据类型以及定义在这个类型之上的一组操作。
抽象数据类型的定义取决于客观存在的一组逻辑特性,而与其在计算机内如何表示和实现无关,即不论其内部结构如何变化,只要它的数学特性不变,都不影响其外部使用。
数据结构讲义

– 如果是数字(最小的子表达式),压栈 – 如果是运算符(和前面的子表达式一起,组成一个较大的子表达
式),从栈中弹出相应的分量,并计算结果。将结果压栈。
• 例如:3 5 + 2 *
– 首先3,5入栈 – 然后处理+,3、5出栈,得到结果8(3 5 +),再入栈 – 2入栈 – 处理*,8,2出栈,得到结果(3 5 + 2 *)16,再入栈,完成。
表达式示例
• 中缀表达式 a + b * ( c - d ) - e / f • 后缀表达式 a b c d - * + e f / • 前缀表达式 - + a * b – c d / e f
• 中缀表达式中相邻两个操作符的计算次序为: 优先级高的先计算 优先级相同的自左向右计算 当使用括号时从最内层括号开始计算 但是括号左边的值的计算可以先期进行
• 思考题
– 如果要把后缀表达式转成中缀表达式,怎么做? – 如果利用上面的算法的框架?
构造算符优先关系队列表
示例
以3*(5-2)+7@为例,操作过程如下,构造操作符和操作数栈
算法框架
Function exp_reduced: oprandtype; inistack(optr);push(optr,’@’); inistack(opnd) read(w); while not ((w=‘@’) and (gettop(optr)=‘@’)) do If not w in op then [push(opnd,w);read(w)] else case predede(gettop(optr),w) of
主要目的是节约空间:
两个独立栈,预期的最大空间max(size of stack1)+max(size of stack2)。
数据结构讲义第一章绪论

注:一个抽象数据类型确定了一个模型,但将模型的实 现细节隐藏起来;它定义了一组运算,但将运算 的实现过程隐藏起来。
用抽象数据类型的概念来指导问题的求解过程:
数学模型 非形式算法
抽象数据模型 伪语言程序
数据结构 可执行程序
§ 1.3 抽象数据类型
ADT的定义格式 ADT <ADT名> { 数据对象:<数据对象的定义> 结构关系:<结构关系的定义> 基本操作:<基本操作的定义> }ADT <ADT名>
初始化数据结构;
Destroy( )
销毁数据结构;
Get (i )
查找第 i 个元素;
Insert (i , b ) 在第 i 个位置插入元素 b ;
Delete( i )
删除第 i 个元素;
Traverse( )
遍历整个数据结构
§ 1.3 抽象数据类型
用C语言实现抽象数据类型ADT 用标准C语言表示和实现ADT描述时,主要
§ 1.2 数据结构的基本概念
数 据:描述客观事物的数字、字符以及一切 能够输入到计算机中,并且能够被计 算机程序处理的符号的集合。
数据是一个广义的概念,可以指普通的数据 (可参加算术运算),也可以指符号(源程序、 产品名称等)或数字化了的声音、图形、图像等。
§ 1.2 数据结构的基本概念
数据元素:数据(集合)中的一个个"个体",是组 成数据的"基本单位"。
a2 d4 d1
a1 d1 d2
list
a1
a2
a4 d5 d3
a3 d3 … d4
a3
…
a30 ∧
§ 1.3 抽象数据类型
数据结构基础讲义全

Date:13 August 2020
4.6 树转化为二叉树
IT Education & Training
•左孩子右兄弟表示法可以将一颗多叉树转化为一颗二 叉树。
Date:13 August 2020
4.7 满二叉树和完全二叉树
IT Education & Training
Date:13 August 2020
Date:13 August 2020
5.1 查找的概念
IT Education & Training
•根据给定的某个值,在查找表中确定一个其关键字等 于给定值的记录或数据元素,若表中存在这样的一个记 录,则称查找是成功的。
Date:13 August 2020
5.2 编程实战
• 顺序查找 • 二分查找
4.7 二叉树的链式存储
IT Education & Training
二叉链存储
Date:13 August 2020
4.7 二叉树的链式存储
IT Education & Training
三叉链存储
Date:13 August 2020
4.8 二叉树的遍历
IT Education & Training
1.1 讨论的范畴
问题
构建数学模型
程序实现
算法+数据结构 = 程序设计
IT Education & Training
处
给
理
出
问
问
题
题
的
的
策
数
略
学
模
型
处编
理制
问出
题 用
的
数据结构讲义(new)

《数据结构》讲义(new)第1章C程序设计程序设计=数据描述+算法设计,即程序=数据结构+算法。
用计算机去解决问题过程:首先用数据结构的知识表示出问题,然后设计出解决问题的算法,最后写出程序在计算机上运行输出问题解决的结果。
本章我们将对C的主要知识作回顾,为学习数据结构奠定基础。
1.1 表达式算术运算:5/3 值为1,2.5/5 值为0.5,10%3 值为1,'A'+1 值为66赋值运算:a=3+5 a值为8,式值为8。
b=a=3+5 a,b值均为8,式值为8。
a+=3 即a=a+3; a-=3; a*=3; a/=3;a%=3.i++ ,++i,即i=i+1;i...,...i.区别:x=i++;与x=++i;关系运算:3==2,式值为0,3!=2,式值为1。
逻辑运算:0<x&&x<=1, x<=0||x>1,!(x<0). 注:“非零”为1。
条件运算:b>=0?a+b:a-b,即a+︱b︱逗号运算: a=6,a*3,a+3 式值为91.2 函数与参数1.2.1传值参数例1.1 输入四个数,输出其中的最大数。
int max(int x,int y) /*x,y是形参*/{int t;if(x>y) t=x; else t=y;return t;}main(){int a,b,c,d,m;scanf(“%d%d%d%d”,&a,&b,&c,&d);m=max(max(a,b),max(c,d)); /*a,b,c,d,max(a,b),max(c,d)是实参,传值调用*/ printf(“%d”,m);}1.2.1传址参数例1.2输入二个数到变量a与b,交换变量a与b的值后输出。
swap(int *x,int *y) /*x,y为传址参数*/{int t;t=*x;*x=*y;*y=t;}main(){int a,b;scanf("%d%d",&a,&b);swap(&a,&b); /*传址调用*/printf("%d %d",a,b);}例1.3 输入n 个数,升序排列后输出。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
【考查目标】1. 理解数据结构的基本概念;掌握数据的逻辑结构、存储结构及其差异,以及各种基本操作的实现。
2. 掌握基本的数据处理原理和方法的基础上,能够对算法进行设计与分析。
3. 能够选择合适的数据结构和方法进行问题求解。
一、线性表大纲要求:(一)线性表的定义和基本操作(二)线性表的实现1. 顺序存储结构2. 链式存储结构3. 线性表的应用知识点:1.深刻理解数据结构的概念,掌握数据结构的“三要素”:逻辑结构、物理(存储)结构及在这种结构上所定义的操作“运算”。
2.时间复杂度和空间复杂度的定义,常用计算语句频度来估算算法的时间复杂度。
以下六种计算算法时间的多项式是最常用的。
其关系为:O(1)<O(logn)<O(n)<O(nlogn) <O(n2)<O(n3)指数时间的关系为: O(2n)<O(n!)<O(n n)3.线性表的逻辑结构,是指线性表的数据元素间存在着线性关系。
主要是指:除第一及最后一个元素外,每个结点都只有一个前趋和只有一个后继。
在顺序存储结构中,元素存储的先后位置反映出这种逻辑关系,而在链式存储结构中,是靠指针来反映这种逻辑关系的。
4.顺序存储结构用向量(一维数组)表示,给定下标,可以存取相应元素,属于随机存取的存储结构。
5.线性表的顺序存储方式及其在具体语言环境下的两种不同实现:表空间的静态分配和动态分配。
掌握顺序表上实现插入、删除、定位等运算的算法。
6.尽管“只要知道某结点的指针就可以存取该元素”,但因链表的存取都需要从头指针开始,顺链而行,故链表不属于随机存取结构。
要理解头指针、头结点、首元结点和元素结点的差别。
头结点是在插入、删除等操作时,为了算法的统一而设立的(若无头结点,则在第一元素前插入元素或删除第一元素时,链表的头指针总在变化)。
对链表(不包括循环链表)的任何操作,均要从头结点开始,头结点的指针具有标记作用,故头指针往往被称为链表的名字,如链表head是指链表头结点的指针是head。
理解循环链表中设置尾指针而不设置头指针的好处。
链表操作中应注意不要使链意外“断开”。
因此,若在某结点前插入一个元素或删除某元素,必须知道该元素的前驱结点的指针。
7.链表是本部分学习的重点和难点。
重点掌握以下几种常用链表的特点和运算:单链表、循环链表、双向链表、双向循环链表的生成、插入、删除、遍历以及链表的分解和归并等操作。
并能够设计出实现线性表其它运算的算法。
8.从时间复杂度和空间复杂度的角度综合比较线性表在顺序和链式两种存储结构下的特点,即其各自适用的场合。
小结:顺序表和链表的比较通过对它们的讨论可知它们各有优缺点,顺序存储有三个优点:(1)方法简单,各种高级语言中都有数组,容易实现。
(2)不用为表示结点间的逻辑关系而增加额外的存储开销。
(3)顺序表具有按元素序号随机访问的特点。
但它也有两个缺点:(1)在顺序表中做插入删除操作时,平均移动大约表中一半的元素,因此对n较大的顺序表效率低。
(2)需要预先分配足够大的存储空间,估计过大,可能会导致顺序表后部大量闲置;预先分配过小,又会造成溢出。
链表的优缺点恰好与顺序表相反。
在实际中怎样选取存储结构呢?(1)基于存储的考虑对线性表的长度或存储规模难以估计时,不宜采用顺序表;链表不用事先估计存储规模,但链表的存储密度较低,显然链式存储结构的存储密度是小于1的。
(2)基于运算的考虑在顺序表中按序号访问ai的时间性能时O(1),而链表中按序号访问的时间性能O(n),所以如果经常做的运算是按序号访问数据元素,显然顺序表优于链表;而在顺序表中做插入、删除时平均移动表中一半的元素,当数据元素的信息量较大且表较长时,这一点是不应忽视的;在链表中作插入、删除,虽然也要找插入位置,但操作主要是比较操作,从这个角度考虑显然后者优于前者。
(3)基于环境的考虑顺序表容易实现,任何高级语言中都有数组类型,链表的操作是基于指针的,相对来讲前者简单些,也是用户考虑的一个因素。
总之,两种存储结构各有长短,选择那一种由实际问题中的主要因素决定。
通常“较稳定”的线性表选择顺序存储,而频繁做插入删除的即动态性较强的线性表宜选择链式存储。
练习题:(一)选择题:1.以下那一个术语与数据的存储结构无关?( A )A.队列 B. 哈希表C. 线索树D. 双向链表2、一个算法应该是( B )。
A.程序 B.问题求解步骤的描述C.要满足五个基本特性 D.A和C.3、数据结构中,与所使用的计算机无关的是数据的( C )A.存储结构 B.物理结构 C.逻辑结构 D.物理结构和存储结构4. 算法的计算量的大小称为计算的( B )。
A.效率 B.复杂性 C.现实性 D.难度5.下列说法,不正确的是(D)。
A.数据元素是数据的基本单位B.数据项是数据中不可分割的最小可标识单位C.数据可由若干个数据元素构成D.数据项可由若干个数据元素构成6.连续存储设计时,存储单元的地址( A )。
A.一定连续 B.一定不连续C.不一定连续 D.部分连续,部分不连续7.线性表( a1,a2,…,an)以链接方式存储时,访问第i位置元素的时间复杂性为( C )。
A.O(i) B.O(1) C.O(n) D.O(i-1)8. 对于顺序存储的线性表,访问结点和增加、删除结点的时间复杂度为( C )。
A .O(n) O(n) B. O(n) O(1)C. O(1) O(n)D. O(1) O(1)9. 设单链表中结点的结构为(data ,link )。
已知指针q 所指点是指针p 所指结点的直接前驱,若在*q 与*p 之间插入结点*s ,则应执行下列哪一个操作?( B )。
A .s ->link=p ->link ;p ->link=sB .q ->link=s ;s ->link=pC .p ->link=s ->link ;s ->link=pD .p ->link=s ;s ->link=q10. 在一个长度为n 的顺序表的表尾插入一个新元素的渐进时间复杂度为( B )。
A .O (n )B .O (1)C .O (n 2)D .O (log 2n )11. 表长为n 的顺序存储的线性表,当在任何位置上插入一个元素的概率相等时,插入一个元素所需移动元素的平均个数为( B )A .n B. n/2C. (n-1)/2D. (n+1)/212. 循环链表的主要优点是( D )A .不再需要头指针了。
B .已知某个结点的位置后,能很容易找到它的直接前驱结点。
C .在进行删除操作后,能保证链表不断开。
D .从表中任一结点出发都能遍历整个链表。
(二)应用题1、按增长率由小至大排列以下7个函数。
n n n n n 、、、、、)、()(2100)2n (log 2log 22log log 22332 答:n n n n n )、(、、、、、)(23)2n (log 2log 22log log 23221002、数据的存储结构由哪四种基本的存储方法实现,并做以简要说明?答:四种表示方法(1)顺序存储方式。
数据元素顺序存放,每个存储结点只含一个元素。
存储位置反映数据元素间的逻辑关系。
存储密度大,但有些操作(如插入、删除)效率较差。
(2)链式存储方式。
每个存储结点除包含数据元素信息外还包含一组(至少一个)指针。
指针反映数据元素间的逻辑关系。
这种方式不要求存储空间连续,便于动态操作(如插入、删除等),但存储空间开销大(用于指针),另外不能折半查找等。
(3)索引存储方式。
除数据元素存储在一地址连续的内存空间外,尚需建立一个索引表,索引表中索引指示存储结点的存储位置(下标)或存储区间端点(下标),兼有静态和动态特性。
(4)散列存储方式。
通过散列函数和解决冲突的方法,将关键字散列在连续的有限的地址空间内,并将散列函数的值解释成关键字所在元素的存储地址,这种存储方式称为散列存储。
其特点是存取速度快,只能按关键字随机存取,不能顺序存取,也不能折半存取。
3. 线性表有两种存储结构:一是顺序表,二是链表。
试问:(1)如果有 n 个线性表同时并存,并且在处理过程中各表的长度会动态变化,线性表的总数也会自动地改变。
在此情况下,应选用哪种存储结构? 为什么?(2)若线性表的总数基本稳定,且很少进行插入和删除,但要求以最快的速度存取线性表中的元素,那么应采用哪种存储结构?为什么?答:(1)选链式存储结构。
它可动态申请内存空间,不受表长度(即表中元素个数)的影响,插入、删除时间复杂度为O(1)。
(2)选顺序存储结构。
顺序表可以随机存取,时间复杂度为O(1)。
(三)算法设计题1.设计算法,求带表头的单循环链表的表长。
解:int length(Linklist L){int I;listnode *p;I=0;P=L;while (p->next!=L){p=p->next;I++;}return I;}2.已知单链表L,写一算法,删除其重复结点。
算法思路:用指针p指向第一个数据结点,从它的后继结点开始到表的结束,找与其值相同的结点并删除之;p指向下一个;依此类推,p指向最后结点时算法结束。
算法如下:解:void pur_LinkList(LinkList H){ LNode *p,*q,*r; p=H->next; /*p指向第一个结点*/if(p==NULL) return;while (p->next){q=p;while (q->next) /* 从*p的后继开始找重复结点*/{ if (q->next->data==p->data){ r=q->next; /*找到重复结点,用r指向,删除*r */q->next=r->next;free(r);} /*if*/else q=q->next;} /*while(q->next)*/p=p->next; /*p指向下一个,继续*/} /*while(p->next)*/}该算法的时间性能为O(n2)。
3.已知指针la和lb分别指向两个无头结点的单链表中的首结点。
请编写函数完成从表la中删除自第i个元素开始的共len个元素并将它们插入到表lb中第j个元素之前,若lb中只有j-1个元素,则插在表尾。
函数原型如下:int DeleteAndInsertSub(LinkList &la,LinkList &lb,int i,int j,int len);答:int DeleteAndInsertSub(LinkList &la,LinkList &lb,int i,int j,int len) {int k;LinkList p,q,prev,s;if(i<0||j<0||len<0)return -1;p=la;k=1;prev=NULL;while(p&&k<i){prev=p;p=p->next;k++;}if(!p)return -1;q=p;k=1;while(q&&k<len){q=q->next;k++;}if(!q)return -1;if(!prev)la=q->next;elseprev->next=q->next;if(j==1){q->next=lb;lb=q;}else{s=lb;k=1;while(s&&k<j-1){s=s->next;k++;}if(!s)return -1;q->next=s->next;s->next=p;return 1;}}4.写一算法,将一带有头结点的单链表就地逆置,即要求逆置在原链表上进行,不允许重新构造新链表。