数据结构5串 (1)

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

• 1.Strcreate(S )
初始化字符串。该操作产生.一个新的 字符串放入字符串变量S中,在不支持字符串 变量的编程语言中,可将S定义为字符指针 (下同),该操作使得S指向生成的新字符串的 首地址。
• 2.Strassign(S,T)
字符串赋值操作。其中S和T均为字符串 变量,该操作将字符串变量T中存放的值赋给 S。例如,若T=“abc”,则执行Strassign后,S 中的值也为“abc”。
• 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] /*进行连接*/
字符串的连接操作。它将S2中存放的字符串连接 到S1中存放的字符串的后面构成一个新串返回。例 如,S1=“abc”,S2=“cd”,则Strconeat(S1,S2)=“abed”。 • 8.Substring(S,i,len)
该操作的功能为求S的子串。在字符串S中,从第i 个字符开始取len个连续字符构成一个子串返回。
• 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; }
4.1串的定义
• 串(又称字符串)是一种特殊的线性表,它的特 殊之处在于:线性表的每个元素结点仅由一 个字符组成。在早期的程序设计语言中,串 仅在输入或输出中以常量的形式出现,并不 参与运算,因而只需存储此串的串值,即字符 序列即可。随着计算机的发展,串在文字编 辑、词法扫描、符号处理以及定理证明等 许多领域得到越来越广泛的应用。在高级 语言中开始引入了串变量的概念,如同整型、 实型变量一样,串变量也可以参加各种运算。
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。
空串是任意串的子串,任意串是其自身的子串。
4.1.1串的基本概念
4.串相等 两个串是相等的,当且仅当它们的长度相等
并且各个对应位置上的字符都相同。
4.1.2串的基本运算
串的逻辑结构和线性表极为相似,区别仅在 于串的数据对象为字符集。然而,串的基本操作 和线性表却有很大差别。在线性表的基本操作 中,大多以“单个元素”作为操作对象,如在线 性表中查找某个元素、求取某个元素、在某个 位置上插入一个元素和删除一个元素等;而在 串的基本操作中,通常以“串的整体”作为操作 对象,如在串中查找某个子串、求取一个子串、 在串的某个位置上插入一个子串以及删除一个 子串等。下面列出一些与串相关的基本本操作。
• 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"。
静态存储分配可简单地理解为:在定义串的同 时其存储空间的长度就必须确定下来。存储空间 的长度一旦定下来就不能再改变。通常直接使用 定长的字符数组来存储一个串。它的优点是涉及 串长的操作速度快,因为它的最大长度是不变的。
动态存储分配就是在定义串时不分配存储空间, 直到需要使用时按所需串的长度分配存储单元给 它,并且在运行中还可以根据需要变化串的长度。 不过这样的串仍是顺序存储的,也就是说指针指向 串的首地址,串中每个结点从首地址开始一个接着 一个连续存储。
if(ri->str[i]!=r2->str[i])
return (r1->str[i]-r2->str[i]);
retum(r1->len - r2->lenh
/*相等返回
0*/
6.插入子串
7.删除字串
• 串的存储空间的大小在编译时刻就已确定, 是静态的,在执行插入或者两个字符串连接 操作时,如果最终长度超过目标字符串的存 储空间大小,则会产生“溢出”,这是定长顺 序存储的一个弊病。

线性表的结点可以是任意的数据元素,当然也可以 是字符。以字符为数据元素、以线性结构构为逻辑结 构的数据结构称为字符串。字符串是一类重要的、常 用的非数值处理对象。
尽管字符串可以看成是一种特殊的线性表一一以 字符为结点内容(数据元素)的线性表,它的表示(存储) 方法和操作方法具有与普通线性表不同的特点,有必要 从数据结构的角度对其加以专门研究。这里把以字符 为结点内容(数据元素)的线性表当作一种独立的数据 结构,并给它一个专门的名称一一串。我们将着重讨 论串的运算和存储方法,这是串与一般线性表很不相同 的两个地方。
r1->str[r1->len+i]='\0’; r1->len=r1->len+r2->len; /*修改连接后新 串的长度*/
wk.baidu.com
4.求字串
5.串相等的比较
int EqualStr(SeqString *rl,SeqString *r2)
{int i;
For( i=0 ; i<r1-> len && i<r2->len; i++);
例如,若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.
通常,C语言中提供的串类型就是以这种存储方 式实现的。系统利用函数malloc()和free()进行串 值空间的动态管理,为每一个新产生的串分配一个 存储区,称串值共享的存储空间为"堆"。C语言中 的串以一个空字符为结束符,串长是一个隐含值。 类型定义如下所示:
4.2.2串的堆分配存储
typedef struet {char *str; //若串非空,则按实际的串长分 配存储区,否则str为NULL int len; }Hstring;
4.1.1串的基本概念
• 2.空串和空白串
含零个字符的串称为空串,用¢表示。其它 串称为非空串。任何串中所含字符的个数
称为该串的长度(或串长)。空串的长度为0,它 不包含任何字符。由一个或多个空格组成的 串称为空白串(blank string),它的长度为串中 空格的个数,它是一个仅含空格符的非空串。 注意:空串和空白串的不同,例如""和“ "分别 表示长度为0的空串和长度为1的空格串。
性表的存储方法类似。由于线性表有两种基本存 储结构:顺序存储和链式存储,因此字符串也有同 样两种基本存储结构。但是,串本身又是一种特殊 的线性表,其特殊之处在于:串的每个结点只含一 个字符,若要提高存储密度(即存储结点中数据域占 用的存储量与整个存储结点用的存储量之比),则 需作出特殊的考虑。
串的常见存储结构有顺序存储结构和链式存 储结构,串的顺序存储结构简称为顺序串,顺序串又 可按存储分配方式的不同分为静态存储分配(又称 为定长顺序存储)和动态存储分配(又称为堆分配 存储)。
• 除直接使用定长的字符数组存放串内容外, 一般可使用一个不会出现在串中的特殊字 符放在串值的末尾来表示串的结束。所以 串空间最大值为MaxStrSize时,最多只能放 MaxStrSize-1个字符。例如在C语言中是以 字符‘\0'表示串值的终结。
4.2.2串的堆分配存储
顺序串的字符数组空间可使用C语言的malloc和 free等动态存储管理函数,根据实际需要动态地分 配和释放。在程序执行过程中,利用标准函数 malloc和free动态地分配或释 放存储字符串的存储单元,并以一个特殊的字符作为 字符串的结束标志,它的好处在于:可以根据具体情 况,灵活地申请适当数目的存储空间,从而提高存储 资源的利用率。
• 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)
下面分别介绍这3种存储方法:定长顺序存储、堆分 配存储和链式存储。
4.2.1串的定长顺序存储
• 与线性表的顺序存储类似,串的定长顺序存储是用一 组地址连续的存储单元来存储串中的字符序列。因此 可用高级语言的字符数组来实现串的定长顺序存储。
具体类型定义如下: #define MAXSIZE 100 typedef struet {char str[MAXSIZE]; int len; }SeqString; 使用定长的字符数组str存放字符串中的每个字 符,len表示字符串当前的实际长度,而MAXSIZE表示 数组str所能存放的字符串的最大长度。此时顺序串 的类型定义完全和顺序表类似。以下给出在顺序存储 方式下字符串部分运算的具体实现。
• 3.Strlength(S ) 求变量S中存放的字符串的长度。例如,若
S=“abc”,则Strlength(S)=3;若S=¢( ¢ ) 表示空串),则Strlength(S)=0。
• 4.Strempty(S) 判断变量S中存放的字符串是否为空串。
若是空串,则返回1;否则,返回0。
• 5.Strclear(S) 若字符串S是存在的,则该操作将它清空。
• 12.Replace(S,T1,T2)
表示在字符串S中用T2替换TI的所有出现。例如:
S =“aabcdbca”,T1=“bc”,T2="bb",则执行Replace 后,S="aabbdbba"。
• 13.Strdestroy(S )
字符串销毁运算。若字符串S存在,执行 strdestroy运算后,S被销毁。
4.1.1串的基本概念
• 1.串
• 串(string)是零个或多个字符组成的有限序列,也可 以称为字符串。一般记为S=“a1a2a3…an”。其中 S是串名,双引号括起的字符序列是串值;将串值括 起来的双引号本身不属于串的一部分,它的作用是 避免串与常数或与标识符混淆。例“123”是数字 字符串,而123则是整型常数;“xl”是长度为2的字符 串,而xl通常作为某个对象(如变量、数组或函数等) 的同标的识机符 器来 和使 语用 言。版每本个对合ai(法1<字=i<符=(n即)是允一许个使字用符的,不字 符)有不同的规定。但是一般情况下,英文字符、数 字(0,1,2,…,9)和常用的标点符号以及空格符等都 是合法字符。
上述这些运算对串而言都是一些最基本的 操作,因此,在引进串变量的高级语言中,一般 都将上述操作作为基本运算符或内部函数或 过程提供,程序开发人员可以直接使用这些操 作来实现程序功能。当然不同语言所提供的 上述操作的种类和标识符可能有所不同。
4.2串的存储结构与运算
串本身是一种线性表,所以串的存储方法与线
相关文档
最新文档