串的順序儲存結構
阿新 • • 發佈:2018-11-07
SequenceString.h檔案
/************************************** 檔案位置:4 串\SequenceString 檔名稱及型別:SequenceString.h 實現功能:順序串的相關操作列表 ***************************************/ #ifndef SEQUENCESTRING_H #define SEQUENCESTRING_H #include"..\..\1 緒論\StartDefine\StartDefine.h" #define MAXSTRLEN 255//使用者可在255以內定義最大串長 typedef unsigned char SString[MAXSTRLEN+1];//順序儲存,0號單元存放串的長度 //生成一個其值等於chars的串T Status StrAssign(SString &T,const char &chars); //由串S複製得串T Status StrCopy(SString &T,SString S); //判斷串是否為空串,為空返回TRUE,否則返回FALSE Status StrEmpty(SString S); //比較兩個串的大小,若S大於T,則返回值大於0,小於返回小於0,否則返回等於0 int StrCompare(SString S,SString T); //返回串的長度 int StrLength(SString S); //將串清空為空串 void ClearString(SString &S); //用T返回S1和S2連線而成的新串 Status Concat(SString &T,SString S1,SString S2); //用Sub返回串S的第pos個字元起長度為len的子串 Status SubString(SString &Sub,SString S,int pos,int len); //若串S中存在和串T值相同的子串,則返回T在主串S中第pos個字元之後第一次出現的位置 int Index(SString S,SString T,int pos); //用V替換主串S中出現的所有與T相等的不重疊(????)的子串 Status Replace(SString &S,SString T,SString V); //在串S的第pos個元素之前插入串T Status StrInsert(SString &S,int pos,SString T); //從串中刪除第pos個元素起長度為len的子串 Status StrDelete(SString &S,int pos,int len); //串S被銷燬 void DestroyString(SString &S); //輸出字串 void StrPrint(SString S); #endif
SequenceString.cpp檔案
/************************************** 檔案位置:4 串\SequenceString 檔名稱及型別:SequenceString.cpp 實現功能:順序串的相關操作實現 ***************************************/ #ifndef SEQUENCESTRING_CPP #define SEQUENCESTRING_CPP #include"SequenceString.h" //生成一個其值等於chars的串T Status StrAssign(SString &T,char *chars){ int i,len; len=strlen(chars); if(len>MAXSTRLEN)//chars過長,超出範圍 return ERROR; else{ T[0]=len; for(i=1;i<=len;i++){ T[i]=chars[i-1]; } return OK; } } //由串S複製得串T Status StrCopy(SString &T,SString S){ for(int i=0;i<=S[0];i++){//從0迴圈到S[0],0號單元放的是字串長度 T[i]=S[i]; } } //判斷串是否為空串,為空返回TRUE,否則返回FALSE Status StrEmpty(SString S){ if(S[0]==0) return TRUE; else return ERROR; } //比較兩個串的大小,若S大於T,則返回值大於0,小於返回小於0,相等返回等於0 int StrCompare(SString S,SString T){//按照字典序比較,如果T是S的子串,返回長度差(串相等需要長度也相等) int i=1; while(i<=S[0]&&i<=T[0]){ if(S[i]==T[i]) i++; else{ return S[i]-T[i]; } } return S[0]-T[0]; } //返回串的長度 int StrLength(SString S){ return S[0]; } //將串清空為空串 void ClearString(SString &S){ S[0]=0; } //用T返回S1和S2連線而成的新串 Status Concat(SString &T,SString S1,SString S2){ for(int i=1;i<=S1[0];i++){//提前寫減少時間複雜度 T[i]=S1[i]; } if(S1[0]+S2[0]<=MAXSTRLEN){//未擷取 for(int i=1;i<=S2[0];i++){ T[S1[0]+i]=S2[i]; } T[0]=S1[0]+S2[0]; return OK; } else if(S1[0]<MAXSTRLEN){//截斷S2 for(int i=1;i<=S1[0]+MAXSTRLEN;i++){ T[S1[0]+i]=S2[i]; } T[0]=MAXSTRLEN; return ERROR; } else{//只剩下S1 return ERROR; } } //用Sub返回串S的第pos個字元起長度為len的子串 Status SubString(SString &Sub,SString S,int pos,int len){ if(pos<1||pos>S[0]||len<0||len>S[0]-pos+1)//保證第pos後的串長度大於len return ERROR; for(int i=1;i<=len;i++){ Sub[i]=S[pos+i-1]; } Sub[0]=len; return OK; } //若串S中存在和串T值相同的子串,則返回T在主串S中第pos個字元之後第一次出現的位置 int Index(SString S,SString T,int pos){//不依賴於其他串的匹配 int i=pos; SString sub; if(pos>0){ while(i<=S[0]-T[0]+1){ SubString(sub,S,i,T[0]); if(StrCompare(sub,T)!=0) ++i; else return i; } } return 0; } //用V替換主串S中出現的所有與T相等的不重疊(????)的子串 Status Replace(SString &S,SString T,SString V){ int i; i=Index(S,T,1);//尋找第一個匹配的位置 while(S[0]-T[0]+V[0]<=MAXSTRLEN&&i){//有匹配的字串且可以被完全替換 StrDelete(S,i,T[0]);//刪除T StrInsert(S,i,V);//插入V i+=V[0];//i切換到下一個位置 i=Index(S,T,i);//尋找下一個匹配的字串 } if(i==0) //S中的T已全部被替換 return OK; else return ERROR;//S中還有T,只是V插不進去了 } //在串S的第pos個元素之前插入串T Status StrInsert(SString &S,int pos,SString T){ if(pos<1||pos>S[0]+1||S[0]+T[0]>MAXSTRLEN) return ERROR; for(int i=S[0];i>=pos;i--){//先將第pos到第S[0]個元素向後移騰出空間 S[i+T[0]]=S[i]; } for(int i=pos,j=1;j<=T[0];j++,i++){ S[i]=T[j]; } S[0]+=T[0]; return OK; } //從串中刪除第pos個元素起長度為len的子串 Status StrDelete(SString &S,int pos,int len){ if(pos<1||pos+len-1>S[0]||len<0) return ERROR; for(int i=pos+len;i<=S[0];i++){ S[i-len]=S[i]; } S[0]-=len; return OK; } //串S被銷燬 void DestroyString(SString &S){ //順序串沒法銷燬 } void StrPrint(SString S){ for(int i=1;i<=S[0];i++){ printf("%c",S[i]); } } #endif
SequenceString-Test.cpp檔案
/************************************** 檔案位置:4 串\SequenceString 檔名稱及型別:SequenceString-Test.cpp 實現功能:順序串的相關操作測試 ***************************************/ #include"SequenceString.cpp" int main(){ char *chars="abcdefg"; SString T,S,TS,Sub; printf("函式StrAssign測試...\n將chars指向的字串賦值給T...\n"); StrAssign(T,chars); printf("此時的T為:"); StrPrint(T); printf("\n\n"); printf("函式StrEmpty測試...\n"); StrEmpty(T)?printf("T為空"):printf("T不空"); printf("\n\n"); printf("函式StrCopy測試...\n將T字串複製給S...\n"); StrCopy(S,T); printf("此時的S為:"); StrPrint(S); printf("\n\n"); printf("函式StrCompare測試...\n"); StrCompare(S,T)?printf("兩個字串不相等"):printf("兩個字串相等"); printf("\n\n"); printf("函式Strlength測試...\n"); printf("字串S的長度為%d\n",StrLength(S)); printf("\n\n"); printf("函式Concat測試...\n將字串S和T連線後成為TS:"); Concat(TS,S,T); StrPrint(TS); printf("\n\n"); printf("函式SubString測試...\n"); SubString(Sub,S,2,3); printf("字串Sub為:"); StrPrint(Sub); printf("\n\n"); printf("函式Index測試...\n"); printf("Sub串在S串的第%d個位置第一次出現\n",Index(S,Sub,1)); printf("\n\n"); printf("函式StrInsert測試...\n"); printf("在S串的第3個元素前插入T串後為:"); StrInsert(S,3,T); StrPrint(S); printf("\n\n"); printf("函式StrDelete測試...\n"); printf("刪除S串第3個元素開始長度為2的串後為:"); StrDelete(S,3,2); StrPrint(S); printf("\n\n"); return 0; }