SString

来源:互联网 发布:iphone信息铃声软件 编辑:程序博客网 时间:2024/05/22 03:33
 
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的串Tint 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复制得到串Tif (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,否则返回FALSEif (S == NULL)return ERROR;if (S[0] == 0)return TRUE;elsereturn FALSE;}int StrCompare(SString S, SString T) {//串S和T存在,若S>T返回值>0;若S=T,则返回值=0;若S<T,则返回值<0if (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个字符之后第一次出现的位置,否则返回0int 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++;elsereturn i;}}return 0;}int StrInsert(SString &S, int pos, SString T) {//串S,T存在,1《pos《StrLength(S)+ 1//在串S的第pos个字符之前插入串Tif ((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");}

原创粉丝点击