1. 串的存储结构
1.1 串的顺序存储
从下标为1的数组分量开始存储
当0号单元存放串的当前长度时,可以定义:(后续基本操作都使用此定义)
typedef char SString[MAXSIZE+1]; //后续这样定义串SString S,T; 这样取值S[0],T[1];
但0号单位闲置不用时,可以定义:
typedef struct{
char ch[MAXSIZE+1];
int length; //记录串的当前长度
}SString;
还有堆(Heap)式顺序存储结构
typedef struct{
char *ch;
int length;
}HString;
1.2 串的链式存储
块链结构:
#define CHUNKSIZE 80 //定义块的大小
typedef struct Chunk{
char ch[CHUNKSIZE];
struct Chunk *next;
}Chunk;
typedef struct{
Chunk *head,*tail; //头指针和尾指针,可以只要其中一个
int length;
}LString;
2. 串的基本操作
2.1 分配StrAssign(T,*chars)
生成一个其值等于chars的串T(chars是字符串常量),如StrAssign(s1,"abcd")
Status StrAssign(SString T,char *chars)
{
int i;
if(strlen(chars)>MAXSIZE)
return ERROR;
else
{
T[0]=strlen(chars);
for(i=1;i<=T[0];i++)
T[i]=*(chars+i-1);
return OK;
}
}
2.2 复制StrCopy(T,S)
由串S复制得串T
Status StrCopy(SString T,SString S)
{
int i;
for(i=0;i<=S[0];i++)
T[i]=S[i];
return OK;
}
2.3 判断是否为空StrEmpty(S)
Status StrEmpty(SString S)
{
if(S[0]==0)
return TRUE;
else
return FALSE;
}
2.4 比较大小StrCompare(S,T)
返回长度差。若S>T,则返回值>0;若S=T,则返回值=0;若S<T,则返回值<0
int StrCompare(SString S,SString T)
{
int i;
for(i=1;i<=S[0]&&i<=T[0];++i)
if(S[i]!=T[i])
return S[i]-T[i];
return S[0]-T[0];
}
2.5 求串长StrLength(S)
int StrLength(SString S)
{
return S[0];
}
2.6 清空ClearString(S)
Status ClearString(SString S)
{
S[0]=0; //令串长为零
return OK;
}
2.7 字符串连接Concat(T,S1,S2)
用T返回S1和S2联接而成的新串。若未截断S2,则返回TRUE,否则FALSE
Status Concat(SString T,SString S1,SString S2)
{
int i;
if(S1[0]+S2[0]<=MAXSIZE)
{
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<=MAXSIZE-<