数据结构5串 (1)
• 3.串连接 void ConcatStr(SeqString *r1,seqString *r2〉
{if(r1->len+r2->len>MAXLEN) /*连接后的串长超过串的最大长度*/
printf("两个串太长,溢出!“);
else
{for(i =0 ;i<r2->len;i++)
r1-> str[r1->len+i]=r2->str[i] /*进行连接*/
上述这些运算对串而言都是一些最基本的 操作,因此,在引进串变量的高级语言中,一般 都将上述操作作为基本运算符或内部函数或 过程提供,程序开发人员可以直接使用这些操 作来实现程序功能。当然不同语言所提供的 上述操作的种类和标识符可能有所不同。
4.2串的存储结构与运算
串本身是一种线性表,所以串的存储方法与线
4.1.1串的基本概念
• 1.串
• 串(string)是零个或多个字符组成的有限序列,也可 以称为字符串。一般记为S=“a1a2a3…an”。其中 S是串名,双引号括起的字符序列是串值;将串值括 起来的双引号本身不属于串的一部分,它的作用是 避免串与常数或与标识符混淆。例“123”是数字 字符串,而123则是整型常数;“xl”是长度为2的字符 串,而xl通常作为某个对象(如变量、数组或函数等) 的同标的识机符 器来 和使 语用 言。版每本个对合ai(法1<字=i<符=(n即)是允一许个使字用符的,不字 符)有不同的规定。但是一般情况下,英文字符、数 字(0,1,2,…,9)和常用的标点符号以及空格符等都 是合法字符。
• 6.Strcompare(S1, S2) 比较两个字符串S1和S2的大小。若S1>S2,则返
回1;若S1=S2,则返回0;否则返回-1。假设 S1=“abc”,S2=“acd”,则strcompare(S1,Sz)=-1;若 Sl=“aaa”,S2=“aaa”,则strcompare(S1,Sz)=0;若 S1="bbb",S2="aaa",则Strcompare(S1,S2)返回1. • 7.Strconeat(S1, S2)
if(ri->str[i]!=r2->str[i])
return (r);
retum(r1->len - r2->lenh
/*相等返回
0*/
6.插入子串
7.删除字串
• 串的存储空间的大小在编译时刻就已确定, 是静态的,在执行插入或者两个字符串连接 操作时,如果最终长度超过目标字符串的存 储空间大小,则会产生“溢出”,这是定长顺 序存储的一个弊病。
例如,若S =“abcdef”,i =3,lea =2,则Substring (S,3,2)="cd";若S="abc",i=4,len=2,则出错。
• 9.Index(P,T)
寻找字符串P在字符串T中首次出现的起始位置。例如, 若T=”abcdefg“, P=“bcd”则Index(P,T)=2;若P=“bbd“,此时P 没有在T中出现,因此Index(P,T)=0.
4.1.1串的基本概念
• 2.空串和空白串
含零个字符的串称为空串,用¢表示。其它 串称为非空串。任何串中所含字符的个数
称为该串的长度(或串长)。空串的长度为0,它 不包含任何字符。由一个或多个空格组成的 串称为空白串(blank string),它的长度为串中 空格的个数,它是一个仅含空格符的非空串。 注意:空串和空白串的不同,例如""和“ "分别 表示长度为0的空串和长度为1的空格串。
• 3.Strlength(S ) 求变量S中存放的字符串的长度。例如,若
S=“abc”,则Strlength(S)=3;若S=¢( ¢ ) 表示空串),则Strlength(S)=0。
• 4.Strempty(S) 判断变量S中存放的字符串是否为空串。
若是空串,则返回1;否则,返回0。
• 5.Strclear(S) 若字符串S是存在的,则该操作将它清空。
性表的存储方法类似。由于线性表有两种基本存 储结构:顺序存储和链式存储,因此字符串也有同 样两种基本存储结构。但是,串本身又是一种特殊 的线性表,其特殊之处在于:串的每个结点只含一 个字符,若要提高存储密度(即存储结点中数据域占 用的存储量与整个存储结点用的存储量之比),则 需作出特殊的考虑。
串的常见存储结构有顺序存储结构和链式存 储结构,串的顺序存储结构简称为顺序串,顺序串又 可按存储分配方式的不同分为静态存储分配(又称 为定长顺序存储)和动态存储分配(又称为堆分配 存储)。
4.1串的定义
• 串(又称字符串)是一种特殊的线性表,它的特 殊之处在于:线性表的每个元素结点仅由一 个字符组成。在早期的程序设计语言中,串 仅在输入或输出中以常量的形式出现,并不 参与运算,因而只需存储此串的串值,即字符 序列即可。随着计算机的发展,串在文字编 辑、词法扫描、符号处理以及定理证明等 许多领域得到越来越广泛的应用。在高级 语言中开始引入了串变量的概念,如同整型、 实型变量一样,串变量也可以参加各种运算。
r1->str[r1->len+i]='\0’; r1->len=r1->len+r2->len; /*修改连接后新 串的长度*/
4.求字串
5.串相等的比较
int EqualStr(SeqString *rl,SeqString *r2)
{int i;
For( i=0 ; i<r1-> len && i<r2->len; i++);
空串是任意串的子串,任意串是其自身的子串。
4.1.1串的基本概念
4.串相等 两个串是相等的,当且仅当它们的长度相等
并且各个对应位置上的字符都相同。
4.1.2串的基本运算
串的逻辑结构和线性表极为相似,区别仅在 于串的数据对象为字符集。然而,串的基本操作 和线性表却有很大差别。在线性表的基本操作 中,大多以“单个元素”作为操作对象,如在线 性表中查找某个元素、求取某个元素、在某个 位置上插入一个元素和删除一个元素等;而在 串的基本操作中,通常以“串的整体”作为操作 对象,如在串中查找某个子串、求取一个子串、 在串的某个位置上插入一个子串以及删除一个 子串等。下面列出一些与串相关的基本本操作。
4.1.1串的基本概念
3.子串和主串 串中任意个连续字符组成的子序列称为该串的
子串。包含子串的串相应地称为主串。通常称字符 在序列中的序号为该字符在串中的位置。子串在主 串中的位置则以子串的第一个字符在主串中的位置 来表示。 例如,设A、B、C、D为如下的4个串z:A="BEI", B ="JING",C="BEIJING",D="BEI-JING"。 则它们的长度分别为3、4、7和8,并且A和B都是C和 D的子串,A在C和D中的位置都是1,而B在C中的位置 是4,在D中的位置是5。
• 1.Strcreate(S )
初始化字符串。该操作产生.一个新的 字符串放入字符串变量S中,在不支持字符串 变量的编程语言中,可将S定义为字符指针 (下同),该操作使得S指向生成的新字符串的 首地址。
• 2.Strassign(S,T)
字符串赋值操作。其中S和T均为字符串 变量,该操作将字符串变量T中存放的值赋给 S。例如,若T=“abc”,则执行Strassign后,S 中的值也为“abc”。
• 10.Strinsert(S, i, T)
字符串的插入运算。表示将字符串T插入到字符串S的第i 个字符之前。例如,S=”abcdef",i=4,T="kk",则执行插入操 作后,S的值变成"abckkdef"。
• 11.Strdelete(S,i,len)
t字符串的删除运算。表示将字符串S中第i个字符开始长 度为len的子串删除。例:S=“abcdefg”,i=3,len=3,则执 行Strdelete后,S="abfg"。
字符串的连接操作。它将S2中存放的字符串连接 到S1中存放的字符串的后面构成一个新串返回。例 如,S1=“abc”,S2=“cd”,则Strconeat(S1,S2)=“abed”。 • 8.Substring(S,i,len)
该操作的功能为求S的子串。在字符串S中,从第i 个字符开始取len个连续字符构成一个子串返回。
• 除直接使用定长的字符数组存放串内容外, 一般可使用一个不会出现在串中的特殊字 符放在串值的末尾来表示串的结束。所以 串空间最大值为MaxStrSize时,最多只能放 MaxStrSize-1个字符。例如在C语言中是以 字符‘\0'表示串值的终结。
4.2.2串的堆分配存储
顺序串的字符数组空间可使用C语言的malloc和 free等动态存储管理函数,根据实际需要动态地分 配和释放。在程序执行过程中,利用标准函数 malloc和free动态地分配或释 放存储字符串的存储单元,并以一个特殊的字符作为 字符串的结束标志,它的好处在于:可以根据具体情 况,灵活地申请适当数目的存储空间,从而提高存储 资源的利用率。
• 1.创建字符串 seqString *Cseatestr( Seqstring *S) {gets(s -> str); s ->1en=Lenstr(s); return s; }
• 2.求串的长度 int Lenstr(SeqString *S) {int i=0; while(s->str[i]!='\0') i++; return i; }
通常,C语言中提供的串类型就是以这种存储方 式实现的。系统利用函数malloc()和free()进行串 值空间的动态管理,为每一个新产生的串分配一个 存储区,称串值共享的存储空间为"堆"。C语言中 的串以一个空字符为结束符,串长是一个隐含值。 类型定义如下所示: