1. 程式人生 > >串的順序儲存結構

串的順序儲存結構

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;
}