第2章 基本线性结构
线性结构的概念和应用

线性结构的概念和应用线性结构是计算机科学中的基本数据结构之一,指的是数据元素之间存在一对一的关系,即每个数据元素都只有唯一的前驱和后继。
线性结构有几种常见的实现方式,包括链表、栈和队列。
线性结构的应用非常广泛,涵盖了各个领域的计算问题,下面就详细介绍线性结构的概念和应用。
一、概念线性结构是指数据元素之间存在一对一的关系,即每个数据元素只有唯一的前驱和后继。
常见的线性结构有链表、栈和队列。
链表是一种通过指针将数据元素连接起来的结构,每个数据元素包括数据域和指针域;栈是一种具有特殊操作规则的线性结构,只能在末尾进行插入和删除操作;队列是一种具有特殊操作规则的线性结构,只能在头部删除元素,在末尾插入元素。
线性结构还有一些常用的性质,比如长度(线性结构中元素的个数)、位置(线性结构中元素在结构中的位置)以及兄弟节点(线性结构中紧邻的两个节点)等。
二、应用线性结构在计算机科学中的应用非常广泛,以下是一些常见的应用场景。
1. 线性列表:线性结构常用来实现列表操作,例如存储一系列学生的信息、管理图书馆的藏书等。
一般情况下,可以使用链表来实现动态列表,通过插入和删除操作来实现数据的动态更新;也可以使用数组来实现静态列表,通过索引操作来访问和修改列表中的元素。
2. 栈:栈是一种非常重要的数据结构,常用来实现函数的调用、表达式求值、内存管理等。
在函数调用中,函数调用的顺序和返回地址是通过栈来维护的;在表达式求值中,运算符的优先级和操作数的运算顺序是通过栈来管理的;在内存管理中,栈被用来分配和释放函数的局部变量和临时数据。
3. 队列:队列也是一种常用的数据结构,常用来实现任务调度、消息传递等。
在任务调度中,任务被按照加入队列的顺序进行执行;在消息传递中,消息的接收顺序和处理顺序是通过队列来保证的。
4. 连接器:线性结构可以用于实现各种连接器,比如USB、HDMI等。
连接器上的插孔和插针的连接顺序和位置是线性结构的一个典型应用。
第2-5章 线性结构

第二章线性表2-1 设有一个线性表(e0, e1, …, e n-2, e n-1)存放在一个一维数组A[arraySize]中的前n个数组元素位置。
请编写一个函数将这个线性表原地逆置,即将数组的前n个原址内容置换为(e n-1, e n-2, …, e1, e0)。
2-2 设有一个二维数组A[m][n],假设A[0][0]存放位置在644(10),A[2][2]存放位置在676,每个元素占一个空间,问A[3][3](10)存放在什么位置?脚注(10)表示用10进(10)制表示。
2-3 设有一个n n的对称矩阵A,如图(a)所示。
为了节约存储,可以只存对角线及对角线以上的元素,或者只存对角线或对角线以下的元素。
前者称为上三角矩阵,后者称为下三角矩阵。
我们把它们按行存放于一个一维数组B中,如图(b)和图(c)所示。
并称之为对称矩阵A的压缩存储方式。
试问:(1) 存放对称矩阵A上三角部分或下三角部分的一维数组B有多少元素?(2) 若在一维数组B中从0号位置开始存放,则如图(a)所示的对称矩阵中的任一元素a ij在只存上三角部分的情形下(图(b))应存于一维数组的什么下标位置?给出计算公式。
(3) 若在一维数组B中从0号位置开始存放,则如图(a)所示的对称矩阵中的任一元素a ij在只存下三角部分的情形下(图(c))应存于一维数组的什么下标位置?给出计算公式。
2-4 编写一个算法frequency,统计在一个输入字符串中各个不同字符出现的频度。
用适当的测试数据来验证这个算法。
2-5 利用顺序表的操作,实现以下的函数。
(1) 从顺序表中删除具有最小值的元素并由函数返回被删元素的值。
空出的位置由最后一个元素填补,若顺序表为空则显示出错信息并退出运行。
(3) 向顺序表中第i个位置插入一个新的元素x。
如果i不合理则显示出错信息并退出运行。
(8) 从顺序表中删除所有其值重复的元素,使表中所有元素的值均不相同。
2-6 字符串的替换操作replace ( String& s, String& t, String& v) 是指:若t是s的子串,则用串v替换串t在串s中的所有出现;若t不是s的子串,则串s不变。
数据结构课件第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值不合法”);
线性结构PPT课件

