串的顺序存储
//----串的定义顺序储存结构------
#define MAXLEN 255 //串的长度
typedef struct{
char ch[MAXLEN+1];//存储串的一维数组
int length;//串当前长度
} SString;
//----串的堆式顺序储存结构------
typedef struct{
char *ch;//若是非空串,则按串长分配存储区,否则ch为UNLL
int length;//串当前长度
} SString;
串的链式存储
//----串的链式储存结构------
#define CHUNKSIZE 80 //可由用户定义的块大小
typedef struct Chunk{
char ch[CHUNKSIZE];
struct Chunk *next;
} Chunk;
typedef struct{
char *head,*tail;
int length;
} LString;
串的模式匹配算法
子串的定位运算通常称为串的模式匹配或串匹配
BF算法
int Index_BF(SString s ,SString T,int pos)
{
//返回模式T在主串S中第po个字符开始第一次出现的位置。若不存在,则返回0
//其中,T非空,1<<pos<<s.length
i=pos ;j=1;//初始化
while(i<=S.lenght && j<<T.lenght)//两个串均末比较串尾。
{
if (S.ch[i]==T.ch[j]){
++i;++j;
}//继续比较后继字符
else{
i=i-j+2;j=1;
}//指针后退,重新开始匹配
}
if(j>T.length)return i-T.length;//匹配成功
else return 0;
}
KMF算法
int Index_KMP(SString s ,SString T,int pos)
{
//利用模式串T的next函数T在主串S中第po个字符之后的位置
//其中,T非空,1<<pos<<s.length
i=pos ;j=1;//初始化
while(i<=S.lenght && j<<T.lenght)//两个串均末比较串尾。
{
if (j==0||S.ch[i]==T.ch[j]){
++i;++j;
}//继续比较后继字符
else{
j=next[j];
}//模式串向右移动
}
if(j>T.length)return i-T.length;//匹配成功
else return 0; //匹配失败
}
计算next函数值
viod get_next(SString T ,int next[])
{
//求模式串T的next函数值并将其存入数组next
i=1;next[1]=0;j=0;
while(i<=T.lenght)
{
if (j==0||T.ch[i]==T.ch[j]){
++i;++j;
next[i]=j;
}
else{
j=next[j];
}
}
}