串的定長順序儲存結構:實現串的基本操作Replace(&S,T,V)
阿新 • • 發佈:2019-02-12
編寫演算法,實現串的基本操作Replace(&S,T,V)。要求採用以下所定義的定長順序儲存表示,但不允許呼叫串的基本操作。
定長順序串SString的型別定義:
定長順序串SString的型別定義:
typedef unsigned char SString[MAXSTRLEN+1];
/* s[0] is the string's length */
實現函式如下:
Status Replace(SString& s, SString t, SString v) /* 用串v替換串s中所有和串t匹配的子串。 */ /* 若有與t匹配的子串被替換,則返回TRUE;*/ /* 否則返回FALSE */ { int i,j,k,b,p,pos,flag; i = 1; flag = 0; k = t[0] - v[0]; //串t與串v的長度差 while(i <= s[0]-t[0]+1){ j = 1; pos = i; //記錄當前模式串的位置 while(j <= t[0]){ if(s[pos] == t[j]){//模式串匹配 ++j; ++pos; } else break; } if(j > t[0]){ //模式串匹配成功,進行替換操作 if(k == 0){ //串t與串v的長度相等 for(j = 1,p = i;j <= v[0];++p,++j){ s[p] = v[j]; } } if(k > 0){//串t的長度大於串v的長度 for(j = 1,p = i;j <= v[0];++p,++j){ s[p] = v[j]; } for(p = pos;p <= s[0];++p){//被替換子串後的元素往前移 s[p-k]=s[p]; } s[0] = s[0] - k;//當前主串長度改變 } if(k < 0){//串t的長度小於串v的長度 for(p = s[0]; p >= i;--p){ //被替換子串後的元素往後移 s[p-k] =s[p]; } for(j = 1,p = i;j <= v[0];++p,++j){ s[p] = v[j]; } s[0] = s[0] - k;//當前主串長度改變 } flag = 1; //匹配成功,標記為1 } else ++i; //模式串匹配不成功,模式串向後移 } if(flag) return TRUE; else return FALSE; }