线性结构简单易懂,易于实现和操作,具有较好的空间和 时间效率。
线性结构的应用
线性结构广泛应用于各种领域,如计算机科学、数学、物 理学、工程学等,用于解决各种问题,如排序、查找、数 据压缩等。
对未来线性结构应用的展望
线性结构的发展趋势
随着计算机科学和技术的不断发展,线性结构的应用场景和需求也在不断扩大。未来,线 性结构可能会与其他数据结构或算法结合,形成更加高效和实用的解决方案。
组织结构图
总结词
组织结构图是一种表示组织内部结构和关系的图形化工具,通常用于展示公司的部门和职位。
详细描述
组织结构图通过图形和文字展示了组织内部的层次结构和职位关系,有助于理解公司各部门之间的职责和协作方 式。在PPT课件中,组织结构图可以用于介绍公司的组织架构、部门职责和协作方式,帮助观众更好地了解公司 的运营和管理。
技巧
选择适当的反馈机制,如问卷调查、互动问答等, 以获取观众的真实反馈。
2023
PART 03
线性结构的实现方式
REPORTING
流程图
总结词
流程图是一种用图形表示工作流程或程序的工具,通过箭头和节点来表示步骤和 决策。
详细描述
流程图通常用于表示一系列按特定顺序执行的任务或决策,通过箭头连接各个步 骤,清晰地展示了整个流程的逻辑关系。在PPT课件中,流程图可以用于展示操 作流程、业务流程、算法流程等,帮助观众更好地理解整个过程。
如何扬长避短
灵活调整顺序
在制作PPT时,可以预 先设计多种线性结构, 根据观众的需求和反馈 选择合适的结构。
增加交互性
在PPT中加入交互元素, 如提问、投票等,提高 观众的参与度,增强互 动效果。
第2章_数据的线性结构

2.1 数据的逻辑关系和存储表示
计算机的应用: 科学计算与非数值计算 2.1.1 基本概念和术语 例1、学生档案管理
① 组织成一个二维表
学号
10040305 10041536
┊
姓名
张明 李丽 ┊
性别 出生年月 专业 ….
男 1985.01.01 计算机
女 1985.05.30 物理
只有一个开始结点和一个终端结点,其它结点只有一 个前驱结点和一个后继结点,称之为线性结构。即元 素之间存在着一对一的关系。
②非线性结构
如果一个结构不是线性结构,则称之为非线性结构。 一般地,结构中至少有一个结点存在不止一个前驱结 点或后继结点。非线性结构有两类:
a、树形结构:元素之间存在着一对多的关系。 b、图形结构:元素之间存在着多对多的关系。
理存储位置相邻,元素间的逻辑关系用 附设的指针域来表示。通常借助于程序 设计语言中的指针来实现。
例如: 有数据结构B=(D,R), 其中 D={d1,d2,d3,d4,d5} R={r} r={< d1,d2 >,< d2,d3 >,< d3,d4 >,< d4,d5 >}
则用上述两种存储结构表示为:
①带头结点的单循环链表
head
a1
a2
an
空表时 head
②不带头结点的单循环链表
head
a1
a2
an
2、双向链表 • 结点结构:前驱指针域 数据域 后继指针域
2.3 线性表的顺序存储(顺序表)
2.3.1 顺序表的表示方法
用一组地址连续的存储单元依次存放线 性表的元素。
假设每个元素占用b个存储单元,并以元 素的第一个存储单元地址作为元素的存 储地址(结点始址),则loc(ai+1) = loc(ai)+b 。
数据结构课件第2章

