一、定义
串,即字符串,是由零个或多个字符组成的有限序列,一般记为 S = 'a1a2a3...an',其中ai可以是字母、数字或其他字符
重要术语:
子串(串中任意个连续的字符组成的子序列)
主串(包含子串的串)
字符在主串中的位置(字符在串中第一次出现的序号)
子串在主串中的位置(字符的第一个字符在串中的位置)
区别:
空串和空格串
二、基本操作
StrAssign(&T,chars) 赋值操作,把串T赋值给chars
StrCopy(&T,S) 复制操作,由串S复制得到串T
StrEmpty(S) 判空操作
StrLength(S) 求串长
ClearString(&S) 清空操作
DestroyString(&S) 销毁操作,回收存储空间
Concat(&T,S1,S2) 串联接,用T返回由S1和S2联接而成的新串
SubString(&Sub,S,pos,len) 求子串,用Sub返回串S的第pos个字符起长度为len的子串
Index(S,T) 定位操作,找到S中存在与串T值相同的子串,则返回它在主串S中第一次出现的位置,若没有则函数值为0
StrCompare(S,t) 比较操作,若S > T,则返回>0;若S = T,则返回=0;若S < T,则返回<0。(这里会逐个比较串的字符大小利用ASCII码,例如:'abandon'<'aboard' , 'academic'>'abuse', 'car'<'car ')
1.定义
和线性表一样,只是数据元素类型为char,
(1)线性存储
静态数组
缺点:长度不可变
#define Maxlen 255 //串的最大长度
typedef struct {
char ch[Maxlen];
int length; //串的实际长度
}SString;
动态数组
typedef struct {
char *ch;
int length;
}HString;
HString S;
S.ch = (char *)malloc(Maxlen * sizeof(char));
S.length = 0;
需要手动free
(2)链式存储
typedef struct StringNode {
char ch[4]; //每个结点存储多个字符,字符不够长时用#或‘/0’来补
struct StringNode * next;
}StringNode, * String;
2.求子串
//线性存储
bool SubString(SString &Sub, SString S, int pos, int len) {
if (pos+len-1 > S.length)
return false;
for (int i = pos; i < pos+len; i++)
Sub.ch[i-pos+1] = S.ch[i];
Sub.length = len;
return true;
}
3.比较
int StrCompare (SString S, SString T) {
for (int i = 1; i <= S.length && i<=T.length; i++) {
if (S.ch[i] != T.ch[i])
return S.ch[i]-T.ch[i];
}
return S.length-T.length;
}
4.求子串
int Index(SString S, SString T) {
int i = 1, n = StrLength(S), m = StrLength(T);
SString sub; //用于暂存子串
while(i <= n-m+1) {
SubString (sub,S,i,m);
if (StrCompare(sub,T)!=0)
++i;
else
return i; //返回子串在主串中的位置
}
return 0;
}