第二章+线性表Data+Structure+--Sequeue+List
数据结构2线性表
12 15 33 45 67 89 57 78 01234567
44
整理ppt
15
程序实现
Templet <class type> int Seqlist<type> ::Insert(type &x, int i){ If(i<0||i>last+1||last==MaxSize-1) return 0; //procondition校验 Else{ last++; for(int j=last;j>i;j--)data[j]=data[j-1]; data[i]=x; //插入 return 1;
整理ppt
10
顺序表上实现的基本运算
1.查找 例:在顺序表{12,15,33,45,67,89,
57,78}查找57(找到),查找66(找 不到)。
12 15 33 45 67 89 57 78
01234567
整理ppt
11
程序实现
Templet <class type> int Seqlist<type>
➢ 在非空的线性表,有且仅有一个开始结
点a1,它没有直接前趋,而仅有一个直 接后继a2;
➢ 有且仅有一个终端结点an,它没有直接 后继,而仅有一个直接前趋a n-1;
➢ 其余的内部结点ai(2≦i≦n-1)都有且仅有 一个直接前趋a i-1和一个直接后继a i+1
整理ppt
5
线性表的特点
线性表 的逻辑结构:线性结构 数据的运算是定义在逻辑结构上的。 运算的具体实现则是在(物理)存储
数据结构课后题答案
else {
smaller=pb; pb=pb->next; smaller->next = c->next; c->next = smaller; }
return(C); }
西北大学可视化技术研究所
10.已知有单链表表示的线性表中含有三类字 符的数据元素(如字母字符,数字字符和其它 字符),试编写算法来构造三个以循环链表表 示的线性表,使每个表中只含同一类的字符, 且利用原表中的结点空间作为这三个表的结点 空间,头结点可另辟空间。
西北大学可视化技术研究所
西北大学可视化技术研究所
答案:435612不可以 原因 (1)S:1234 X:43 (2)S:5 X: 5 (3)S:6 X: 6 (4)X:21 135426 可以 原因(1)S:1 X:1 (2)S:23 X: 3 (3)S:45 X: 54 (4)X:2 (5)S:6 X: 6
西北大学可视化技术研究所
G. S->next= NULL; 。
西北大学可视化技术研究所
供选择的语句有:
A. P->next=S; B. P->next= P->next->next; C. P->next= S->next;
E. S->next= P->next; F. S->next= L;
G. S->next= NULL;
数据结构课件第2章线性表
27
线性表的顺序存储结构适用于数据 元素不经常变动或只需在顺序存取设备 上做成批处理的场合。为了克服线性表 顺序存储结构的缺点,可采用线性表的 链式存储结构。
28
2.3 线性表的链式存储结构
线性表的链式存储表示 基本操作在单链表上的实现 循环链表 双向链表 线性表链式存储结构小结
2.3.1 线性表的链式存储表示 29
2.1.1 线性表的定义
6
一个线性表(linear_list)是 n(n≥0)个具有相同属性的数 据元素的有限序列,其中各元素有着依次相邻的逻辑关系。
线性表中数据元素的个数 n 称为线性表的长度。当 n = 0 时 该线性表称为空表。当 n > 0 时该线性表可以记为:
(a1,a2,a3,…,ai,…,an)
数据域 指针域
结点 data next
31
(2) 线性表的单链表存储结构
通过每个结点的指针域将线性表中 n 个结点按其逻辑顺序链 接在一起的结点序列称为链表,即为线性表 ( a1, a2, a3, …, ai, …, an ) 的链式存储结构。如果线性链表中的每个结点只有一个指针域, 则链表又称为线性链表或单链表 (linked list)。
17
(2) 算法编写
#define OK 1
#define ERROR 0
Int InsList ( SeqList *L, int i, ElemType e ) /*在顺序线性表 L 中第 i 个位置插入新的元素 e。*/ /* i 的合法值为 1≤i ≤L->last+2*/ {
int k; if ( i < 1) ||( i > L->last+2)) /*首先判断插入位置是否合法*/ { printf(“插入位置i值不合法”);
吉林大学数据结构_第二章 线性表
如何找指定位置的结点?
• 与顺序表不同,单链表无法直接访问指定 位置的结点,而是需要从哨位结点开始, 沿着next指针逐个结点计数,直至到达指定 位置。
操作
• • • • 存取 查找 删除 插入
存取算法
算法Find(k.item) /*将链表中第k个结点的字段值赋给item*/ F1. [k合法?] IF (k<1) THEN (PRINT “存取位置不合法”. RETURN.) F2. [初始化] p←head. i ←0. F3. [找第k个结点] WHILE (p ≠NULL AND i<k) DO (p←next(p). i ←i+1.) IF p=NULL THEN (PRINT “无此结点”. RETURN. ) item←data(p). ▍ 存取算法的时间复杂性分析。P30
插入算法
算法Insert(k,item) /*在链表中第k个结点后插入字段值为item的结点*/ I1.[k合法?] IF (k<0) THEN (PRINT “插入不合法”. RETURN) I2.[初始化] p←head. i ←0. I3.[p指向第k个结点] WHILE (p ≠NULL AND i<k) DO (p←next(p). i ←i+1.) IF p=NULL THEN (PRINT “插入不合法”. RETURN. ) I4.[插入] s<= AVAIL. data(s) ←item. next(s) ←next(p). next(p) ←s. ▍
删除算法
算法Delete(k.item) /*删除链表中第k个结点并将其字段值赋给item*/ D1.[k合法?] IF (k<1) THEN (PRINT “删除不合法”. RETURN.) D2.[初始化] p←head. i ←0. D3.[找第k-1结点] WHILE (p ≠NULL AND i<k-1) DO (p←next(p). i ←i+1.) IF p=NULL THEN (PRINT “无此结点”. RETURN. ) D4.[删除] q ← next(p). next(p) ← next(q) . item←data(q). AVAIL<=q.▍
《数据结构》课程课件第二章线性表
Step2:数据域赋值
插入后: Step3:插入(连接)
X q
(1)式和(2)式的顺序颠倒,可以吗?
4、插入元素(在第i个元素之前插入元素e)
为什么时间复杂度不再是O(1)?
第i-1个元素
第i个元素
p
s
新插入元素
5、删除p所指元素的后继元素
P
删除前:
P->next P->next->next
删除:
五、线性表ADT的应用举例
Void mergelist(list La,list Lb,list &Lc)
{ //已知线性表La和Lb中的数据元素按值非递减排列
//归并La和Lb得到新的线性表Lc,Lc中的元素也按值非递减排列
例: 将两个各有n个元素的有序表归并成一个有序表, 其最小的比较次数是( )。 A、n B、2n-1 C、2n D、n-1
三、线性表的ADT
四、线性表的分类
五、线性表ADT的应用举例
例1:已知有线性表L,要求删除所有X的出现
五、线性表ADT的应用举例
例2: 已知有两个分别有序的线性表(从小到大),要 求合并两个线性表,且合并后仍然有序。——归并 方法1: 合并,再排序O((m+n)2)
方法2: 归并,利用分别有序的特点O((m+n))
二、线性表上常见的运算
8、删除 Delete(L,i):删除线性表的第i个元素 删除前 a1 a2 … ai-1 ai ai+1 … an 删除后 a1 a2 … ai-1 ai+1 … an 9、判断是否为空 Empty(L):线性表空,则返回TRUE, 否则FALSE 10、输出线性表 Print(L):输出线性表的各个元素 11、其它操作 复制、分解、合并、分类等
数据结构(C语言版)第2章 线性表
案例2.3 :图书信息管理系统
图书顺序表
图书链表
总结
01
线性表中数据元素的类型可以为简单类型,也 可以为复杂类型。 许多实际应用问题所涉的基本操作有很大相似
02
性,不应为每个具体应用单独编写一个程序。
从具体应用中抽象出共性的逻辑结构和基本操 作(抽象数据类型),然后实现其存储结构和 基本操作。
03
04级计算机1班 04级计算机2班 04级计算机3班 04级计算机4班
:
:
:
:
:
数据元素都是记录;
元素间关系是线性
同一线性表中的元素必定具有相同特性
目 录 导 航
Contents
2.1 2.2 2.3 2.4 2.5
线性表的定义和特点 案例引入 线性的类型定义 线性表的顺序表示和实现 线性表的链式表示和实现
线性表
目标
target
01 02 03 04
OPTION
了解线性结构的特点
OPTION
掌握顺序表的定义、查找、插入和删除
掌握链表的定义、创建、查找、插入和删除 能够从时间和空间复杂度的角度比较两种存储结构的不同 特点及其适用场合
OPTION
OPTION
目 录 导 航
Contents
2.1 2.2 2.3 2.4 2.5
4
查找
3
目 录 导 航
Contents
2.1 2.2 2.3 2.4 2.5
线性表的定义和特点 案例引入 线性的类型定义 线性表的顺序表示和实现 线性表的链式表示和实现
2.6
2.7 2.8
顺序表和链表的比较
线性表的应用 案例分析与实现
线性表的顺序表示和实现
数据结构线性表、栈、队列、二叉树、图
▪ 性质 4 :
具有 n 个结点的完全二叉树的深度
为 log2n +1
证明:
设 完全二叉树的深度为 k
则根据第二条性质得 2k-1≤ n < 2k 即 k-1 ≤ log2 n < k
因为 k 只能是整数,因此, k =log2n + 1
满二叉树的叶节点为N,则它的节点总数( ) A、N B、2N C、2N-1 D、2N+1 E、2^N-1
(二)、栈
▪ 栈是允许在一端进行插入和删除操作的特 殊线性表。
➢ 允许进行插入和删除操作的一端称为栈顶 (top),另一端为栈底(bottom);栈底固定,
而栈顶浮动;
➢ 栈中元素个数为零时称为空栈。栈结构也称为
后进先出表(LIFO)。
TOP
a1 a2 …… 栈底
an 栈顶
MAXSIZE
三、队列
在有向图中,边的走向不同就认为是不同的边。如在边的集合 E={< 1,4 >,< 3,4 >,< 5,2 >,< 5,3 >,< 2,1 >,< 5,5 >}(见右上 图)中,其中< 1,4 >表示该边是由顶点1出发,到顶点4结束,即边 < 1,4 >表明了该边的方向性,且两个顶点的顺序不能颠倒。(有向 图中边的表示用尖括号)
队列(Queue)的定义
队列是限定仅在表的一端进行插入,在另一端进行删除 操作的线性表。
允许插入的一端称为队尾(rear),允许删除的一端称为 队首(front)。
队列的插入操作,称为入队;队列的删除操作,称为出 队。当队列中没有元素时称为空队列。
设队列q=(a0,a1,a2,…,an-1),则a0称为队头元素, an-1称为队尾元素。元素按a0,a1,a2, …,an-1的次序 入队,出队也只能按照这个次序。
数据结构课程1
-------------------
-------
-------
-------
-------
-------
这张表中的元素存在一个顺序关系,即谁在谁前,谁在谁 后的信息(即病人诊断顺序依次为张立,田方,……) 。 所以,可以用线性结构来刻画这种关系。。
例1-3 大学系级行政机构
大学系级行政机构,如图1.1所示:
数据结构的含义
因此可以认为,数据结构是介于数学、计算机硬件和计 算机软件三者之间的一门核心课程(如图1.1所示)。
数学
代数系统
编码理论 数据类型 算子关系
数据表示法
数据的操作 文件系统
存储装置
数据结构
硬件
数据存取
( 计 算 机 系机器组织
统设计)
数据组织
信息检索
软件
(计算机程 序设计)
图1.1 “数据结构”所处的地位
3. 数据的操作
一般而言,必须对数据进行加工处理,才能得到问题的 解。在非数值性问题中,对数据的操作(或运算)已不限 于对数据进行加、减、乘、除等数学运算。数据的操作是 定义在逻辑结构上的,而操作的具体实现是在存储结构上 进行的。基本的数据操作主要有以下几种:
(1)查找:在数据结构中寻找满足某个特定条件的数据元 素的位置或值。
现实问
数学模
算法
程序
解
题
型
图1.8 计算机求解问题的流程
即首先要从现实问题出发,抽象出一个适当的数学模型,
然后设计一个求解此数学模型的算法,最后根据这个算法 编出程序,经过测试、排错、运行直至得到最终的解答。 (现实)问题、数学模型、算法和程序是问题求解过程中 出现的四个不同的概念。
数据结构--线性表
2020/4/7
14
2.3.1单链表
2020/4/7
15
2.3.1单链表
单链表的基本操作算法
查找运算
按序号查找 按值查找
插入运算
结点插入到链表的第一个结点前 结点插入到两个结点之间 结点插入到链表的最后一个结点后
删除运算
2020/4/7
16
2.3.1单链表
按序号查找 算法描述:设带头结点的单链表的头指针为L,要查
3
2.1 线性表的基本概念
线性表基本运算 初始化运算InitList(L) 求表长运算ListLength(L) 元素定位运算 LocateElem(L,x) 取元素运算GetElem(L,i,e) 插入运算ListInsert(L,i,x) 删除运算ListDelete(L,i,e) 遍历运算ListTraverse(L)
第2章 线性表
本章的基本内容是:
线性表的逻辑结构 线性表的顺序存储 线性表的链式存储 顺序表和链表的比较
2020/4/7
1
2.1 线性表的基本概念
线性表(Linear List): 是由n(n≥0)个类型相同的数据元素组成的 有限序列,记为(a1,a2,a3,…,an)。
a1
a2
a3
a4
next
2020/4/7
13
2.3.1单链表
上图所示为线性表(Sun,Mon,Tue,Wed,Thu, Fri,Sat)的线性链式存储结构。这种链表有一个头 指针(H),如果线性表非空,H指向链表中第一个结 点,否则它为空指针(即不指向任何结点的指针,通 常用NULL或∧表示)。由于最后一个结点设有直接后 继,所以它的指针域为空。
d
Loc(a1)
《第二章线性表》PPT课件
线性表是一种最简单的线性结构
h
1
线性结构的基本特征:
线性结构 是 一个数据元素的有序集
1.集合中必存在唯一的一个“第一元素”;
2.集合中必存在唯一的一个 “最后元素”
3.除最后元素在外,均有 唯一的后继;
4.除第一元素之外,均有 唯一的前驱。
h
2
2.1 线性表类型的定义
2.2 线性表类型的实现 顺序映象
操作结果: 将 L 重置为空表。
h
18
PutElem( &L, i, e )
(改变数据元素的值)
初始条件:线性表 L 已存在,
且 1≤i≤LengthList(L)
操作结果:L 中第 i 个元素赋值 e 。
h
19
ListInsert( &L, i, e )
(插入数据元素)
初始条件:线性表 L 已存在,
函数visit( )。一旦 visit( )失败, 则操作失败。
h
16
加工型操作
ClearList( &L ) PutElem( &L, i, &e ) ListInsert( &L, i, e ) ListDelete(&L, i, &e)
h
17
ClearList( &L )
(线性表置空)
初始条件: 线性表 L 已存在。
compare( ) 是元素判定函数。
操作结果:
返回 L 中第 1 个与 e 满足关系 compare( ) 的元素的位序。 若这样的元素不存在,则返回值为 0。
h
15
ListTraverse(L, visit( ))
《数据结构》教材课后习题+答案
《数据结构》教材课后习题+答案数据结构第一章介绍数据结构是计算机科学中重要的概念,它涉及到组织和存储数据的方法和技术。
数据结构的选择对于算法的效率有着重要的影响。
本教材为读者提供了丰富的课后习题,以帮助读者巩固所学知识并提高解决问题的能力。
下面是一些选定的习题及其答案,供读者参考。
第二章线性表习题一:给定一个顺序表L,编写一个算法,实现将其中元素逆置的功能。
答案一:算法思路:1. 初始化两个指针i和j,分别指向线性表L的首尾两个元素2. 对于L中的每一个元素,通过交换i和j所指向的元素,将元素逆置3. 当i>=j时,停止逆置算法实现:```pythondef reverse_list(L):i, j = 0, len(L)-1while i < j:L[i], L[j] = L[j], L[i]i += 1j -= 1```习题二:给定两个线性表A和B,编写一个算法,将线性表B中的元素按顺序插入到线性表A中。
答案二:算法思路:1. 遍历线性表B中的每一个元素2. 将B中的元素依次插入到A的末尾算法实现:```pythondef merge_lists(A, B):for element in B:A.append(element)```第三章栈和队列习题一:编写一个算法,判断一个表达式中的括号是否匹配。
表达式中的括号包括小括号"()"、中括号"[]"和大括号"{}"。
答案一:算法思路:1. 遍历表达式中的每一个字符2. 当遇到左括号时,将其推入栈中3. 当遇到右括号时,判断栈顶元素是否与其匹配4. 当遇到其他字符时,继续遍历下一个字符5. 最后判断栈是否为空,若为空则表示括号匹配算法实现:```pythondef is_matching(expression):stack = []for char in expression:if char in "([{":stack.append(char)elif char in ")]}":if not stack:return Falseelif (char == ")" and stack[-1] == "(") or (char == "]" and stack[-1] == "[") or (char == "}" and stack[-1] == "{"):stack.pop()else:return Falsereturn not stack```习题二:利用两个栈实现一个队列。
理工类专业课复习资料-数据结构知识点全面总结—精华版
第1章绪论内容提要:◆数据结构研究的内容。
针对非数值计算的程序设计问题,研究计算机的操作对象以及它们之间的关系和操作。
数据结构涵盖的内容:◆基本概念:数据、数据元素、数据对象、数据结构、数据类型、抽象数据类型。
数据——所有能被计算机识别、存储和处理的符号的集合。
数据元素——是数据的基本单位,具有完整确定的实际意义。
数据对象——具有相同性质的数据元素的集合,是数据的一个子集。
数据结构——是相互之间存在一种或多种特定关系的数据元素的集合,表示为:Data_Structure=(D, R)数据类型——是一个值的集合和定义在该值上的一组操作的总称。
抽象数据类型——由用户定义的一个数学模型与定义在该模型上的一组操作,它由基本的数据类型构成。
◆算法的定义及五个特征。
算法——是对特定问题求解步骤的一种描述,它是指令的有限序列,是一系列输入转换为输出的计算步骤。
算法的基本特性:输入、输出、有穷性、确定性、可行性◆算法设计要求。
①正确性、②可读性、③健壮性、④效率与低存储量需求◆算法分析。
时间复杂度、空间复杂度、稳定性学习重点:◆数据结构的“三要素”:逻辑结构、物理(存储)结构及在这种结构上所定义的操作(运算)。
◆用计算语句频度来估算算法的时间复杂度。
第二章线性表内容提要:◆线性表的逻辑结构定义,对线性表定义的操作。
线性表的定义:用数据元素的有限序列表示◆线性表的存储结构:顺序存储结构和链式存储结构。
顺序存储定义:把逻辑上相邻的数据元素存储在物理上相邻的存储单元中的存储结构。
链式存储结构: 其结点在存储器中的位置是随意的,即逻辑上相邻的数据元素在物理上不一定相邻。
通过指针来实现!◆线性表的操作在两种存储结构中的实现。
数据结构的基本运算:修改、插入、删除、查找、排序1)修改——通过数组的下标便可访问某个特定元素并修改之。
核心语句:V[i]=x;顺序表修改操作的时间效率是O(1)2) 插入——在线性表的第i个位置前插入一个元素实现步骤:①将第n至第i 位的元素向后移动一个位置;②将要插入的元素写到第i个位置;③表长加1。
数据结构讲义第2章-线性表
t个单元
a1 a2 ai-1 ai ai+1 an
2.2 线性表的顺序存储和实现
线性表的顺序存储结构——顺序表 一 线性表的顺序存储结构 顺序表
顺序表的定义: 一维数组+表长
例1: 写出线性表(6,17,28,50,92,188)的顺序 存储结构表示。 # define ListSize 100 typedef int ElemType; ElemType List[ListSize]; int length;
思考:采用其它的定义如何初始化空表?
2.2 线性表的顺序存储和实现
三 顺序表应用举例
1. 设有两个按元素值递增有序排列的顺序表A和B,请编写算法将A 和B归并成一个按元素值递增有序排列的线性表C。 void merge(SeqList A,SeqList B,SeqList &C) {i=0;j=0;k=0; while ( i<A.length && j<B.length ) if (A.data[i]<B.data[j]) C.data[k++]=A.data[i++]; else C.data[k++]=B.data[j++]; while (i<A.length ) C.data[k++]= A.data[i++]; while (j<B.length ) C.data[k++]=B.data[j++]; C.length=k; }
调用示例: main() {SeqList L; ElemType e; ... delete_ListSq(L,2,e); ... }
数据结构 第二章__线性表(本)
数据结构与算法华东师范大学计算机系杨沛第二章线性表2.1 线性表的基本概念线性表是具有相同数据类型的数据元素的有限序列。
由n(n≥0)个数据元素k0,k1,…,kn-1组成的线性表记为(k0 ,k1 ,…,kn-1),线性表中包含的数据元素的个数n称为线性表的长度(length),称长度为零的线性表为空的线性表(简称为空表)。
相关概念:表头、表尾、前驱、后继有序线性表:数据元素的相对位置与它们的值有联系。
无序线性表:数据元素的相对位置与它们的值没有联系。
第二章线性表例小于20的质数组成的线性表(2,3,5,7,11,13, 17,19);英文字母表也是线性表,表中每个字母是一个数据元素:(A,B,C,……,Z);2.2 顺序表2.2.1 线性表顺序表(sequential list)就是顺序存贮的线性表,即用一组连续的存贮单元依次、连续地存贮线性表中的结点。
如果每个结点占用s个存贮单元,并假设存放结点ki(0≤i≤n-1)的开始地址为loc(k0),则结点ki的地址loc(ki)可表示成Loc(ki) =loc(k0) + i*s。
2.2 顺序表在C 语言中,可用数组表示线性表:#define MAXN 100int list[MAXN];int n;线性表的结点k 0,k 1,…,k n-1依次存放在数组单元list[0],list[1],…,list[n-1]。
2.2.1 线性表最大表长实际表长线性表2.2 顺序表2.2.1 线性表假设s=sizeof(int),则可得到计算ki的地址的公式,因loc(ki)=&list[i],而&list[i]=&list[0]+i·s,故loc(ki)=&list[0]+i·s。
2.2 顺序表2.2.2 顺序表的操作(1)初始化:初始长度置为0即可(n=0;),数组空间在编译时分配。
(2)顺序表的插入:插入算法的C函数SqListInsert():若插入位置i不在可以插入的位置上,即i<0或i>n,则返回0;若n=MAXN,即线性表已满,此时数组list[]没有多余的存贮单元可以存放新结点,则返回-1;若插入成功,则返回12.2 顺序表实际表长(2)顺序表的插入:int SqListInsert(int list[],int*p_n,int i,int x) {int j;if(i<0||i>*p_n)return(0);//i不是合法的插入位置if(*p_len==MAXN)return(-1);//线性表已满2.2 顺序表for(j=*p_n;j>i;j--)list[j]=list[j-1];//结点右移list[i]=x;(*p_n)++;//表长加1return(1);}2.2 顺序表(2)顺序表的插入:对于存放在数组list[]中的、具有n个结点的顺序表,为了把值为x的结点插在表的位置i(0≤i≤n)上,可调用如下的语句:k=SqListInsert(list, &n, i, x);注:结点移动是本算法的关键操作2.2 顺序表(3)顺序表的删除:删除算法的C函数SqListDelete():在具有n个结点的顺序表中,删除第i(0≤i≤n-1)个位置上的结点,使线性表长度减1,若删除位置不合法,即i<0或i≥n,则返回0;若删除位置合法,即0≤i≤n-1,则删除成功,返回1。
数据结构第二章线性表
线性表的顺序存储结构可用数组来实现。 数组元素的类型就是线性表中数据元素 的类型,数组的大小,最好大于线性表 的长度。因此,顺序存储结构是把线性 表中每个元素a1, a2, a3, …, an依次存放到数 组下标为0, 1, 2,…, n1的位置上。
假设用数组data[MAXSIZE]存储线性 表 A =(a1, a2, a3, …, an) 其顺序存储结构如图2.1所示。
➢2.2.1 线性表的顺序存储结构 ➢2.2.2 顺序表的基本运算 ➢2.2.3 插入和删除运算的时间分析 ➢2.2.4 顺序表的优点和缺点
2.2.1 线性表的顺序存储结构
线性表的顺序存储方法是:将线性表的所有元素 按其逻辑顺序依次存放在内存中一组连续的存储 单元中,也就是将线性表的所有元素连续地存放 到计算机中相邻的内存单元中,以保证线性表元 素逻辑上的有序性。 顺序表的特点是:其逻辑关系相邻的两个结点在 物理位置上也相邻,结点的逻辑次序和物理次序 一致。
图2.1 顺序存储结构示意图
由于线性表中所有结点的数据类型是相同 的,因此每个结点占用的存储空间也是
相同的。假设每个结点占用d个存储单元,
若 线 性 表 中 第 一 个 结 点 a1 的 存 储 地 址 为 LOC(a1) , 那 么 结 点 ai 的 存 储 地 址 LOC(ai) 可以通过下面的公式计算得到:
【例2.3】学生成绩统计表也是一个线性表, 见表2.1。在线性表中每个学生的成绩是
一个数据元素,它由学号、姓名、数学、 外语、物理、总分这6个数据项组成。该 线性表的长度为5。
学号 1 2 3 4 5
姓名 李华 王放 张利 田勇 成惠
表 2.1 某班学生成绩统计表
数据结构(第二章 线性表)
2.2 线性表的顺序存储和实现
顺序表-顺序表定义
由上可知,数据的存储逻辑位置由数组的下标决定。 所以相邻的元素之间地址的计算公式为(假设每个数 据元素占有d个存储单元): LOC(ai)=LOC(ai-1)+d 对线性表的所有数据元素,假设已知第一个数据元 素a0的地址为LOC(a0) ,每个结点占有d个存储 单元, 则第i个数据元素ai的地址为: LOC(ai)=LOC(a0)+i*d 线性表的第一个数据元素的位置通常称做起始位置 或基地址。 在使用一维数组时,数组的下标起始位置根据给定 的问题确定,或者根据实际的高级语言的规定确定。
2.1 线性表抽象数据类型
线性表的分类
顺序存储结构 (元素连续存储、 随机存取结构) 线性表 ADT 链式存储结构 (元素分散存储) 继承 顺序表类 排序顺序表类 继承 单链表类 循环单链表 双链表 继承 排序循环双链表类 排序单链表类
单链表
双链表
循环双链表类
线性表的存储结构
2.2 线性表的顺序存储和实现
线性表的基本操作 求长度:求线性表的数据元素个数。 访问:对线性表中指定位置的数据元素进行存取、替 换等操作。 插入:在线性表指定位置上,插入一个新的数据元素, 插入后仍为一个线性表。 删除:删除线性表指定位置的数据元素,同时保证更 改后的线性表仍然具有线性表的连续性。 复制:重新复制一个线性表。 合并:将两个或两个以上的线性表合并起来,形成一 个新的线性表。 查找:在线性表中查找满足某种条件的数据元素。 排序:对线性表中的数据元素按关键字值,以递增或 递减的次序进行排列。 遍历:按次序访问线性表中的所有数据元素,并且每 个数据元素恰好访问一次。
第二章线性表栈和队列-PPT精选
i0
2
总时间开销估计为O(k)
删除算法
/*(设元素的类型为ELEM,nodelist是存储顺序 表的向量,msize是此向量的最大长度, curr_len是此向量的当前长度,curr为此向量 当前下标)*/
//返回curr所指的元素值,并从表中删去此元素
ELEM remove()
{ //首先需要检验当前长度不能等于0, 当前指针 //curr不能小于0,不能等于curr_len
//当前下标curr位置的元素值作为返回值,并删去该元素
ELEM remove();
Boolean isEmpty();
//当线性表为空时,返回True
ELEM currValue();
//返回当前curr位置的元素值。
int length();
//返回此顺序表的当前实际长度
void prev();
#include <assert.h> viod insert(ELEM item) {
//需要检查当前长度不能等于msize,当前游标指针 //curr不能小于0,也不能大于当前长度
assert((curr_len < msize) && (curr >= 0)
&& ( curr <= curr_len)); //此条件不满足时,程序异常,退出运行 //从表尾curr_len-1起往右移动直到curr for(int i=curr_len; i>curr; i--)
数组存储 读写其元素很方便 ,通过下标
即可指定位置
顺序表类定义
enum Boolean {False,True};
//假定最大长度为100
南京晓庄学院数据结构题库参考标准答案
南京晓庄学院数据结构题库参考标准答案数据结构与算法习题册(课后部分参考答案)《数据结构与算法》课程组⽬录课后习题部分第⼀章绪论 (1)第⼆章线性表 (3)第三章栈和队列 (5)第四章串 (8)第五章数组和⼴义表 (10)第六章树和⼆叉树 (13)第七章图 (16)第九章查找 (20)第⼗章排序 (23)第⼀章绪论⼀. 填空题1. 从逻辑关系上讲,数据结构的类型主要分为集合、线性结构、树结构和图结构。
2. 数据的存储结构主要有顺序存储和链式存储两种基本⽅法,不论哪种存储结构,都要存储两⽅⾯的内容:数据元素和数据元素之间的关系。
3. 算法具有五个特性,分别是有穷性、确定性、可⾏性、输⼊、输出。
4. 算法设计要求中的健壮性指的是算法在发⽣⾮法操作时可以作出处理的特性。
⼆. 选择题1. 顺序存储结构中数据元素之间的逻辑关系是由 C 表⽰的,链接存储结构中的数据元素之间的逻辑关系是由 D 表⽰的。
A 线性结构B ⾮线性结构C 存储位置D 指针2. 假设有如下遗产继承规则:丈夫和妻⼦可以相互继承遗产;⼦⼥可以继承⽗亲或母亲的遗产;⼦⼥间不能相互继承。
则表⽰该遗产继承关系的最合适的数据结构应该是B 。
A 树B 图C 线性表D 集合3. 算法指的是 A 。
A 对特定问题求解步骤的⼀种描述,是指令的有限序列。
B 计算机程序C 解决问题的计算⽅法D 数据处理三. 简答题1. 分析以下各程序段,并⽤⼤O记号表⽰其执⾏时间。
(1) (2)i=1;k=0; i=1;k=0;While(i{ {k=k+10*i; k=k+10*i;i++; i++;} }while(i<=n)⑴基本语句是k=k+10*i,共执⾏了n-2次,所以T(n)=O(n)。
⑵基本语句是k=k+10*i,共执⾏了n次,所以T(n)=O(n)。
2. 设有数据结构(D,R),其中D={1, 2, 3, 4, 5, 6},R={(1,2),(2,3),(2,4),(3,4),(3,5),(3,6),(4,5),(4,6)}。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
线性表示例
例8 巳知线性表LA和线性表LB中的数据元素按值非 递减有序排列,现要求将LA和LB归并为一个新的 线性表LC,且LC中的元素仍按值非递减有序排列。 此问题的算法如下:
线性表示例
List mergelist(list<int> &La,list<int> &Lb){ int length=La.length()+Lb.length; List<int> Lc(length); La.setStart(); Lb.setStart(); while(La.getValue(a)&&Lb.getValue(b)){ if(a<=b){Lc.append(a);La.next();} else{Lc.append(b); Lb.next();} }//while
顺序表的实现声明
void setEnd(){fence=listSize;} void prev(){if(fence!=0) fence--;} void next(){if(fence<=listSize) fence++} int Length() const{return listSize;} int leftLength() const{return fence;} int rightLength() const{return listSizefence;} bool setPos(int Pos){ if((pos>=0)&&(pos<=listSize))fence=pos; return(pos>=0)&&(pos<=listSize) }
线性表的C++抽象类声明 抽象类声明 线性表的
virtual void prev()=0; virtual void next()=0; virtual int leftLength() const=0; virtual int rightLength() const=0; virtual bool setPos(int Pos)=0; virtual bool getValue(Elem&) const=0; virtual void print()成功
0 1 2 3 4 5 6
data 25 x=48 i (b)失败
0
34 i
08 i
16 i
57 i
48 i
09
last 63 n=8
7
1
2
3
4
5
6
data 25 x=20 i
34 i
08 i
16 i
57 i
48 i
09 i
last 63 n=8 i i=8
线性表的C++抽象类声明 抽象类声明 线性表的
templet <class Elem> class List{ public: virtual void clear()=0; virtual bool insert(const Elem&)=0; virtual bool append(const Elem&)=0; virtual bool remove(Elem&)=0; virtual void setStart()=0; virtual void setEnd()=0;
顺序表的实现声明
listArray[fence]=item; listSize++; return true; } templet <class Elem> bool AList:: append(const Elem&item){ if(listSize==maxSize)return false; listArray[listSize++]=item; return true; }
顺序表的实现声明
线性表的删除运算是指将表的第i(1≦i≦n)结点删除, 使长度为n的线性表:(a1,…a i-1,ai,a i+1…,an) 变成长度为n-1的线性表 (a1,…a i-1, a i+1,…,an) … a templet <class Elem> bool AList:: remove(Elem&it){ if(rightlLenth()==0)return false; it=listArray[fence;]; for(int i=fence;i<listSize-1;i++) listArray[i]=listArray[i+1]; listSize--; return true; }
线性表示例
while(La.rightLength()>0) {La.getValue(a);Lc.append(a); La.next();} while(Lb.rightLength()>0) {Lb.getValue(b);Lc.append(b); Lb.next();} return Lc; }
线性表示例
例5 : for(L.setStart();L.getValue(it);L.next() ) DoSomething(it); 例6 : bool find(List <int>& L, int k){ Elem it; for(L.setStart();L.getValue(it);L.next()) if(K==it) return true;//found it return false;// K not found }
第二章 线性表
2.1 线性表的逻辑结构
线性表(Linear List) :由n(n≧)个数据元素(结点)a1, a2, …an组成的有限序列。其中数据元素的个数n 定义为表的长度。当n=0时称为空表,常常将非空 的线性表(n>0)记作: (a1,a2,…an) 这里的数据元素ai(1≦i≦n)只是一个抽象的符号,其 具体含义在不同的情况下可以不同。 例1、26个英文字母组成的字母表 (A,B,C、…、Z) 例2、某校从1978年到1983年各种型号的计算机拥有 量的变化情况。 (6,17,28,50,92,188)
7
顺序表的查找
查找(bool find(AList <int>& L, int k))
2.1 线性表的逻辑结构
例3、学生健康情况登记表如下: 、学生健康情况登记表如下:
姓 名 王小林 陈 红 刘建平 张立立 …….. 学 号 性 别 男 女 男 男 ……. 年龄 18 20 21 17 ……. 健康情况 健康 一般 健康 神经衰弱 ……. 790631 790632 790633 790634 ……..
线性表示例
例7 利用两个线性表LA和LB分别表示两个集合A和 B,现要求一个新的集合A=A∪B。
bool union(List<int> &La,List<int> & Lb) { for(Lb.setStart();Lb.getValue(it);Lb.next() ) if(!find(La, it)) if(!La.append(it)) return flase; return true; }
线性表的顺序存储及运算实现
2.2.2、数组 、
1、类型相同的有限个元素的序列,叫数组。 2、数组是采用顺序方式存贮 设第 0 号元组的地址为 a,元素的长度为 l l · · · · · · (长度为n) 0 1 2 · · · i · · · n-2 n-1 一维数组任一元素的地址LOC( i ) = a+i﹡l 行号: 0 1 ··· l j ··· n-1 ··· ··· ··· · · ·
n-1 n 1 1 ∑(n-i) = ——(n+ ··· +1+0)= — AMN=∑Pi · Ci = —— n+1 n+1 i=0 2 i=0 n-1
顺序表的实现声明
插入操作:使长度为n的线性表 (a1,…a i-1,ai,…,an) 变成长度为n+1的线性表 (a1,…a i-1,x,ai,…,an) templet <class Elem> bool AList:: insert(const Elem&item){ if(listSize==maxSize) return false; for (int i=listSize;i>fence;i--) listArray[i]=listArray[i-1];
2.1 线性表的逻辑结构
例4、一副扑克的点数 (2,3,4,…,J,Q,K,A) 从以上例子可看出线性表的逻辑特征是: 在非空的线性表,有且仅有一个开始结点a1,它没有直接 前趋,而仅有一个直接后继a2; 有且仅有一个终端结点an,它没有直接后继,而仅有一个 直接前趋a n-1; 其余的内部结点ai(2≦i≦n-1)都有且仅有一个直接前趋a i-1 和一个直接后继a i+1。 线性表是一种典型的线性结构。 数据的运算是定义在逻辑结构上的,而运算的具体实现则是 在存储结构上进行的。
列号: 0 1 2 ··· k ···m-1
二维数组任一元素的地址LOC( j, k ) = a+( j﹡m+k ) l
顺序表的实现声明
templet <class Elem> class AList:public List<Elem>{ private: int maxSize; int listSize; int fence; Elem* listArray; public: AList(int size=DefaultListSize){ maxSize=size; listSize=fence=0; listArray=new Elem[maxSize] }