数据结构串、数组和广义表知识点总结
第4章 串2—第5章 数组和广义表

串的基本操作示例:
5
C 语言字符串函数库中提供下列串处理函数: 语言字符串函数库中提供下列串处理函数: 头文件: 头文件:# include <string.h> gets(str) puts(str) strcat(str1, str2) strcpy(str1, str2, k) strcmp(str1, str2) strlen(str) // 输入一个串; 输入一个串; // 输出一个串; 输出一个串; // 串联接函数; 串联接函数; // 串复制函数; 串复制函数; // 串比较函数; 串比较函数; // 求串长函数; 求串长函数;
记为: =‘a 记为:s = a1a2…an’ a 串名 串值
(用‘ ’ 括 起来) 起来)
(n≥0 )
C++中隐含结 C++中隐含结 束符‘ 束符‘\0’ , ASCII码 即ASCII码 NUL
2
串与线性表
串的逻辑结构和线性表极为相似,区别仅在于串 逻辑结构和线性表极为相似,区别仅在于串 极为相似 仅在于 数据对象约束为字符集。 约束为字符集 的数据对象约束为字符集。 串的基本操作和线性表有很大差别。 串的基本操作和线性表有很大差别。 基本操作和线性表有很大差别 线性表的基本操作中 大多以“单个元素” 的基本操作中, 在线性表的基本操作中,大多以“单个元素” 作为操作对象; 作为操作对象; 操作对象 的基本操作中,通常以“串的整体” 在串的基本操作中,通常以“串的整体”作为 操作对象。 操作对象。
20
二维数组的定义: 二维数组的定义: 数据对象: 数据对象 D = {aij | 0≤i≤b1-1, 0 ≤j≤b2-1} 数据关系: 数据关系 R = { ROW, COL } ROW={<ai,j,ai,j+1>|0≤i≤b1-1, 0≤j≤b2-2} COL={<ai,j,ai+1,j>|0≤i≤b1-2, 0≤j≤b2-1}
数据结构数组与广义表知识点总结

数据结构数组与广义表知识点总结数组是一种线性数据结构,可以存储多个相同类型的元素。
它的特点是元素的大小固定,并且在内存中是连续存储的。
数组的访问方式是通过下标来访问,下标从0开始。
数组可以在编程中应用于各种情况,比如存储一组数字、一组字符串等。
广义表是一种扩展的线性数据结构,可以存储不同类型的元素。
它由元素和表构成,其中表可以是空表、原子或子表。
广义表可以递归定义,即子表可以包含更多的子表。
广义表的访问方式是通过递归来访问,可以对表的元素进行遍历和操作。
在数据结构中,数组和广义表都有自己的特点和用途,下面对它们的知识点进行总结:1.数组的特点及应用:-数组是一种线性数据结构,可以存储多个相同类型的元素。
-数组的内存分配是连续的,可以通过下标来访问元素。
-数组的大小固定,一旦定义后不能改变。
-数组的访问速度快,可以通过下标直接访问元素。
-数组适合用于存储一组相同类型的数据,比如一组数字、一组字符串等。
-数组的应用场景包括但不限于:排序算法、查找算法、图像处理、矩阵运算等。
2.数组的操作和常用算法:-初始化:可以直接赋值或使用循环初始化数组。
-访问元素:通过下标访问元素,下标从0开始。
-修改元素:直接通过下标修改元素的值。
-插入元素:需要移动插入位置之后的元素。
-删除元素:需要移动删除位置之后的元素。
-查找元素:可以使用线性查找或二分查找等算法。
-排序算法:比如冒泡排序、选择排序、插入排序等。
-数组还有一些常用的属性和方法,比如长度、最大值、最小值等。
3.广义表的特点及应用:-广义表是一种扩展的线性数据结构,可以存储不同类型的元素。
-广义表由元素和表构成,表可以是空表、原子或子表。
-广义表可以递归定义,即子表可以包含更多的子表。
-广义表的访问方式是通过递归遍历和操作。
-广义表适合存储一组不同类型的数据,比如存储学生信息、函数调用栈等。
-广义表的应用场景包括但不限于:函数式编程、树的表示、图的表示等。
02331数据结构 04数组和广义表

