1 第四章 串 串的定义 串的操作 数 据 结 构 之 串 2 4.1 串的定义 ?串:由零个或多个字符组成的有限序列, 记为S= “a 1 a 2 a 3 ……a n ”。 ?主串、子串、串名、串长; S=“How are you,everybody!” ?空串、空格串; ?字符在串中的位置、子串在串中的位置; ?两个串相等,当且仅当两个串值相等,即 长度,位置相等; 2 数 据 结 构 之 串 3 4.2 串的基本操作 ? StrAssign(&T,chars) ? StrCompare(S,T): S、T相等返回true,否则返 回faule; ? StrLength(S) : 求串中字符的个数; ? ConCat(S,T) : 将串T的值紧接着放在串S的末尾, 组成一个新串; ? SubString(Sub,S,start,length): 求S从start位置开 始,长度为length 的子串; 数 据 结 构 之 串 4 ? SetEmpty(&T) : 设置空串 ? StrCopy(S,T): 把T值赋给S; ? Index(S,T,pos): 求子串在主串中位置的定位函数; ? Replace(S,T,v): 以v替换所有在S中出现的和T相 等的串; ? StrInsert(S,Pos,T): 在串S的第Pos个字符之前插 入串T; ? StrDelete(S,Pos,len): 从串S中删除Pos个字符起 长度为len的子串; 3 数 据 结 构 之 串 5 4.3 串的表示和实现 ?定长顺序存储表示 ?紧缩格式:在一个存储单元中存放多个字符 ?非紧缩格式:一个存储单元中只存放一个字符, 所需存储单元个数即串的长度 例:如一个单元存放k个字符,长度为n,则此 串值占[n/k]个存储单元。 D T A : S A ADTA SWTR CUTU EFS 一个存储单元 数 据 结 构 之 串 6 ?动态分配串值的存储空间; ?动态串的类型定义: typedef struct{ char *ch ; int length; //串的长度 }HS; 4 数 据 结 构 之 串 7 ?串的链式存储 #define CHUNKSIZE 80 /*由用户定义的块长度*/ typedef struct Chunk { char ch[CHUNKSIZE]; /*字符串块*/ struct Chunk *next; /*指向下一个字符串块*/ }Chunk; /*结构名称*/ typedef struct { Chunk *head, *tail; /*指向头尾的指针*/ int curlen; /*串的当前长度*/ } LString; /*串名称*/ F A B C 1 ^ A B C D E F G H 1 # # # ^ F 数 据 结 构 之 串 8 ?串基本操作的实现 ?将串S1和串S2联接成新串 ?算法描述: ?给T分配存储空间,存储空间大小为S1和S2长度 之和。 ?将S1中的每一个字符拷贝到T中。 ?修改T的长度。 ?将S2中的所有字符拷贝到T剩余的存储空间中。 ?返回。 ?程序如下: 5 数 据 结 构 之 串 9 Status Concat(Hstring T, Hstring S1, Hstring S2){ int count; if(T.ch) free(T.ch); /*如果T.ch非空,则释放其存储空间*/ if(!(T.ch=(char *)malloc(S1.length+S2.length+1)*sizeof(char)))) /*分配空间*/ return OVERFLOW; /*若分配失败,则返回溢出信息*/ for(count=0;count<S1.length;count++) T.ch[count]=S1.ch[count]; /*将S1中字符拷贝到T中*/ T.length=S1.length+S2.length; /*修改长度*/ for(count=S1.length;count<T.length;count++) T.ch[count]=S2.ch[count- S1.length]; /*将S2中所有字符 拷贝到T中*/ T.ch[T.length] = ‘\0’; return OK; /*返回*/ } 数 据 结 构 之 串 10 ?求子串T在主串S中的位置 ?算法思想:从主串S的第一个字符 起和模式串(子串)的第一个字符 比较,相等则继续,否则从主串的 第二个字符起重新和模式比较,直 至比较完毕为止。 ?图示 S = “a b a b c a b c a c b a b” T = “a b c a c” 6 数 据 结 构 之 串 11 第一趟匹配:a b a b c a b c a c b a b a b c j=3 i=3 第二趟匹配:a b a b c a b c a c b a b a j=1 i=2 第三趟匹配:a b a b c a b c a c b a b a b c a c j=5 i=7 数 据 结 构 之 串 12 第四趟匹配:a b a b c a b c a c b a b a j=1 i=4 第五趟匹配:a b a b c a b c a c b a b a j=1 i=5 第六趟匹配:a b a b c a b c a c b a b a b c a c j=6 i=11 7 数 据 结 构 之 串 13 int Index(HS S , HS T , int pos) { k= i = pos-1 ; j=0; while(k<=S.length && j<=T.length){ if(S.ch[ k ]==T.ch[ j ]) {k++;j++;} else { i++; k=i ; j=0;} } if( j >T.length) return ( i+1 ); else return (0); } 数 据 结 构 之 串 14 ?模式匹配的KMP算法 请同学们参照演示程序和教材 中的相关内容进行钻研 8 数 据 结 构 之 串 15 串的 算法练习 1.完成动态串的基本操作,page 71; 2. Status StrInsert( HS &S , int pos , HS T){ ……. } 3. Status StrDelete(HS &S,int pos,int len,HS &T) { ……. } 数 据 结 构 之 串 16 ?本章重点 ?串的基本概念 ?串的基本操作 ?串的查找