串的概述
串(字符串):由n(n>=0)个字符组成的有限序列。一般记作s=“s0,s1,s2,…,sn-1”,其中s称作串名,n称作串的长度,双引号括起来的字符序列称作串的值。
子串:一个串中任意个连续的字符组成的子序列。
主串:包含子串的串称为子串的主串。
该字符在串中的位置:一个字符在一个串中的位置序号(>=0)
串相等:大小和值都相等。
注:串“a”:既要存储字符‘a’,也要存储该串的长度数据。与‘a’不同。
串的存储结构
1:静态数组结构(长度难以改变)
2:动态数组结构(常用***)
typedef struct
{
char *str;
int max_length;
int length;
}DString;
3:单字节节点链(空间利用率太低)
4:块链(操作实现复杂)
串基本操作的实现
1:结构定义(如上)
2:初始化
void Init_DString(DString *S, int max, char *string)
{
int i;
S->str = (char*)malloc(sizeof(char)*max);//动态生成空间
S->max_length = max;
S->length = strlen(string);
for (i = 0; i < S->length; i++)//生成原始串
{
S->str[i] = string[i];
}
}
3:插入子串
int Insert_DString(DString *S, int pos, DString T)
{
int i;
if (pos < 0)//检查
{
printf("参数pos出错!\n");
return 0;
}
else
{
if (S->length + T.length>S->max_length)//判断空间是否足够
{
realloc(S->str, (S->length + T.length)*sizeof(char));//开辟新空间(在前面的基础上)
S->max_length = S->length + T.length;
}
for (i = S->length - 1; i >= pos; i--)//从后往前将元素后移
{
S->str[i + T.length] = S->str[i];
}
for (i = 0; i < T.length; i++)//插入,生成新串
{
S->str[pos + i] = T.str[i];
}
S->length += T.length;
return 1;
}
}
4:删除子串
int Delete_DString(DString *S, int pos, int len)
{
int i;
if (S->length <= 0)//检查
{
printf("数组中未存放字符无元素可删!\n");
return 0;
}
else if (pos < 0 || len<0 || pos + len>S->length)
{
printf("参数pos和len不合法!\n");
return 0;
}
else
{
for (i = pos + len; i <= S->length - 1; i++)//将后面的往前补
{
S->str[i - len] = S->str[i];
}
S->length -= len;
return 1;
}
}
5:取子串
int SubString(DString *S, int pos, int len, DString *T)
{
int i;
if (pos < 0 || len<0 || pos + len>S->length)//检查
{
printf("参数pos和len出错!\n");
return 0;
}
if (len>T->max_length)//开辟空间
{
T->str = (char*)malloc(len*sizeof(char));
T->max_length = len;
}
for (i = 0; i < len; i++)//取子串
{
T->str[i] = S->str[pos + i];
}
T->length = len;
return 1;
}
6:撤销串
void Destory(DString *S)
{
free(S->str);
S->max_length = 0;
S->length = 0;
}