02331数据结构 04数组和广义表02331数据结构-04数组和广义表第四章多维数组和广义表1.多维数组和广义表是一种复杂的非线性结构,它们的逻辑特征是:一个数据元素可能有多个直接前驱和多个直接后继。
2.一维数组(矢量)是存储在计算机连续存储空间中的若干具有统一类型的数据元素。
同一数组的不同元素通过不同的下标标识。
(a1,a2,…,an)3.二维数组amn可视为由m个行向量组成的向量,或由n个列向量组成的向量。
二维数组中的每个元素aij既属于第i行的行向量,又属于第j列的列向量。
4.多维数组:3D数组AMNP可以看作是一个以2D数组为数据元素的向量。
将三维阵列的四维向量作为视觉数据三维数组中的每个元素aijk都属于三个向量。
四维数组中的每个元素都属于四个向量……5.数组的顺序存储:由于计算机内存是一维的,因此多维数组的元素应按线性顺序排列并存储在内存中。
数组通常不执行插入和删除操作,也就是说,结构中的元素数量和元素之间的关系不会改变。
通常,顺序存储方法用于表示阵列。
(1)行优先级:按行向量排列数组元素,I+1行向量紧跟在第I行向量之后。
【示例】二维数组amn的行首存储的线性序列为:a11,A12,。
,A1N,A21,A22,。
,A2N,。
,AM1,AM2,。
,amn(2)列优先级将数组元素按列向量排列,第i+1个列向量紧接在第i个列向量后面。
【例】二维数组amn的按列优先存储的线性序列为:a11,a21,…,am1,a12,a22,…,am2,……,a1n,a2n,…,amn6.数组元素的地址计算公式:(1)按行优先级顺序存储的二维数组amn地址计算公式loc(aij)=loc(a11)+[(i-1)×n+j-1]×d(注:此公式下界为1,如下界为0,则公式变为[i×n+j])①loc(a11)是开始结点的存放地址(即基地址)②d为每个元素所占的存储单元数③ 根据地址计算公式,可以通过地址公式同时在内存中访问数组中的任何元素。
《数据结构(C语言)》第4章 串、数组和广义表

串的存储与操作
❖ 串的顺序存储与操作 ❖ 1.串的基本操作
(3) 求串长StrLength(s) 返回串s中字符的个数。 算法4.3 求串长度 int StrLength(char s[]) { int len=0;
while(s[len++]!='\0'); return --len; }
4.2(b)所示。当节点大小大于1时,由于串长不一定
是节点大小的整倍数,因此链表中的最后一个节点不
一定全被串值占满,此时通常要补上“#”或其他的
非串值字符(通常,“#”不属于串的字符集,是一个
特殊的符号)。 头指针
S
D
A
E
头指针
S
DATA
STR
UCTU
RE# #
空格符
Data structures
串的存储与操作
charch[CHUNKSIZE];
structChunk *next;
}Chunk;
typedef struct { /*串的链表结构*/
Chunk *head, *tail;/*串的头和尾指针*/
int curlen; /*串的当前长度*/
}LString;
Data structures
串的存储与操作
串(或字符串),是由零个或多个字符组成的有限序列。一般 记为:
s=‘a0a1...an-1’ (n>=0)
其中s是串的名,用单引号括起来的字符序列是串的值;串中字 符的数目n称为串的长度。
❖ 2.空串和空格串
零个字符的串称为空串,它的长度为零。
由一个或多个空格组成的串,称为空格串。它的长度是串中空格字符 的个数。
第4章-串、数组和广义表

(13) DestroyString(&S)
//串销毁
}ADT String 北京林业大学信息学院
2021年1月9日
6
串的存储结构
顺序存储 链式存储
2021年1月9日
7
顺序存储表示
typedef struct{ char *ch;
int length; }HString;
//若串非空,则按串长分配存储区, //否则ch为NULL //串长度
S :ababcabcacbab
•
T :abc j
i指针回溯
S :ababcabcacbab
T : abc
S :ababcabcacbab
T : abc
2021年1月9日
13
BF算法设计思想
Index(S,T,pos)
• 将主串的第pos个字符和模式的第一个字符比较, 若相等,继续逐个比较后续字符; 若不等,从主串的下一字符起,重新与模式的第 一个字符比较。
//串的当前长度
}LString;
2021年1月9日
11
串的模式匹配算法
算法目的:
确定主串中所含子串第一次出现的位置(定位) 即如何实现教材P72 Index(S,T,pos)函数
算法种类:
•BF算法(又称古典的、经典的、朴素的、穷举的) •KMP算法(特点:速度快)
2021年1月9日
12
i
BF算法设计思想
(6) StrCopy(&T,S)
//串拷贝
(7) StrEmpty(S)
//串判空
(8) ClearString (&S)
//清空串
(9) Index(S,T,pos)
数组和广义表 数据结构

3.建立广义表的存储结构 假定广义表中的元素类型ElemType为chai类型,每个原子的值被限 定为英文字母。并假定广义表是一个表达式,其格式为:元素之间用一 个逗号分隔,表元素的起止符号分别为左、右圆括号,空表在其圆括号 内不包含任何字符。例如“(a,(b, c, d))”就是一个符合上述规定的广 义表格式。 建立广义表存储结构的算法同样是一个递归算法。该算法使用一个 具有广义表格式的字符串参数s,返回由它生成的广义表存储结构的头结 点指针h。在算法的执行过程中,需要从头到尾扫描s的每一个字符。当 碰到左括号时,表明它是一个表元素的开始,则应建立一个由h指向的表 结点,并用它的sublist域作为子表的表头指针进行递归调用,来建立子 表的存储结构;当碰到一个英文字母时,表明它是一个原子,则应建立 一个由h指向的原子结点;当碰到一个“)”字符时,表明它是一个空表, 则应置h为空。当建立了一个由h指向的结点后,接着碰到逗号字符时, 表明存在后继结点,需要建立当前结点(即由h指向的结点)的后继表; 当碰到右括号或分号字符时,表明当前所处理的表已结束,应该置当前 结点的link域为空。 4.输出广义表 5.广义表的复制
广义表的转换过程
为了使子表和原子两类结点既能在形式上保持一致,又能进
行区别,可采用如下结构形式:
其中,tag域为标志字段,用于区分两类结点。sublist或data
域由tag决定。若tag=0,表示该结点为原子结点,则第二个 域为data,存放相应原子元素的信息;若tag=l,表示该结点 为表结点,则第二个域为sublist,存放相应子表第一个元素 对应结点的地址。link域存放与本元素同一层的下一个元素所 在结点的地址,当本元素是所在层的最后一个元素时,link域 为NULL。 例:前面的广义表C的存储结构如下图所示(很多《数据结构 公教科书上称之为带表头结点的广义表的链表存储结构
数据结构复习数组和广义表

a
第5章 数组和广义表
一、数组 1、数组的顺序存储方式和地址计算方法
数组的存储方式有:
(1)行优先存储方式 (2) 列优先存储方式 例5-1 二维数组 int a[10][10], 以行优先存储, 第1 个元素 的首址是100, 每个元素的长度为2,求A[4][5]的存储首址。
原子结点 tag=0 atom
例5-2:A=(( ),(e),2)对角矩阵
例:以三对角矩阵为例,按行主序方式存储,
仅存储非零部分。
将一个a[100][100]的三对角矩阵以行主序存入一
维数组B[298]中,元素a[65][64]在B数组中的位置k等
于。
a
3、稀疏矩阵的存储方式
——三元组法
矩阵A中有非零元个数s远远小于矩阵元素的
总数,则称A为稀疏矩阵。
ijv
1 2 12
0 12 9 0 0 0
M=
0 0 0 000
-3 0 0 0 0 14
0 0 24 0 0 0
13 9 3 1 -3 3 6 14 4 3 24
a
二、广义表 1、广义表的定义
广义表 ls=(d1,d2,……,dn)。其中每个元素可以是原子, 也可以是子表。 称d1为表头,d2,……,dn为表尾。 n: 表示广义表的长度,括号层数表示广义表的深度。
2、广义表与线性表的区别
线性表(a1,a2,……,an)中每个元素都具有相同的类型, 有两种存储结构:顺序表和链表。
广义表(d1,d2,……,dn)中每个元素可以是原子,也可以 是子表。可以将广义表看作是线性表的推广。由于原子和子 表的类型不同,所以只能用链式存储结构。
a
3、广义表的链式存储结构
四、串、数组和广义表

四、串、数组和⼴义表(内容待完善)知识点串的模式匹配⼜称⼦串定位运算或串匹配。
在匹配中,将主串称为⽬标(串),⼦串称为模式(串)。
BF法(Brute Force):KMP法:串的模式匹配的两种⽅法。
BF法,朴素的串匹配法。
KMP法,尽可能的滑动得更远,利⽤部分的匹配结果。
朴素的模式匹配算法(BF算法)图⽰说明第⼀轮⽐较:第⼆轮⽐较:...... 原理⼀致,省略中间步骤第五轮:第六轮:第⼀轮:⼦串中的第⼀个字符与主串中的第⼀个字符进⾏⽐较若相等,则继续⽐较主串与⼦串的第⼆个字符若不相等,进⾏第⼆轮⽐较第⼆轮:⼦串中的第⼀个字符与主串中第⼆个字符进⾏⽐较......第N轮:依次⽐较下去,直到全部匹配代码实现:(略)BF算法优点:思想简单,直接,缺点:每次字符不匹配时,都要回溯到开始位置,时间开销⼤。
时间复杂度 O((n-m+1)*m) 。
KMP模式匹配算法图⽰说明:从图中,我们可以很容易的发现,因为前⾯的字符,S和T中存在同的元素,所以S不必回溯到S[1]的位置,T也不必回溯到T[0]的位置。
我们就可直接跳过对相同元素的回溯⽐较,直接⽐较S[8]与T[3]。
因此我们构建⼀个next数组储存回溯位置。
KMP算法的思想:假设在模式匹配的进程中,执⾏T[i]和W[j]的匹配检查。
若T[i]=W[j],则继续检查T[i+1]和W[j+1]是否匹配。
next数组两种求法(1)第⼀种求法:根据前⼀个字符的next值求初始化:代码实现:1 char t[]={"ababaabab"};2 int Len=strlen(t);34 int i = 0, j = -1;5 int next[len];6 next[0]=-1;7 while (i < len - 1) {8 if ((j == -1) || t[i] == t[j]) {9 ++i, ++j;10 next[i] = j;11 }else{12 j = next[j];13 }14 }1516 for(i=0;i<len;i++)17 {printf("next[%d]->%d\n",i,next[i])}(2)第⼆种求法:根据最⼤公共元素长度求的求法))next数组优化(nextval的求法当⼦串中有多个连续重复的元素,例如主串 S=“aaabcde” ⼦串T=“aaaaax” 在主串指针不动,移动⼦串指针⽐较这些值,其实有很多⽆⽤功,因为⼦串中5个元素都是相同的a,所以我们可以省略掉这些重复的步骤。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数据结构串、数组和广义表知识点总结
数据结构是计算机科学中研究数据如何组织、存储、管理和操作的学科。
三个常见的数据结构串、数组和广义表都是用于存储和操作数据的。
1. 串:
- 串是由0个或多个字符组成的有限序列。
它是一维数组的特例。
- 串的操作包括插入、删除、修改和查找等常见操作。
- 串可以通过数组、链表或动态分配的内存来实现。
2. 数组:
- 数组是一种线性数据结构,它由一组连续的内存空间组成,
存储相同类型的数据。
- 数组的操作包括插入、删除、修改和查找等常见操作。
- 数组的访问时间复杂度为O(1),但插入和删除的时间复杂度
较高。
3. 广义表:
- 广义表是由若干元素组成的有序集合,每个元素可以是原子
或者是一个广义表。
- 广义表可以通过链表来实现,每个节点包含两个指针,一个
指向元素,一个指向下一个节点。
- 广义表的操作包括插入、删除、修改和查找等常见操作。
- 广义表可以表示任意层次的嵌套结构,具有灵活性和扩展性。
总结:
- 串、数组和广义表都是常见的数据结构,用于存储和操作数据。
- 串是字符的有限序列,可以通过数组或链表来实现。
- 数组是一维线性数据结构,存储相同类型的数据,具有常数时间复杂度的访问操作。
- 广义表是由元素组成的有序集合,可以通过链表来实现,能够表示任意层次的嵌套结构。