SqStack S; ElemType e;
InitStack_Sq(S, 10, 5); // 栈S的初始容量为10
while(N!=0) {
Push_Sq(S, N%8); // 将N除以8的余数入栈
N /= 8;
// N取值为其除以8的商
}
while(FALSE==StackEmpty_Sq(S)) {
括号匹配
int i = 0; ElemType e; SqStack S; InitStack_Sq(S, n, 5);
Status Matching(char *exp, int n)
while(i<n) { switch(exp[i]) {
当读入完所有括号时,检查栈:
case '(': case '[': Push_Sq(S, exp[i]); i++;
本章主要内容
2.1 典型线性数据结构 2.2 顺序栈 2.3 循环队列 2.4 顺序表 2.5 链栈与链队列 2.6 线性表的链式表示与实现 2.7 线性表两种存储结构的比较
2.1典型的线性结构
栈(stack):只允许在序列末端进行操作的线性结 构;
队列(queue): 只允许在序列两端进行操作的线 性结构;
样式: 数据 指针
或 指针 数据 指针
数据域:存储元素数 值数据
指针域:存储直接后继或者直接前 驱的存储位置
1.7.3节的链表存储结构
链式存储
线性结构的链式存储表示
a1
a2
…
an ∧
栈、队列和线性表的链式存储表示
链栈 链队列 单链表、双向链表、循环链表、双向循环链表
2.2 栈的顺序表示和实现
《第二章线性表》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( ))
线性结构知识点总结

线性结构知识点总结一、线性结构的定义线性结构是数据元素之间存在一对一的线性关系。
数据元素是有序排列的,在数据元素之间存在唯一的前驱和后继关系。
线性结构是最基本、最常用的一种数据结构,具有清晰的先后次序关系。
二、线性结构的特点1. 有序性:线性结构中的元素是有序排列的,每个元素都有唯一的前驱和后继。
2. 直接关系:除了首尾两个元素外,任意两个相邻的元素都有直接关系。
三、线性结构的常见类型线性结构的常见类型包括线性表、栈、队列、串、数组、链表等。
下面分别介绍这些线性结构的特点和实现方式。
1. 线性表线性表是线性结构的一种基本形式,它是具有相同特性的数据元素的有限序列。
线性表的特点是元素之间有直接关系,元素的个数是有限的。
线性表常用的实现方式包括顺序表和链表。
1.1 顺序表顺序表是指用一维数组实现的线性表。
它的特点是元素的逻辑顺序和物理顺序相同,元素之间通过数组下标来进行访问。
顺序表的优点是支持随机访问和元素的快速插入和删除,缺点是需要提前确定表的大小,插入和删除操作可能需要移动大量元素。
1.2 链表链表是另一种常见的线性表实现方式。
它的特点是通过指针将元素连接在一起,元素的逻辑顺序和物理顺序可以不同。
链表的优点是可以动态分配内存空间,插入和删除操作效率高,缺点是无法随机访问,需要额外的指针空间。
2. 栈栈是一种特殊的线性表,它只允许在一端进行插入和删除操作。
栈的特点是先进后出,后进先出,类似于弹夹。
栈的常见实现方式包括顺序栈和链式栈,其应用包括函数调用、表达式求值、括号匹配等。
3. 队列队列也是一种特殊的线性表,它只允许在一端进行插入操作,在另一端进行删除操作。
队列的特点是先进先出,后进后出,类似于排队。
队列的常见实现方式包括顺序队列和链式队列,其应用包括任务调度、缓冲区管理等。
4. 串串是由零个或多个字符组成的有限序列,它是线性结构的一种特殊形式。
串的特点是每个字符之间存在唯一的前驱和后继关系,同时支持字符的插入、删除和替换等操作。
第02章线性表(I)

{ int i;
if(slt->size==MAXSIZE)
{printf("\n顺序表是满的!没法插入!");exit(1);}
if(position<0||position>slt->size)
{printf("\n指定的插入位置不存在!");exit(1);}
for(i=slt->size;i>position;i--) slt->a[i]=slt->a[i−1];
将有序顺序表L1分裂成两个线性表L2与L3,L2由表 中所奇数组成,L3由所有偶数组成。
(3)void merge(sequence_lsit *l1,sequence_list *l2, sequence_list *l3)
将有序顺序表L1与L2合并成有序顺序表L3。
退出
2.3.1栈
2.3 栈
栈是一种特殊的线性表,对于这种线性表规定它
n 1 2
这表明,在一个长为n的顺序表中删除一个元素平 均需要移动表中大约一半的元素。该算法的时间复杂 度为O(n)。
退出
顺序表上的一些其它常见算法
(1)void verge(sequence_list l) 将顺序表L就地转置,即借助于O(1)的辅助空间
。 (2)void sprit(sequence_lsit *l1,sequence_list *l2, sequence_list *l3) [略]
退出
要删除顺序表中的第i个结点,则需要称动(n-i-1 )个元素,设删除表中第i个结点的概率为qi,且在表中 每一个位置删除的概率相等,即:
q0=q1=…=qn-1=1/n
则在一个长度为n的顺序表中删除一个结点的平均 移动次数为:
第二讲 线性结构

数据结构的基本概念 一个数据结构应包含两方面的信息 ①表示数据元素的信息 ②表示各数据元素之间的前后件关系 例如:
(数值或非数值)
元素有限集 关系有限集
例如:铺设煤气管道问题
A
32.8 18.2 12.1 44.6 8.7
I
A
32.8 12.1
8.7
I
B
H
52.5 56.4 10.5 79.2
B C
21.3
H
79.2 10.5
C
21.3 41.1 67.3
G
85.6
G
F
41.1
E
98.7
E
D
F
D
(b) 铺设煤气管道设计图
6.Delete(L,i):删除线性表L的第i个元素。
7.Empty(L):若线性表L为空返回True,否则返回False。 8.其他:如线性表的合并、复制、分解等。
例:在长度为n的线性表L的第i个位置上插入一个新元素x
元素 11 14 20 25 28 31 43 78 插入前: 序号 1 2 3 4 5 6 7 8
1. 有穷性 2. 确定性
算法特性
3. 可行性
4. 有输入 5. 有输出
算法
1. 程序设计语言描述的算法 算法分类
2. 伪语言算法 3. 非形式算法(自然语言算法) 1. 算法选用的策略
算法执行时间相关因素
2. 问题的规模 3. 编写程序的语言 4. 编译程序产生的机器代码的质量 5. 计算机执行指令的速度
线性结构第2章 基本线性结构

2020年2月11日
从结构性上考虑,通常将 data 和 last 封装成一个结构:
typedef struct
{ datatype data[MAXSIZE];
int last;
} SeqList; 定义一个顺序表的存储变量:
SeqList L; 通常用一个指向SeqList 类型的指针对实现顺序表的操作更为
线性表是最简单、最基本、也是最常用的线性结构,本 章我们讨论这种最基本的线性结构,
线性表有两种存储方法:顺序存储和链式存储,它的主 要基本操作是插入、删除和检索等。
2020年2月11日
2.1.1 问题的提出
问题1:日常生活中看到的学生花名册、学生的成绩单、 通讯录、单位的职工工资表以及图书馆的图书目录等等, 这些表单具有一个共同的特点,都是由一行行结构相同 的数据构成。对这些表单经常进行的操作是修改、查找、 插入和删除。
L>data[0] ~ L>data[L>last]
2020年2月11日
2.2.2 顺序表上基本运算的实现
⒈ 顺序表的初始化
【算法2-1】顺序表初始化
SeqList *init_SeqList( )
{ SeqList *L;
L= (SeqList *)malloc(sizeof(SeqList)); /*申请顺序表的存储
空间*/
if (L)
{ L->last=-1;
return L; }
/*返回顺序表的存储地址*/
else return –1;
/*申请不成功,返回错误代码-1 */
}
2020年2月11日
数据结构预算法 习题解答第2章

1.循环队列的优点是什么?如何判别它的空和满? 循环队列的优点是能够克服“假溢满”现象。 设有循环队列 sq,队满的判别条件为: (sq->rear+1)%maxsize==sq->front;或 sq->num==maxsize。 队空的判别条件为: sq->rear==sq->front。 2.栈和队列数据结构各有什么特点,什么情况下用到栈,什么情况下用到队列? 栈和队列都是操作受限的线性表,栈的运算规则是“后进先出”,队列的运算规则是“先进先出”。栈 的应用如数制转换、递归算法的实现等,队列的应用如树的层次遍历等。 3.什么是递归?递归程序有什么优缺点? 一个函数在结束本函数之前,直接或间接调用函数自身,称为递归。例如,函数 f 在执行中,又调用 函数 f 自身,这称为直接递归;若函数 f 在执行中,调用函数 g,而 g 在执行中,又调用函数 f,这称为间 接递归。在实际应用中,多为直接递归,也常简称为递归。 递归程序的优点是程序结构简单、清晰,易证明其正确性。缺点是执行中占内存空间较多,运行效率 低。 4.设有编号为 1,2,3,4 的四辆车,顺序进入一个栈式结构的站台,试写出这四辆车开出车站的所有可 能的顺序(每辆车可能入站,可能不入站,时间也可能不等)。 1234,1243,1324,1342,1432,213,2143,2314,2341,2431,3214,3241,3421,4321
【提示】对顺序表 A,从前向后依次判断当前元素 A->data[i]是否介于 x 和 y 之间,若是,并不立即删除, 而是用 n 记录删除时应前移元素的位移量;若不是,则将 A->data[i]向前移动 n 位。n 用来记录当前已删除 元素的个数。
void delete(Seqlist *A,int x,int y)
(C语言详细版)第二章 线性表ppt课件

这种方法可以解决方案一中的“上溢”问题和“空间利用 率不高”问题。但是这一方案是有时间和空间代价的:当 因插入元素而空间不足时,需要重新分配比原先的顺序表 多存储LISTINCREMENT个数据元素的连续空间,并且需 要将原空间的数据元素复制到新分配的空间中。
2018/11/13
卓月明
12
2.2线性表的顺序表示和实现 --类型定义与基本操作实现
卓月明 4
2018/11/13
2.1 线性表的类型定义
在稍复杂的线性表中,一个数据元素可以由若干个数据项 (Item)组成。 在这种情况下,常把数据元素称为记录(Record),含有大量记录的线性 表又称文件(File)。 例如,一个学校的学生健康情况登记表如图所示,表中每个学生的情况 为一个记录,它由姓名、学号、性别、年龄、班级和健康状况等六个数 据项组成。
(C语言详细版)第二章 线性表
第二章 线性表
从第2章至第4章将讨论线性结构。 线性结构的特点是:
在数据元素的非空有限集中,
(1)存在唯一的一个被称做“第一个”的数据元素; (2)存在唯一的一个被称做“最后一个”的数据元素; (3)除第一个之外,集合中的每个数据元素均只有一 个前驱; (4)除最后一个之外,集合中每个数据元素均只有一 个后继。
2.2 线性表的顺序表示和实现
若要在实际的程序设计中真正引用线性表的基本操作, 首先必须实现线性表类型。即在计算机中确定它的存 储结构并在此存储结构上实现类型中定义的所有基本 操作。本节将讨论它的顺序存储结构以及在顺序存储 结构中基本操作的实现。
何谓顺序存储表示?
顺序存储表示指的是,以数据元素在存储器中的"相对位置"来 表示数据元素之间的逻辑关系。你还记得吗?
数据结构之线性结构

数据结构之线性结构数据结构之线性结构(一):概念与基本操作线性结构是数据结构的一种,它是一种最简单的结构。
线性结构的特点是数据元素之间存在一对一的关系,即除了第一个和最后一个元素外,其他元素都有前驱和后继。
线性结构的代表类型有线性表、队列、栈等。
1.1 线性表线性表是线性结构中最基本的一种,它是由零个或多个数据元素组成的有限序列。
线性表的数据元素具有相同的数据类型。
线性表的主要操作有:•初始化:创建一个空的线性表。
•插入:在线性表的指定位置插入一个数据元素。
•删除:删除线性表的指定位置的数据元素。
•查找:查找线性表中指定数据元素的位置。
•修改:修改线性表中指定位置的数据元素。
•输出:输出线性表中的所有数据元素。
1.2 栈栈是线性结构的一种,它是一种后进先出(Last In First Out, LIFO)的数据结构。
栈的主要操作有:•初始化:创建一个空的栈。
•压入:将一个数据元素放入栈顶。
•弹出:移除栈顶的数据元素。
•查找:查找栈中指定数据元素的位置。
•输出:输出栈中的所有数据元素。
数据结构之线性结构(二):常见线性结构及其应用线性结构在计算机科学中有广泛的应用,下面介绍几种常见的线性结构及其应用。
2.1 线性表的应用线性表在计算机科学中有广泛的应用,例如数组、链表等。
数组是一种常见的线性表,它是一组相同类型的数据元素的集合。
数组的特点是可以通过索引直接访问元素,但数组的容量固定,不能动态扩展。
链表是一种动态的线性表,它由一系列节点组成,每个节点包含数据元素和指向下一个节点的指针。
链表的优点是容量可以动态扩展,但访问节点的时间复杂度较高。
2.2 栈的应用栈在计算机科学中有广泛的应用,例如函数调用栈、表达式求值等。
函数调用栈是一种用于存储函数调用的栈,它用于管理函数的执行顺序和局部变量的存储。
表达式求值是一种使用栈来计算表达式值的方法,例如算术表达式、逻辑表达式等。
栈的特点是后进先出,可以方便地处理表达式中的括号匹配和运算顺序。
数据结构(第二章 线性表)

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 线性表的顺序存储和实现
线性表的基本操作 求长度:求线性表的数据元素个数。 访问:对线性表中指定位置的数据元素进行存取、替 换等操作。 插入:在线性表指定位置上,插入一个新的数据元素, 插入后仍为一个线性表。 删除:删除线性表指定位置的数据元素,同时保证更 改后的线性表仍然具有线性表的连续性。 复制:重新复制一个线性表。 合并:将两个或两个以上的线性表合并起来,形成一 个新的线性表。 查找:在线性表中查找满足某种条件的数据元素。 排序:对线性表中的数据元素按关键字值,以递增或 递减的次序进行排列。 遍历:按次序访问线性表中的所有数据元素,并且每 个数据元素恰好访问一次。
2.1节线性数据结构基本概念

05 06 07 08 09
数据之间的联系:1:N
树结构示意图
04 10
图构造
Graph = ( D, R ) D = { 1,2,3,4,5,6,7,8,9 } R = { <1,2>,<1,3>,<2,4>,<2,5>,<2,6>,<2,8>,
学号 姓名 性别 籍贯 出生年月 住址
0604800 赵玲 女 上海 1
0604800 杨扬 男 北京 2
……
…… …… ……
1987.10 上海
1987.3 北京
……
……
表构造
交通图
乌鲁 木齐
1892
兰州
呼和 浩特
668 1145
676 西安
511 842 成都
图构造
北京
695 郑州
1.2 数据结构研究的内容
时间复杂度和空间复杂度的关系
相互矛盾
顺序存储构造:用数据元素在存储器中的相 对位置来表示数据元素之间的逻辑关系。
链式存储构造:在每一个数据元素中增加一 个存放地址的指针,用此指针来表示数据元 素之间的逻0
姓名
刘晓光 马广生 王民
…
张玉华
性别
男 男 男
…
女
民族
汉 回 壮
…
汉
年龄
16 17 21
…
6*2n+n2=O(2n)
/* 6*2n+n2 7*2n for n4 */
时间复杂度T(n)按数量级递增顺序为:
复杂度低
复杂度高
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
L->data[i-1]=x;
/*新元素插入*/
码-1*/
}
if (i<1 || i>L->last+2) /*检查插入位置的正确性*/
{ printf("位置错") ;
return 0; /*插入位置参数错,返回错误代码0 */ }
for (j=L->last;j>=i-1;j--)
L->data[j+1]=L->data[j]; /*结点移动 */
}
2020年7月25日
第14页
2. 插入运算
【算法2-2】 顺序表的插入算法
int Insert_SeqList(SeqList *L,int i,DataType x)
{ int j;
if (L->last==MAXSIZE-1)
{printf("表满");
return -1;
/*表空间已满,不能插入,返回错误代
第2章 基本线性结构
第2页
⒈教学内容
线性表的逻辑结构、线性表的顺序存储、线性表的链式 存储、顺序表和链表的比较;栈和队列的逻辑结构、存储实 现及基本运算。
⒉教学目的
理解线性表的定义及其运算,理解顺序表和链表的定义、 组织形式、结构特征和类型说明,掌握在这两种表上实现的 插入、删除和按值查找的算法,了解循环链表、双链表的结 构特点;理解栈和队列的定义、特征及基本运算;掌握栈和 队列的两种存储结构及基本运算的实现。
SeqList *init_SeqList( )
{ SeqList *L;
L= (SeqList *)malloc(sizeof(SeqList)); /*申请顺序表的存储
空间*/
if (L)
{ L->last=-1;
return L; }
/*返回顺序表的存储地址*/
else return –1;
/*申请不成功,返回错误代码-1 */
2020年7月25日
第3页
⒊教学重点 ⒋教学难点
线性表与线性结构的联系与区别,头结点在链表中的作 用、指针操作,删除、插入运算中的指针操作顺序,双链 表上指针的操作顺序;顺序栈的溢出判断条件,循环队列 的队空、队满判断条件,循环队列上的插入、删除操作。
2020年7月25日
第4页
2.1 线性表的逻辑结构
线性表的表长表示为:(*L).last+1,记为: L>last+1 线性表中数据元素顺序存储的基址为:L>data 线性表中数据元素的存储或表示为:
L>data[0] ~ L>data[L>last]
2020年7月25日
第13页
2.2.2 顺序表上基本运算的实现
⒈ 顺序表的初始化
【算法2-1】顺序表初始化
SeqList L; 通常用一个指向SeqList 类型的指针对实现顺序表的操作更为
方便:SeqList *L; L是一个指针变量,通过“L=(SeqList )malloc(sizeof (SeqList));”操作来获得顺序表的存储空间,L中存放的是顺序表 的地址。
2020年7月25日
第12页
线性结构的特点是数据元素之间是一种线性关系,数据 元素“一个接一个的排列”。
线性表是最简单、最基本、也是最常用的线性结构,本 章我们讨论这种最基本的线性结构,
线性表有两种存储方法:顺序存储和链式存储,它的主 要基本操作是插入、删除和检索等。
2020年7月25日
第5页
2.1.1 问题的提出
问题1:日常生活中看到的学生花名册、学生的成绩单、 通讯录、单位的职工工资表以及图书馆的图书目录等等, 这些表单具有一个共同的特点,都是由一行行结构相同 的数据构成。对这些表单经常进行的操作是修改、查找、 插入和删除。
2020年7月25日
2.2 线性表的顺序存储与实现 第9页
2.2.1 顺序表
顺序存储可以按序号随机访问每一个数据元素: 设 a1的存储地址为Loc(a1),每个数据元素占d个存储
地址,则第i个数据元素的地址为: Loc(ai)=Loc(a1)+(i-1)*d 1≤i≤n
2020年7月25日
用一维数组来示实现顺序表的数据存储区域。 可以是:
datatype data[MAXSIZE]; int last;
第10页
2020年7月25日
第11页
从结构性上考虑,通常将 data 和 last 封装成一个结构: typedef struct { datatype data[MAXSIZE]; int last; } SeqList;
定义一个顺序表的存储变量:
2020年7月25日
第6页
问题4:程序设计语言对函数嵌套调用的实现,需要保存 调用点的数据,并按照调用的顺序后调用先返回。调用的 过程是线性的,返回的过程也是线性的,只是返回的过程 与调用的过程正好相反。 问题5:如何实现一元多项式的存储表示及加、减、乘等 运算的实现。由于一元多项式的每一项都是由系数和指数 构成,因此可将一元多项式抽象地表示为由系数和指数构 成的序偶序列 ,各个序偶之间的逻辑关系是线性的,为便 于运算,可以约定按照指数递增的顺序排列。 。。。。。。
问题2:日常生活中我们将洗好的盘子由下而上摆放起 来,使用的时候再从上至下依次取出,如果用计算机模 拟这一过程,盘子之间的逻辑关系是线性结构,但处理 盘子的摆放顺序需要遵循后摆放先取出的原则进行处理。
问题3:日常生活中排队购物、汽车进站出站、到银行 办理业务等事务处理过程,如果用计算机模拟,一般情 况是一个需要遵循先来先服务的处理原则的线性结构。
20的基本运算
⑴ 线性表初始化:Init_List(L) ⑵ 求线性表的长度:Length_List(L) ⑶ 取表元:Get_List(L,i) ⑷ 按值查找:Locate_List(L,x) ⑸ 插入操作:Insert_List(L,i,x) ⑹ 删除操作:Delete_List(L,i)
2020年7月25日
第7页
2.1.2 线性表的定义
线性表是具有相同数据类型的n(n>=0)个数据元素的有 限序列,通常记为: (a1,a2,… ai-1,ai,ai+1,…an)
其中n为表长, n=0 时称为空表。表中相邻元素之间存 在着顺序关系。将 ai-1 称为 ai 的直接前趋,ai+1 称为 ai 的直 接后继。