- 1、本文档共26页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
数据结构第四章 串part2
* 在程序设计语言中,串只是作为输入或输出的常量出现,则只需存储此串的串值,即字符序列即可。但在多数非数值处理的程序中,串也以变量的形式出现。 4.2 串的表示和实现 一、串的定长顺序存储表示 二、串的堆分配存储表示 三、串的块链存储表示 串有三种机内表示方法: 将串中的字符顺序地存放在内存一片连续的存储单元中。 设串S=‘a1 a2 ... an’,则顺序存贮结构在内存贮器中的存贮示意图如图所示: a1 a2 a3 a n 一、串的定长顺序存储表示 串的顺序存贮结构的两种方式 非紧缩存贮格式即一个字的存贮单元存放一个字符. 紧缩存贮格式即一个字的存贮单元中放满多个字符,然后在往下一个字存贮单元存放 与非紧缩存贮格式相比,紧缩存贮格式节省了存贮空间 非紧缩存贮结构 存储单元 紧缩存贮结构 存储单元 #define MAXSTRLEN 255 // 用户可在255以内定义最大串长 typedef unsigned char Sstring [MAXSTRLEN + 1]; // 0号单元存放串的长度 按这种串的表示方法实现的串的运算时,其基本操作为 “字符序列的复制”。 串的实际长度可在这个予定义长度的范围内随意设定,超过予定义长度的串值则被舍去,称之为“截断” 。 特点: 下面以串联接和求子串为例讨论之。 1.串联接 Concat(T,S1,S2) 假设S1、S2 和T都是Sstring型的串变量,且串T是由串S1联结串S2得到的,则只要进行相应的“串值复制”操作即可,只是需按前述约定,对超长部分实施“截断”操作。 基于串S1和S2长度的不同情况,串T值的产生可能有如下三种情况: (1) S1[0]+S2[0] ≤MAXSTRLEN,得到的串T是正确的结果。 (2) S1[0] MAXSTRSIZE,而S1[0]+S2[0] MAXSTRLEN,则将串S2的一部分截断,得到的串T只包含S2的一个子串。 (3) S1[0] =MAXSTRSIZE,则得到串T并非联接结果,而和串S1相等。 算法描述如下: Status Concat(SString S1, SString S2, SString T) { // 用T返回由S1和S2联接而成的新串。若未截断, 则返回TRUE,否则FALSE。 return uncut; } // Concat T[1..S1[0]] = S1[1..S1[0]]; T[S1[0]+1..S1[0]+S2[0]] = S2[1..S2[0]]; T[0] = S1[0]+S2[0]; uncut = TRUE; } if (S1[0]+S2[0] = MAXSTRLEN) {// 未截断 else if (S1[0] MAXSTRSIZE) { // 截断 else { // 截断(仅取S1) T[1..S1[0]] = S1[1..S1[0]]; T[S1[0]+1..MAXSTRLEN] = S2[1..MAXSTRLEN-S1[0]]; T[0] = MAXSTRLEN; uncut =FALSE; } T[0..MAXSTRLEN] = S1[0..MAXSTRLEN]; // T[0] == S1[0] == MAXSTRLEN uncut = FALSE; } 2.求子串 SubString(Sub,S,pos,len) 求子串的过程即为复制字符序列的过程,将串S中从第pos个字符开始长度为len的字符序列复制到串Sub中。显然,本操作不会有需截断的情况,但有可能产生用户给出的参数不符合操作的初始条件,当参数非法时,返回ERROR。 Status SubString (SString Sub, SString S, int pos,int len) {
文档评论(0)