练习:设s =?I AM A STUDENT?, t =?GOOD?,
q=?WORKER?。求:
StrLength(s) =StrLength(t) =
144
SubString(s, 8, 7)=SubString(t, 2, 1)=
Index(s, ?A?)=Index(s, t)=
?STUDENT??O?3
0 (s中没有t!)
Replace(s, ?STUDENT?,q)=’I AM A WORKER?
再问:Concat(SubString(s,6,2), Concat(t,SubString(s,7,8))) =?见本章自测题,或见严题集4.3 ①
4.2串的表示和实现
首先强调:串与线性表的运算有所不同,是以?串的整体?作为操作对象,例如查找某子串,在主串某位置上插入一个子串等。
串有三种机内表示方法:
?定长顺序存储表示顺序存储
——用一组地址连续的存储单元存储串值的字符序列
?堆分配存储表示——用一组地址连续的存储单元存储串值的字符序列,但存储空间是在程序执行过程中动态分配而得。——链式方式存储
链式
?串的块链存储表示存储
定长顺序存储特点:用一组连续的存储单元来存放串,直接使用定长的字符数组来定义,数组的上界预先给出,
故称为静态存储分配。例如:
#define Maxstrlen 255 //用户可用的最大串长typedef unsigned char SString[ Maxstrlen+1 ];
SString s; //s是一个可容纳255个字符的顺序串。
注:
?一般用SString[0]来存放串长信息;
?C语言约定在串尾加结束符‘\\0?,以利操作加速,但不计入串长;?若字符串超过Maxstrlen 则自动截断(因为静态数组存不进去)。
实现方式:参见教材P73编程两例,两串连接和求子串讨论:想存放超长字符串怎么办?——静态数组有缺陷!
改用动态分配的一维数组——“堆”!
例:用顺序存储方式实现求子串函数SubString(&Sub, S, pos, len) 将串S中从第pos个字符开始长度为len的字符序列复制到串Sub中(注:串Sub的预留长度与S一样)
Status SubString(SString &sub, SString S, int pos, int len ){ if(pos<1 || pos>S[0] || len<0 || len>S[0]-pos+1)return ERROR; //pos不合法则告警Sub[1……len]=S[pos……pos+len-1];Sub[0]=len; return OK;}
s =? a1, a2, …….. , an?
poslenn=串长堆分配存储特点:仍用一组连续的存储单元来存放串,
但存储空间是在程序执行过程中动态分配而得。
思路:利用malloc函数合理预设串长空间。
特点:若在操作中串值改变,还可以利用realloc函数按新
串长度增加(堆砌)空间。约定:所有按堆存储的串,其关键信息放置在:
Typedef struct {
char *ch; // 若非空串,按串长分配空间; 否则ch = NULLint length; //串长度
}HString
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库数据结构课件- 河南大学精品课程网 - 图文 -(2)在线全文阅读。
相关推荐: