定长顺序存储的串的表示和实现

串的定长顺序存储结构

SString[MAX_STR_LEN + 1];//0号单元存放串的长度

串采用定长顺序存储结构的12个基本操作

#define DestroyString ClearString//DestroyString()和ClearString()作用相同#define InitString ClearSting//InitString()和ClearSting()作用相同Status StrAssign(SString T, char *chars){//生成一个其值等于chars的串Tint i;if (strlen(chars) > MAX_STR_LEN)//chars的长度大于最大串长return ERROR;else{T[0] = strlen(chars);//0号单元存放串的长度for (i = 1; i < T[0]; i++)//从1号单元起复制串的内容T[i] = *(chars + i – 1);return OK;}}void StrCopy(SString T, SString S){//由串S复制得串Tint i;for (i = 0; i < S[0]; i++)T[i] = S[i];}Status StrEmpty(SString S){//若S为空串,则返回TRUE,,否则返回FALSEif (S[0] == 0)return TRUE;;}int StrCompare(SString S, SString T){//若S>T,则返回值>0;若S=T,则返回值=0;若S<T,则返回值<0int i;for (i = 1; i <=S[0] && i <= T[0]; ++i){if (S[i] != T[i])return S[i] – T[i];}return S[0];}int StrLength(SString S){return S[0];}void ClearString(SString S){S[0] = 0;}Status Concat(SString T, SString S1, SString S2){//用T返回S1和S2连接而成的新串。若未截断,则返回TRUE;否则返回FALSEint i;if (S1[0] + S2[0] <= MAX_STR_LEN){//未截断for (i = 1; i <= S1[0]; i++)T[i] = S1[i];for (i = 1; i <= S2[0]; i++)T[S1[0] + i] = S2[i];T[0] = S1[0] + S2[0];return TRUE;}else//截断S2{for (i = 1; i <= S1[0]; i++)T[i] = S1[i];for (i = 1; i <= MAX_STR_LEN – S1[0]; i++)//到串长为止T[S1[0] + i] = S2[i];T[0] = MAX_STR_LEN;return FALSE;}}Status SubString(SString Sub, SString S, int pos, int len){//用Sub返回串S的自第pos个字符起长度为len的子串int i;if (pos<1 || pos > S[0] || len < 0 || len > S[0] – pos + 1)//pos和len的值超出范围return ERROR;for (i = 1; i <= len; i++)Sub[i] = S[pos + i – 1];Sub[0] = len;return OK;}int Index1(SString S, SString T, int pos){//返回子串T在主串S中第pos个字符之后的位置,若不存在,则函数值为0int i, j;if (1 <= pos && pos <= S[0]){//pos的范围合适i = pos;//从主串S的第pos个字符开始和子串T的第1个字符比较j = 1;while (i <= S[0] && j <= T[0])if (S[i] == T[j]){//当前两个字符相等++i;//继续比较后继字符++j;}else//当前两个字符不相等{i = i – j + 2;//两指针后退重新开始匹配j = 1;}if (j > T[0])//主串S中存在子串Treturn i – T[0];;};}Status StrInsert(SString S, int pos, SString T){//在串S的第pos个字符之前插入串T。完全插入返回TRUE,部分插入返回FALSEint i;if (pos < 1 || pos > S[0] + 1)//pos超出范围return ERROR;if (S[0] + T[0] <= MAX_STR_LEN){//完全插入for (i = S[0]; i >= pos; i–)//移动串S中位于pos之后的字符S[i + T[0]] = S[i];//串S向后移串T的长度,为插入串T准备空间for (i = pos; i < pos + T[0]; i++)//在串S中插入串TS[i] = T[i – pos + 1];S[;//完全插入的标记}else//部分插入{for (i = MAX_STR_LEN; i >= pos + T[0]; i–)//移动串S中位于pos之后且移后仍在串内的字符S[i] = S[i – T[0]];for (i = pos; i < pos + T[0] && i <= MAX_STR_LEN; i++)//在串S中插入串T(也可能是部分插入)S[i] = T[i – pos + 1];S[;//部分插入的标记}}Status StrDelete(SString S, int pos, int len){//从串S中删除自第pos个字符起长度为len的子串int i;(i = pos + len; i <= S[0]; i++)//对于删除的子串之后的所有字符S[i – len] = S[i];//向前移动删除子串的长度S[0] -= len;//更新串S的长度return OK;//删除成功的标记}void StrPrint(SString S){int i;for (i = 1; i <= S[0]; i++)printf(“%c”, S[i]);printf(“\n”);}

有时间,我们可以去爬山,

定长顺序存储的串的表示和实现

相关文章:

你感兴趣的文章:

标签云: