数据结构课件8

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

return S[0]-T[0];
}// StrCompare
21
(7) 串连接
S1[0] S1 S2 S2[0]
T T[0] MAXSTRLEN
T[1..S1[0]]=S1[1..S1[0]];
T[S[0]+1..S1[0]+S2[0]]=S2[1..S2[0]];
(a) S1[0]+S2[0] MAXSTRLEN
pos
S
MAXSTRLEN for(i=MAXSTRLEN;i>=pos+T[0];i--)
T
S[i]=S[i-T[0]]
(b) S [0]<MAXSTRLEN而 T[0] S [0]+T[0]>MAXSTRLEN
31
Status StrInsert(SString &S,int pos,SString T) {
T[1..S1[0]]=S1[1..S1[0]];
T[S[0]+1..S1[0]+S2[0]]=S2[1..S2[0]]; T[0]=S1[0]+S2[0]; uncut=TRUE; }
else if(S1[0]<MAXSTRLEN){
T[1..S1[0]]=S1[1..S1[0]];
//截断
T[S[0]+1..MAXSTRLEN]=S2[1..MAXSTRLEN-S1[0]]; T[0]=MAXSTRLEN;uncut=FALSE; } else{ uncut=FALSE; } return uncut; }//Concat
第四章 串

串类型的定义
串的表示和实现 串的模式匹配算法
1
4.1 串类型定义
串(String)----零个或多个字符组成的有限序列.
s =‘ a1a2 Lan ’
串名 串值
串长
n
空串
n=0
2
4.1 串类型定义
a=‘BEI’, b=‘JING’
c=‘BEIJING’
子串 主串
d=‘BEI JING’
5
基本操作:
(6) StrCopy(&T,S) (7) StrEmpty(S) (8) ClearString (&S) (9) Index(S,T,pos) (11) Replace(&S,T,V) (12) StrInsert(&S,pos,T) (12) StrDelete(&S,pos,len) (13) DestroyString(&S) }ADT String //串拷贝 //串判空 //清空串 //求子串的位置 //串替换 //子串插入 //子串删除 //串销毁
i=pos; j=1; while(i<=S[0] && j<=T[0])
if(S[i]==T[j]) {++i; ++j; } // 继续比较后继字符
else{ i=i-j+2; j=1; } //指针后退重新开始匹配 if(j>T[0]) return i-T[0]; else return 0; } else return 0; }
pos
MAXSTRLEN
S
S[0]+T[0] for(i=S[0];i>=pos;i--) S[i+T[0]]=S[i]; T[0]
T
(a) S[0]+T[0]MAXSTRLEN
30
(10)串插入
Status StrInsert(SString S,int pos,SString T)
for(i=pos;i<pos+T[0];i++) S[i]=T[i-pos+1];
23
(7) 串连接
S1[0] S1 S2 S2[0]
T T[0] MAXSTRLEN S2被全部截断
T[1..MAXSTRLEN]=S1[1..MAXSTRLEN];
(c) S1[0]=<MAXSTRLEN
24
Status Concat(SString &T,SString S1,SString S2){ //用T返回由S1和S2联接而成的新串.若未截断,则返回TRUE,否则返回FALSE if(S1[0]+S2[0]<=MAXSTRLEN){ //未截断
for(i=1;i<=T[0];i++)
T[i]=*(chars+i-1); return OK; } } //StrAssign
19
(5) 串拷贝
Status StrCopy(SString T,SString S)
{ // 由串S复制得串T
for(i=0;i<=S[0];i++) T[i]=S[i];
else { // 部分插入
for(i=MAXSTRLEN;i>=pos+T[0];i--) for(i=pos;i<pos+T[0];i++) S[i]=S[i-T[0]]; S[i]=T[i-pos+1];
S[0]=MAXSTRLEN;
return FALSE; }
}
32
(11)串删除
Status StrDelete(HString &S,int pos,int len){ pos
22
(7) 串连接
S1[0] S1 S2 S2[0]
T
{
T[1..S1[0]]=S1[1..S1[0]]; MAXSTRLEN
T[0]
S2中被截断 的字符序列
T[S[0]+1..MAXSTRLEN]
=S2[1..MAXSTRLEN-S1[0]];
(b) S1[0] < MAXSTRLEN 而 S1[0]+S2[0] > MAXSTRLEN
串相等 串比较 空格串
字符位置
子串位置
3
串的抽象数据类型
ADT String {
数据对象:
D = {ai | ai CharacterS , i = 1,2,L, n, n 0} et
数据关系:
R1 = { ai 1, ai | ai 1, ai D, i = 1,2,L, n}
if(pos<1||pos>S[0]+1)
return ERROR;
if(S[0]+T[0]<=MAXSTRLEN) { // 完全插入 for(i=S[0];i>=pos;i--) S[i+T[0]]=S[i]; for(i=pos;i<pos+T[0];i++) S[i]=T[i-pos+1]; S[0]=S[0]+T[0]; return TRUE; }
26
Status SubString(SString &Sub,SString S,int pos,int len){
//用Sub串返回串S的第pos个字符起长度为len的子串 if(pos<1 || pos>S[0] || len<0 || pos+len-1>S[0])
return ERROR;
4
基本操作:

(1) StrAssign (&T,chars)
//串赋值


(2) StrCompare (S,T)
(3) StrLength (S)
//串比较
//求串长

(4) Concat(&T,S1,S2)
//串联接
//求子串
(5) SubString(&Sub,S,pos,len)
串的最小操作子集
return OK;
} //ClearString
16
(2)求串长
int StrLength(SString S)
{ // 返回串的元素个数
return S[0]; } // StrLength
17
(3) 串判空
Status StrEmpty(SString S) { // 若S为空串,则返回TRUE,否则返回FALSE if(S[0]==0) return TRUE; else return FALSE; } //StrEmpty
}//while
}//if return 0; // S中不存在与T相等的子串
}//Index
12
4.2 串的表示和实现
定长顺序表示
堆分配存储表示 串的块链存储表示
13
4.2.1 定长顺序存储表示
#define MAXSTRLEN 255
typedef unsigned char SString[MAXSTRLEN+1]; //0号单元存放串长
return OK;
} //StrCopy
20
(6)串比较
int StrCompare(SString S,SString T) { // 初始条件: 串S和T存在 // 操作结果: 若S>T,则返回值>0;若S=T,则返回值=0;若S<T,则返回值<0 for(i=1;i<=S[0]&&i<=T[0];++i) if(S[i]!=T[i]) return S[i]-T[i];
28
(10)串插入
Status StrInsert(SString S,int pos,SString T)
pos
S
S[0]
(pos>=1) && (pos<S[0]+1)
TFra Baidu bibliotek
T[0]
29
(10)串插入
Status StrInsert(SString S,int pos,SString T)
for(i=pos;i<pos+T[0];i++) S[i]=T[i-pos+1];
for(i=pos+len;i<=S[0];i++)
S[i-len]=S[i]; S[0]-=len; return OK; }
6
例:Index操作的实现
int Index(String S, String T, int pos){
pos
S
n
T
m
7
例:Index操作的实现
int Index(String S, String T, int pos){
pos
Sub m
S
n
i=pos
T
m
8
例:Index操作的实现
int Index(String S, String T, int pos){
14
4.2.1 定长顺序存储表示
#define MAXSTRLEN 255
typedef unsigned char SString[MAXSTRLEN+1]; //0号单元存放串长 SString T;
T[0]
MAXSTRLEN+1
15
(1) 清空串
Status ClearString(SString S) { // 初始条件:串S存在。操作结果:将S清为空串 S[0]=0; // 令串长为零
25
//截断(仅取S1)
T[0..MAXSTRLEN]=S1[1..MAXSTRLEN];
(8) 求子串
Status SubString(SString &Sub,SString S,int pos,int len){
Sub[0] Sub S[0]
len S pos
pos+len-1
Sub[1..len]=S[pos..pos+len-1];
S
n
i=n-m+1
pos<=i<n-m+1
T
m
11
例:Index操作的实现
int Index(String S, String T, int pos){
if(pos>0){ n=StrLength(S); m=StrLength(T); i=pos; while(i<=n-m+1){ SubString(sub,S,i,m); if(StrCompare(sub,T)!=0) ++i; else return i; //返回子串在主串中的位置
18
(4) 串赋值
Status StrAssign(SString T,char *chars)
{ // 生成一个其值等于chars的串T
if(strlen(chars)>MAXSTRLEN) return ERROR;
else
{ T[0]=strlen(chars);
//求chars的长度i for(i=0,c=chars; c; ++i,++c);
Sub[1..len]=S[pos..pos+len-1]; Sub[0]=len; return OK; }//SubString
len
S[0]
S
pos
Sub
pos+len-1
27
(9)求子串位置
int Index(SString S,SString T,int pos){
if(1<=pos&&pos<=S[0]){
S
S[0] pos+len-1
for(i=pos+len;i<=S[0];i++)
S[i-len]=S[i];
33
(11)串删除
Status StrDelete(SString S,int pos,int len)
{ //从串S中删除第pos个字符起长度为len的子串
if(pos<1||pos+len-1>S[0] || len<0) return ERROR;
pos
Sub m
S
n
i=pos+1
T
m
9
例:Index操作的实现
int Index(String S, String T, int pos){
pos
Sub m
S
n
i=pos+2
T
m
10
例:Index操作的实现
int Index(String S, String T, int pos){
pos
Sub m
相关文档
最新文档