SString

 
using namespace std;

#include <iostream>

#define OK 1
#define ERROR -1
#define TRUE 1
#define FALSE -1
#define MAXSTRLEN 255

/************************************************************************/
/*串的定長順序存儲表示	                                                  */
/*Went 2011-11-4 10:19											  */
/************************************************************************/
typedef unsigned char SString[MAXSTRLEN + 1];			//0號單元存放串的長度

int StrAssign(SString &T, const char *chars) {
	//chars是字符串常量,生成一個其值等於chars的串T
	int len, uncut;
	int i;
	len = strlen(chars);
	if (len > MAXSTRLEN) {
		T[0] = MAXSTRLEN;
		uncut = FALSE;
	}
	else {
		T[0] = len;
		uncut = TRUE;
	}
	for(i = 1; i <= T[0]; i++) {
		T[i] = chars[i - 1];
	}
	return uncut;
}

int StrCopy(SString &T, SString S) {
	//串S存在,由S複製得到串T
	if (S == NULL)
		return ERROR;
	for(int i = 0; i <= S[0]; i++)
		T[i] = S[i];
	return OK;
}

int StrEmpty(SString S) {
	//串S存在,若S爲空返回TRUE,否則返回FALSE
	if (S == NULL)
		return ERROR;
	if (S[0] == 0)
		return TRUE;
	else
		return FALSE;
}

int StrCompare(SString S, SString T) {
	//串S和T存在,若S>T返回值>0;若S=T,則返回值=0;若S<T,則返回值<0
	if (S && T == NULL)
		return ERROR;
	for(int i = 1; i <= S[0] && i <= T[0]; i++) {
		if (S[i] != T[i])
			return S[i] - T[i];
	}
	return S[0] - T[0];
}

int StrLength(SString S) {
	//串S存在,返回S的元素個數
	if (S == NULL)
		return ERROR;
	return S[0];
}

int ClearString(SString &S) {
	//串S存在,將S清爲空串
	if (S == NULL) 
		return ERROR;
	S[0] = 0;
	return OK;
}

int Concat(SString &T, SString S1, SString S2) {
	//串S1和S2存在,用T返回由S1和S2連接而成的新串
	int i, j;
	int uncut;
	if (S1 && S2 == NULL)
		return ERROR;
	if (S1[0] + S2[0] <= MAXSTRLEN) {
		for (i = 1; i <= S1[0]; i++)
			T[i] = S1[i];
		for (i = S1[0] + 1, j = 1; i <= S1[0] + S2[0], j <= S2[0]; i++, j++)
			T[i] = S2[j];
		T[0] = S1[0] + S2[0];
		uncut = TRUE;
	}
	else if (S1[0] < MAXSTRLEN) {
		for(i = 1; i <= S1[0]; i++)
			T[i] = S1[i];
		for(i = S1[0] + 1, j = 1; i <= MAXSTRLEN, j <= MAXSTRLEN - S1[0]; i++, j++) 
			T[i] = S2[j];
		T[0] = MAXSTRLEN;
		uncut = FALSE;
	}
	else {
		for(i = 0; i <= MAXSTRLEN; i++)
			T[i] = S1[i];
		uncut = FALSE;
	}
	return uncut;
}

int SubString(SString &Sub, SString S, int pos, int len) {
	//串S存在,1《pos《StrLength(S)且0《len《StrLength(S)-pos+1
	//用Sub返回串S的第pos個字符起長度爲len的子串
	if (pos < 1 || pos > S[0] || len < 0 || len > S[0] - pos + 1)
		return ERROR;
	int i, j;
	for(i = 1, j = pos; i <= len, j <= pos + len -1; i++, j++)
		Sub[i] = S[j];
	Sub[0] = len;
	return OK;
}

int Index(SString S, SString T, int pos) {
	//串S和T存在,T是非空串,1《pos《StrLength(S)
	//若主串S中存在和串T值相同的子串,則返回它在珠串S中第pos個字符之後第一次出現的位置,否則返回0
	int n, m, i;
	if (pos > 0) {
		n = StrLength(S);
		m = StrLength(T);
		i = pos;
		SString sub;
		while(i <= n - m + 1) {
			SubString(sub, S, i, m);
			if (StrCompare(sub, T) != 0)
				i++;
			else
				return i;
		}
	}
	return 0;
}

int StrInsert(SString &S, int pos, SString T) {
	//串S,T存在,1《pos《StrLength(S)+ 1
	//在串S的第pos個字符之前插入串T
	if ((S && T == NULL) || (pos < 1) || (pos > S[0] + 1))
		return ERROR;
	int uncut;
	int i;
	if (S[0] + T[0] <= MAXSTRLEN) {
		for(i = S[0]; i >= pos; i--)
			S[i + T[0]] = S[i];
		for(i = pos; i < pos + T[0]; i++)
			S[i] = T[i - pos + 1];
		S[0] += T[0];
		uncut = TRUE;
	}
	else {
		for(i = MAXSTRLEN; i >= pos; i--)
			S[i] = S[i - T[0]];
		for(i = pos; i < pos + T[0]; i++)
			S[i] = T[i - pos + 1];
		S[0] = MAXSTRLEN;
		uncut = FALSE;
	}
}

int StrDelete(SString &S, int pos, int len) {
	//串S存在,1《pos《StrLength(S) - len + 1
	//從串S中刪除第pos個字符起長度爲len的子串
	if ((S == NULL) || (pos < 1) || (pos > S[0] - len + 1) || (len < 0))
		return ERROR;
	int i;
	for(i = pos; i <= pos + len; i++)
		S[i] = S[i + len];
	S[0] -= len;
	return OK;
}

int DestroyString (SString &S) {
	//定長分配的存儲空間無法銷燬
	return ERROR;
}

int Replace(SString &S, SString T, SString V) {
	//串S,T,V存在。T是非空串
	//用V替換主串S中出現在所有與T相等的不重疊的子串
	int i = 1;
	if (StrEmpty(T))
		return ERROR;
	while(i) {
		i = Index(S, T, i);
		if (i) {
			StrDelete(S, i, T[0]);
			StrInsert(S, i, V);
			i += V[0];
		}
	}
	return OK;
}

int main() {
	int uncut;
	SString s1, s2, t, t2, v, sub;
	int i;
	char *chars = "Hello World!\n";
	char *chars2 = "Data Structure!\n";
	uncut = StrAssign(s1, chars);
	StrAssign(s2, chars2);
	for(i = 1; i <= s1[0]; i++) 
		cout << s1[i];
	StrCopy(t, s1);
	StrInsert(t, 1, s2);
	cout << StrLength(t) << endl;
	for(i = 1; i <= t[0]; i++) 
		cout << t[i];
	cout << StrCompare(s1, t) << endl;
	Concat(t2, s1, s2);
	for(i = 1; i <= t2[0]; i++) 
		cout << t2[i];
	SubString(sub, t, 2, 4);
	for(i = 1; i <= sub[0]; i++) 
		cout << sub[i];
	system("pause");
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章