顺序串参数采用直接传递顺序串的方法,不同于顺序表指针。
typedef struct {
char data[MAXSIZE];
int length;
}SqString;
生成串
void StrAssign(SqString& s, char cstr[])
{
int i;
for (i = 0; cstr[i] != '\0'; i++)
{
s.data[i] = cstr[i];
}
s.length = i;
销毁串(存储空间由操作系统管理)
void DestroyStr(SqString& s)
{ }
串的复制
void StrCopy(SqString& s, SqString t)
{
for (int i = 0; i < t.length; i++)
{
s.data[i] = t.data[i];
}
s.length = t.length;
}
判断串是否相等
bool StrEqual(SqString s, SqString t)
{
if (s.length != t.length)
return false;
else
{
for (int i = 0; i < s.length; i++)
{
if (s.data[i] != t.data[i])
return false;
}
return true;
}
}
串长
int StrLength(SqString s)
{
return s.length;
}
串的连接
SqString ConStr(SqString s, SqString t)
{
SqString str;
int i, j;
for (int i = 0; i < s.length; i++)
{
str.data[i] = s.data[i];
}
for (int j = 0; j < t.length; j++)
{
str.data[j + s.length] = t.data[j];
}
str.length = s.length + t.length;
return str;
}
求子串
SqString SubStr(SqString s, int i, int j)
{
SqString str;
str.length = 0;
if (i<=0 || i>s.length || i + j - 1 > s.length)
return str;
else
{
for (int k = i-1; k < i + j - 1; k++)
{
str.data[k-i+1] = s.data[k];
}
str.length = j;
return str;
}
}
子串插入
SqString InsStr(SqString s, int i, SqString t)
{
int j;
SqString str;
str.length = 0;
if (i <= 0 || i > s.length + 1)
return str;
else
{
for (j = 0; j < i - 1; j++)
{
str.data[j] = s.data[j];
}
for (j = 0; j < t.length; j++)
{
str.data[j - 1 + i] = t.data[j];
}
for (j = i - 1; j < s.length; j++)
{
str.data[j + t.length] = s.data[j];
}
str.length = s.length + t.length;
return str;
}
}
子串删除
SqString DelStr(SqString s, int i, int j)
{
int k;
SqString str;
str.length = 0;
if (i <= 0 || i > s.length || i + j - 1 > s.length)
return str;
else
{
for (k = 0; k < i - 1; k++)
{
str.data[k] = s.data[k];
}
for (k = i + j - 1; k < s.length; k++)
{
str.data[k-j] = s.data[k];
}
str.length = s.length - j;
return str;
}
}
子串替换
SqString RepStr(SqString s, int i, int j, SqString t)
{
int k;
SqString str;
str.length = 0;
if (i <= 0 || i > s.length || i + j - 1 > s.length)
return str;
else
{
for (k = 0; k < i - 1; k++)
{
str.data[k] = s.data[k];
}
for (k = 0; k < t.length; k++)
{
str.data[i - 1 + k] = t.data[k];
}
for (k = i + j - 1; k < s.length; k++)
{
str.data[k-j+t.length] = s.data[k];
}
str.length = s.length + t.length - j;
return str;
}
}
输出串
void DispStr(SqString s)
{
if (s.length > 0)
{
for (int i = 0; i < s.length; i++)
printf("%c", s.data[i]);
printf("\n");
}
}
按字典顺序比较两个串大小
int StrCmp(SqString s, SqString t)
{
int comlen;
if (s.length > t.length)
comlen = t.length;
else
comlen = s.length;
for (int i = 0; i < comlen; i++)
{
if (s.data[i] > t.data[i])
return 1;
if (s.data[i] < t.data[i])
return -1;
}
if (s.length > t.length)
return 1;
else if (s.length < t.length)
return -1;
else
return 0;
}
第一个最长连续相同字符
void LongestString(SqString s, int& Index, int& maxlen)
{
int i = 1;
int length, start;
Index = 0;
maxlen = 1;
while (i < s.length)
{
start = i - 1;
length = 1;
while (s.data[i] == s.data[i - 1] && i <s .length)
{
i++;
length++;
}
if (length > maxlen)
{
maxlen = length;
Index = start;
}
i++;
}
}