数据结构 串
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
4.1.2 串的存储结构
数据结构C语言描述
线性表有顺序和链式存储结构、对于串都是适 用的。但任何一种存储结构对于串的不同运算并非 都是十分有效的。对于串的插入和删除操作,顺序 存储结构是不方便的,而链式存储结构则显得方便 些。如果访问串中单个字符。对链表来说是不困难 的;当要访问一组连续的字符时,则用链式存储结 构要比用顺序存储结构麻烦。所以应针对不同的应 用来选择串的存储结构。另外,串的存储结构和具 体的计算机的编址方式也有密切的关系。因此,选 用串的存储方式要考虑的因素是较多的,下面作一 些大致的分析。
出版社
MAXLEN
256
<最大串长> 最大串长>
typedef struct
/*串的实际长度* /*串的实际长度*/ 串的实际长度
串的存储结构( 4.1.2 串的存储结构(续)
数据结构C语言描述
串的实际长度可在这预定义长度的范围内随意, 串的实际长度可在这预定义长度的范围内随意, 超过预定义长度的串值则被舍去,称之为“截断” 超过预定义长度的串值则被舍去,称之为“截断”。 对串长有两种表示方法: 对串长有两种表示方法:一是如上述定义描述的那 以分量存放串的实际长度; 样,以分量存放串的实际长度;二是在串值后面加 一个不计入串长的结束标记字符, 如在有的 C 语言 一个不计入串长的结束标记字符 , 如在有的C 中以〞 表示串值的终结。此时的串长为隐含值, 中以〞\0〞表示串值的终结 。此时的串长为隐含值, 显然不便于进行某些串操作。 显然不便于进行某些串操作。这时数据类型可以定 义如下: 义如下: typedef char *Sstring1;
出版社
串的基本概念( 4.1.1 串的基本概念(续)
数据结构C语言描述
子串:串中任意个连续的字符组成的子序列称为该串的子串。 子串:串中任意个连续的字符组成的子序列称为该串的子串。 主串:包含子串的串相应地称为主串。 主串:包含子串的串相应地称为主串。 子串在主串的位置:字符在序列中的序号称为该字符在串中的位置。 子串在主串的位置:字符在序列中的序号称为该字符在串中的位置。子串 在主串的位置是以子串的第一个字符在主串中的位置表示。 在主串的位置是以子串的第一个字符在主串中的位置表示。 例如: 例如:有如下的串 a= ′about ′ b= ′wait ′ c= ′out ′ 其长度分别为5 其长度分别为5、4、3,其中串c为串a的子串,相应地串a为主串。串c在 其中串c为串a的子串,相应地串a为主串。 中的位置为3 串a中的位置为3。
出版社
串的存储结构( 4.1.2 串的存储结构(续)
⑴ 串的顺序存储结构
数据结构C语言描述
串的顺序存储就是把串设计成一种静态结构类型, 串的顺序存储就是把串设计成一种静态结构类型,串的存储分 配是在编译时完成的, 配是在编译时完成的,串中的字符依次存放在一组连续的存 储空间中,也就是用向量来存储串。 储空间中,也就是用向量来存储串。 串的顺序存储结构如下: 串的顺序存储结构如下: #define { ch[MAXLEN+1 char ch[MAXLEN+1]; length; int length; }SString;
出版社
串的存储结构( 4.1.2 串的存储结构(续) typedef struct { char int
数据结构C语言描述
*ch;/*若是非空串 则按串长分配存储区,否则ch 若是非空串, ch为 *ch;/*若是非空串,则按串长分配存储区,否则ch为NULL length; length; /Baidu Nhomakorabea 串长度 */
第4章 串 章
本章要点: 本章要点:
数据结构C语言描述
串的逻辑结构和存储结构和基本操作。 串的在不同存储结构上各种操作算法的实现。
出版社
数据结构C语言描述
串即字符串, 串即字符串,计算机处理的对象分为数值数据 和非数值数据,字符串是最基本的非数值数据。 和非数值数据,字符串是最基本的非数值数据。其 应用非常广泛,它是许多软件系统(如字符编辑、 应用非常广泛,它是许多软件系统(如字符编辑、 情报检索、词法分析、符号处理、 情报检索、词法分析、符号处理、自然语言翻译等 系统)的操作对象。字符串是一种特定的线性表, 系统)的操作对象。字符串是一种特定的线性表, 其特殊性在于组成线性表的每个元素就是一个单字 符。
出版社
串的基本概念( 4.1.1 串的基本概念(续)
数据结构C语言描述
当两个串的长度相等,并且各个对应位置的字符都相同时,称这两个串相等。 当两个串的长度相等, 并且各个对应位置的字符都相同时,称这两个串相等。 串的数据对象是字符集合,一系列连续的字符就组成一个串。学习线性表后, 串的数据对象是字符集合,一系列连续的字符就组成一个串。学习线性表后, 也许你会觉得串也是一种线性表,串的逻辑结构和线性表极为相似, 也许你会觉得串也是一种线性表,串的逻辑结构和线性表极为相似,但由 于串有某些特征而不同线性表( 于串有某些特征而不同线性表(操作的对象不是单个数据元素而是若干个 元素—既子串 既子串) 故独立讨论。 元素 既子串),故独立讨论。 串的抽象数据类型定义如下: 串的抽象数据类型定义如下: ADT String{ 数据对象: 数据对象:D={ai|ai∈CharacterSet,i=1,2,...,n, n≥0} ∈ 数据关系: 数据关系:R1={<ai-1,ai>|ai-1,ai∈D,i=2,...,n} ∈ 基本操作: 基本操作: (1) StrAssign(*T,charconstant):串赋值。charconstant是字符串常量, 是字符串常量, :串赋值。 是字符串常量 生成一个其值等于charconstant的串 。 的串T。 生成一个其值等于 的串 (2) StrCopy(*T,S):串复制。已知串 ,将串 的内容复制到串 中。 的内容复制到串T中 :串复制。已知串S,将串S的内容复制到串 (3) StrEmpty(S):判断串 是否为空,若S为空,则返回真 是否为空, 为空, :判断串S是否为空 为空 则返回真TRUE,否则 , 返回 FALSE。 。 出版社
出版社
4.1 串的基本概念和存储结构
4.1.1 串的基本概念
数据结构C语言描述
是字符线性的有限集合, 记作a= a=′ (n≥0 串 是字符线性的有限集合 , 记作 a=′a1…an ′ (n≥0) 。 a 其中: 是串名,用双引号括起来的字符序列是为串的值, 其中 : a是串名 ,用双引号括起来的字符序列是为串的值 , 双引号不是串内的成份, 双引号不是串内的成份,其作用是为了避免与变量名或常量 混淆。 ≤i≤n)或是字母数据 或是字母数据, 混淆 。 ai(1≤i≤n) 或是字母数据 , 或是其它字符称为串的 元素,是构成串的基本单位。 为串的长度, n≥0 元素 ,是构成串的基本单位 。n 为串的长度, 且 n≥0, 如果 n=0 则称a为空串( String) 记作: ′′, n=0,则称a为空串(Null String),记作:a= ′′,其长 度为0 称为空白串(Blank String), 度为0。而a= ′ ′称为空白串(Blank String),由于空格 本身就是一个字符,它的长度不为0 因此, 本身就是一个字符, 它的长度不为0 。 因此, 它可以出现在 其它字符中间。为了表示清楚下文中的空格符用′ 其它字符中间。为了表示清楚下文中的空格符用′Φ′。
*/
}HString; }HString; 这种存储结构表示时的串操作仍是基于“ 这种存储结构表示时的串操作仍是基于“字符 序列的复制”进行的。 序列的复制”进行的。
出版社
串的存储结构( 4.1.2 串的存储结构(续)
⑶ 串的块链存储表示
数据结构C语言描述
由于串也是一种线性表,因此也可以采用链式存储。 由于串也是一种线性表,因此也可以采用链式存储。由 于串的特殊性(每个元素只有一个字符) 在具体实现时, 于串的特殊性(每个元素只有一个字符),在具体实现时,每 个结点既可以存放一个字符,也可以存放多个字符。 个结点既可以存放一个字符,也可以存放多个字符。每个结 点称为块,整个链表称为块链结构,为了便于操作, 点称为块,整个链表称为块链结构,为了便于操作,再增加 一个尾指针。结点大小为数据域中存放字符的个数。 一个尾指针。结点大小为数据域中存放字符的个数。 例如, 4.1(a)是结点大小为4(即每个结点存放4 例如,图4.1(a)是结点大小为4(即每个结点存放4个字 是结点大小为4(即每个结点存放 的链表, 4.1(b)是结点大小为 的链表。 是结点大小为1 符)的链表,图4.1(b)是结点大小为1的链表。当结点大小大 由于串长不一定是结点大小的整倍数, 于1时,由于串长不一定是结点大小的整倍数,则链表中的 最后一个结点不一定全被串值占满,此时通常补上〞 最后一个结点不一定全被串值占满,此时通常补上〞#〞或 其他的非串值字符(通常“ 不属于串的字符集 不属于串的字符集, 其他的非串值字符(通常“#”不属于串的字符集,是一个特 殊的符号) 殊的符号)。
出版社
串的存储结构( 4.1.2 串的存储结构(续)
⑵ 堆存储结构
数据结构C语言描述
这种存储方法仍然以一组地址连续的存储单元存放串的字符 序列,但它们的存储空间是在程序执行过程中动态分配的。系统 序列,但它们的存储空间是在程序执行过程中动态分配的。 将一个地址连续、容量很大的存储空间作为字符串的可用空间, 将一个地址连续、容量很大的存储空间作为字符串的可用空间, 每当建立一个新串时,系统就从这个空间中分配一个大小和字符 每当建立一个新串时, 串长度相同的空间存储新串的串值。 串长度相同的空间存储新串的串值。 在C语言中,存在一个称之为“堆”的自由存储区,并由C语 语言中,存在一个称之为“ 的自由存储区,并由C 言的动态分配函数malloc() free()来管理 利用函数malloc() malloc()和 来管理。 言的动态分配函数malloc()和free()来管理。利用函数malloc() 为每个新产生的串分配一块实际串长所需的存储空间, 为每个新产生的串分配一块实际串长所需的存储空间,若分配成 则返回一个指向起始地址的指针,作为串的基址,同时, 功,则返回一个指向起始地址的指针,作为串的基址,同时,为 了以后处理方便,约定串长也作为存储结构的一部分。 了以后处理方便,约定串长也作为存储结构的一部分。
(4) StrCompare(S,T):串的比较。已知串S和T,若S>T,则返回值1;若S=T, :串的比较。已知串 和 若 ,则返回值 ; , 数据结构C语言描述 则返回值=0; 则返回值 ;若S<T,则返回值 。 ,则返回值-1。 (5) StrLength(S)求串 的长度。已知串 ,函数返回 串的长度。 求串S的长度 串的长度。 求串 的长度。已知串S,函数返回S串的长度 (6) StrClear(*S):串S存在,将S清为空串。 存在, 清为空串。 : 存在 清为空串 (7) Concat(*T,S1,S2):已知串 和S2,用T返回由 和S2联接而成的新串。 返回由S1和 联接而成的新串 联接而成的新串。 :已知串S1和 , 返回由 (8) SubString(*Sub,S,pos,len):求子串。已知串 ,1≤pos≤StrLength(S)且 :求子串。已知串S, 且 0≤len≤StrLength(S)-pos+1。用Sub返回串 的第 个字符起长度为 的子串。 返回串S的第 个字符起长度为len的子串 。 返回串 的第pos个字符起长度为 的子串。 (9) StrIndex(S,T,pos):串的定位。已知串 和T(非空), :串的定位。已知串S和 (非空), 1≤pos≤StrLength(S)。若串 中存在和串 相同的子串,则返回它在主串 中第 中存在和串T相同的子串 。若串S中存在和串 相同的子串,则返回它在主串S中第 pos个字符之后第一次出现的位置;否则函数值返回 。 个字符之后第一次出现的位置; 个字符之后第一次出现的位置 否则函数值返回0。 (10) Replace(*S,T,V):串的置换。已知串S,T和V,T是非空串,用V替换主 :串的置换。已知串 , 和 , 是非空串, 替换主 是非空串 中出现的所有与T相等的不重叠的子串 串S中出现的所有与 相等的不重叠的子串。 中出现的所有与 相等的不重叠的子串。 (11) StrInsert(*S,pos,T):串的插入。已知串 和T,1≤pos≤StrLength(S)+1。 :串的插入。已知串S和 , 。 在串S的第 个字符之前插入串T。 的第pos个字符之前插入串 在串 的第 个字符之前插入串 。 (12) StrDelete(*S,pos,len)串的删除。已知串 ,1≤pos≤StrLength(S)-len+1,在 串的删除。 串的删除 已知串S, , 中删除第pos个字符起长度为 的子串。 串S中删除第 个字符起长度为 的子串。 中删除第 个字符起长度为len的子串 (13) StrDestroy (*S)已知串 ,将S销毁释放内存空间。 已知串S, 销毁释放内存空间。 已知串 销毁释放内存空间 }ADT String 出版社