5.g。串的长顺序储喜暴 定长顺序存储特点:用一组连续的存储单元来存放串,直接 使用定长的字符数组来定义,数组的上界预先给出,故称为静 态存储分配。 例如:# define maxstrlen255用户可用的最大串长 typedef unsigned char SString Maxstrlen+1: SString S;∥s是一个可容纳255个字符的顺序串。 注 一般用 SString[来存放串长信息; 吣语言约定在串尾加结束符0,以利操作加速,但不计入串长; 若字符串超过 Maxstrlen则自动截断(因为静态数组存不进去)。 实现方式:两串连接和求子串 讨论:想存放长字符串怎么办?—静态数组有缺陷! 改用动态分配的一维数组“堆”!
定长顺序存储特点:用一组连续的存储单元来存放串,直接 使用定长的字符数组来定义,数组的上界预先给出,故称为静 态存储分配。 例如:#define Maxstrlen 255 //用户可用的最大串长 typedef unsigned char SString[Maxstrlen+1]; SString s; //s是一个可容纳255个字符的顺序串。 注: •一般用SString[0]来存放串长信息; •C语言约定在串尾加结束符 ‘ \0’,以利操作加速,但不计入串长; •若字符串超过Maxstrlen 则自动截断(因为静态数组存不 进去)。 讨论:想存放超长字符串怎么办?——静态数组有缺陷! 实现方式:两串连接和求子串 改用动态分配的一维数组—— “堆”! 5.2.1 串的定长顺序存储表示
# define MaXstrlen255/串长度最大为255 char sstring MmaXstrleni void Concat sq( char S1[] char S2[], char TDt 0;k=0; whle(s1="0)Tk+]=S1+;复制串S1 j=0; while (s20 ls T]=v0 将串S中从第pos个字符开始长度为ln的字符序列复 }∥ Concat 制到串Sub中(注:Sub的预留长度与S一样) void SubString_Sq( char Subt, char S, int pos, int len)( ∥用Sub返回串s的第pos个字符起长度为len的子串。 ∥其中,0≤pos< StrEng曲(S)且0 <lensstrLength(S}pos。 sen= StrEngth_sq(S);求取顺序存储表示的字符串S的串长度 if(pos<0|los>sen|ln<|len>slen-pos) ERROR("参数不合法; for(j=0; j< len; j++)Sub[j]=s[ pos +jl Sub (len]=10", }∥ SubString
void Concat_Sq( char S1[ ], char S2[ ], char T[ ]) { j=0; k=0; while ( S1[j] != '\0' ) T[k++] = S1[j++]; //复制串S1 j = 0; while ( S2[j] != '\0' ) T[k++] = S2[j++]; //接着复制串S2 T[k] = '\0'; } // Concat #define MAXSTRLEN 255 //串长度最大为255 char SString[MAXSTRLEN]; void SubString_Sq( char Sub[ ], char S, int pos, int len) { // 用Sub返回串S的第pos个字符起长度为len的子串。 // 其中,0≤pos<StrLength(S) 且0≤len≤StrLength(S)-pos。 slen=StrLength_Sq(S); //求取顺序存储表示的字符串S的串长度 if ( pos<0||pos>slen-1||len<0||len>slen-pos ) ERROR( "参数不合法"); for ( j = 0; j < len; j++ ) Sub[ j ] = S[ pos + j ]; Sub[len] = '\0'; } // SubString 将串S中从第pos个字符开始长度为len的字符序列复 制到串Sub中(注:串Sub的预留长度与S一样)
5。3串的雄分亭储豪歌 typedef struct t char *ch;∥若是非空串则按串实用长度分配存储区否则ch为NUL int length;∥串长度 3 HString; 通常,C/C++语言中提供的串类型就是以这种存储方式实现的。 系统利用函数 malloc()/new和free( delete进行串值空间的动态 管理,为每一个新产生的串分配一个存储区,称串值共享的存储 空间为堆 C语言中的串以一个空字符为结束符,串长是一个隐含值。 这类串操作实现的算法为:先为新生成的串分配一个存储空 间,然后进行串值的复制
typedef struct { char *ch; // 若是非空串,则按串实用长度分配存储区,否则ch 为NULL int length; // 串长度 } HString; 5.2.2 串的堆分配存储表示 通常,C/C++语言中提供的串类型就是以这种存储方式实现的。 系统利用函数malloc( ) /new和 free( )/delete 进行串值空间的动态 管理,为每一个新产生的串分配一个存储区,称串值共享的存储 空间为堆。 C语言中的串以一个空字符为结束符,串长是一个隐含值。 这类串操作实现的算法为: 先为新生成的串分配一个存储空 间,然后进行串值的复制
void Strlnsert_ HSq (char"s, int pos, charT 【∥ <possStrLength+1。在串的第pos个字符之前插入串T slenaStrLength_HSq(s); tlen=StrEngth_HSq (; char s1sen+];∥S1作为辅助串空间用于暂存S i(pos1los>slen+1)EROR"插入位置不合法; if ( tlen>0)( =0 whle((S1=S="0)种+;∥暂存串S s= new char(slen+tln+1];∥为S重新分配空间 for (i=0, k0; i<pos-1; i++)s[k++]=S1(: j=0 whle(T="0)Sk+]=T++∥插入T whle(S1=0)Sk+=S1++串 sk]=v0;∥置串S的结束标志
void StrInsert_ HSq (char *S, int pos, char *T) { //1≤pos≤StrLength(S)+1。在串S的第pos个字符之前插入串T slen=StrLength_HSq (S); tlen=StrLength_HSq (T); char S1[slen +1] ; // S1作为辅助串空间用于暂存S if ( pos<1 || pos>slen+1 ) ERROR(" 插入位置不合法"); if ( tlen>0 ) { i=0; while ( (S1[i]=S[i])!='\0' ) i++; // 暂存串S S = new char[slen+tlen+1]; // 为S重新分配空间 for ( i=0, k=0; i<pos-1; i++ ) S[k++] = S1[i]; j = 0; while ( T[j]!= '\0' ) S[k++] = T[j++]; // 插入T while ( S1[i]!= '\0‘ ) S[k++] = S1[i++]; 串 S[k] = '\0'; // 置串S的结束标志 } }
饥:雄实现串入绿 void Strlnsert( char*S, int pos, char *T)i char *S1*Sub slen= strlen (s); tlen=strlen(T) i(pos<1‖lpos>slen+1)EROR(“插入位置不合法”) if tlen>0)t S1=strdup(s) S= new char[slen+tlen +11 Sub= s1+pos strncpy(S,S1,pos1方 s[pos1]=10 strcat(S,T: strcat(S, Sub )
void StrInsert ( char *S, int pos, char *T ) { char *S1, *Sub; slen = strlen(S); tlen = strlen(T); if ( pos<1 || pos>slen+1 ) ERROR( “ 插入位置不合法” ); if ( tlen>0 ) { S1 = strdup(S); S = new char[slen+tlen+1]; Sub = s1+pos-1; strncpy( S, S1, pos-1 ); s[pos-1] = ‘\0]; strcat( S, T ); strcat( S, Sub ); } } 例:用堆实现串插入操作