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");
}
SString
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.