作业辅导 发表于 2021-3-19 11:30:50

西交《数据结构》faq(四)

西交《数据结构》FAQ(四)
第四章 串
1、串的ADT定义及基本操作
ADT String{
数据对象D={ai I ai∈字符集,i=1,2,...,n,n≥0)
数据关系R={<ai.1,ai>I ai.1,ai∈D,i=2,...,n)
基本操作13个P71
} ADT String
基本操作13个
串赋值StrAssign(&T,chars)
串复制StrCopy(&T,S)
判空串StrEmpty(S)
串比较StrCompare(S,T)
求串长StrLength(S)
串清空ClearString(&S)
串联结Concat(&T,S1,S2)
取子串StrString
串匹配Index(S,T,pos)
串置换Replace (&S,pos,T)
串插入StrInsert(&S,pos,T)
删子串StrDelete(&S,pos,len)
串销毁DesroySring(&S)
2、定位函数 Index(S, T, pos )的基本思想及实现。
算法思想逐字符逐位比较S串和T串,不相等时向后移位继续比较,直至匹配,输出i,或到s尾终止。
intIndex (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 ;
         elsereturn i ;
       }∥while
    }∥if
   return 0 ;
} ∥index
3、串的定长顺序存储表示
用定长数组。长出截断!(例,文件/人名8位)
定义ADT存储表示maxstrlen=256   char0位放串长
#define MAXSTRLEN   255
typedefunsigned char SString;
4、串的连接 Concat( &T, S1, S2 )
几种连接情况的讨论    s1 + s2 ( T
① s1.len + s2.len≤maxstrlen
   s1, s2全部拼入T
② s1.len< maxstrlen    s1.len + s2.len > maxstrlen
   s1全部, s2 部分拼入T
③ s1.len= maxstrlen   T=S1
算法思想:分情况拼接串。 超长截断
算法 4.2P73
5、求取子串 SubString( &Sub, S, pos, len )
*pos、len的合理性
status SubString (SString &sub,SString S,int pos,int len) {
   if ( pos<1‖pos>S ‖len<0‖len>S-pos+1)
      return ERROR ;
   sub=S ;
   sub=len ;   return OK ;
}∥SubString
6、串的堆分配存储表示
用一组连续的存储单元存放。
typedefstruct {
char*ch ;
int    length ;
}Hstring
通常,C语言中提供的串类型就是以这种存储方式实现的。系统利用函数malloc( )和free( )进行串值空间的动态管理,为每一个新产生的串分配一个存储区,称串值共享的存储空间为“堆”。C语言中的串以一个空字符为结束符,串长是一个隐含值。
这类串操作的实现算法为:先为新生成的串分配一个存储空间,然后进行串值的复制。
7、串插入 StrInsert( HString &S, int pos, Hstring T )算法
status StrInsert (HString &S, int pos,HString T) {
   if ( pos<1‖pos>S.length)    return ERROR ;
   if (T.length) {
       if(!(S.ch=(char*)realloc(S.ch,(S.length+T.length)*sizeof(char))))
         exit (OVERFLOW) ;
       for ( i =S.length-1; i >=pos-1 ; --i )
         S.ch[ i +T.length]=S.ch[ i ] ;
       S.ch=T.ch;
       S.length+=T.length ;
      }
    return OK ;
}∥StrInsert   
8、堆上的其它6个操作
串复制 StrAssign ( HString&T,char*chars );原T如存在,释放,另存另分。
求串长 Strength ( HStringS )
串比较 StrCompare ( HStringS,HStringT )
串清空 ClearString ( HString&S )
串联接 Concat ( HString&T,HStringS1,HStringS2 )原T如存在,释放,另分,拼S1, S2存入T的store区
取子串 SubString ( HStringS,intpos,intlen )
例:汉字:字码 字模 字库 字号 字体……激光打印一字一K
五笔/全拼16×1632字节
9、串赋值 StrAssingn( HString &T, char*chars )
status StrAssingn( HString &T,char*chars ) {
   if( T.ch)   free ( T.ch ) ;
   for ( i =0, c=chars ; c ; ++ i , ++c ) ;    //求长度
   if( ! i ){ T.ch=NULL ; T.length=0 ;}
   else{
      if( ! (T.ch=(char*)malloc( i *sizeof(char))))
            exit (OVERFLOW) ;
      T.ch[ 0.. i -1]=chars ;
   }
   T.length= i ;
   return OK ;
}∥StrInsert本内容由易百网整理发布
网址 www.openhelp100.com
QQ 515224986
页: [1]
查看完整版本: 西交《数据结构》faq(四)