/***********************************************/
/* 该算法虽然是使用动态内存分配的方法实现
但因其存储单元的地址是连续的
所以本质上还是属于顺序存储
*/
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
/***********************************************/
#define MaxSize 256
typedef struct {
char *ch;
int length;
}HString, *pHString;
/***********************************************/
//函数声明
void InitString(pHString ch); //创建用户所输入的串
void DispString(pHString ch); //输出字符串
int GetLenString(pHString ch); //获得字符串的长度
int EmptyString(pHString ch); //字符串判空
int StrCompare(pHString T, pHString S); //字符串的比较
int ClearStr(pHString S); //将S清空, 并释放S所占的内存
int Concat(pHString T, pHString S1, pHString S2); //字符串连接
int SubString(pHString Sub, pHString S, int pos, int len); //在Sub中返回S中第pos位开始的len个字符组成的子串
int Index(pHString T, pHString S, int pos); //串的模式匹配(简单算法的实现)
/***********************************************/
int main(void)
{
HString T;
InitString(&T);
HString S;
InitString(&S);
int k = Index(&T, &S, 2);
printf("\n\n%d", k);
return 0;
}
/***********************************************/
//创建用户所输入的串
void InitString(pHString ch)
{
char str[MaxSize];
gets(str);
int i;
for (i=0; str[i]!='\0'; ++i) ;
ch->ch = (char *)malloc(sizeof(char) * i);
if (NULL == ch->ch)
{
printf("内存分配失败!程序终止....");
exit(-1);
}
int j;
for (j=0; j<i; ++j)
ch->ch[j] = str[j];
ch->length = j;
}
/***********************************************/
//输出字符串
void DispString(pHString ch)
{
int i;
for (i=0; i<ch->length; ++i)
putchar(ch->ch[i]);
putchar('\n');
}
/***********************************************/
//获得字符串的长度
//前提是ch串存在 并且已被初始化
int GetLenString(pHString ch)
{
return ch->length;
}
/***********************************************/
//字符串判空
//前提是ch串存在 并且已被初始化
int EmptyString(pHString ch)
{
if (0 == ch->length)
return 1;
else
return 0;
}
/***********************************************/
//若S大于T 返回值>0 若S等于T 返回值=0 若S小于T 返回值<0
int StrCompare(pHString T, pHString S)
{
int i;
for (i=0; 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;
}
/***********************************************/
//将S清空, 并释放S所占的内存
int ClearStr(pHString S)
{
S->length = 0;
free(S->ch);
S->ch = NULL;
return 1;
}
/***********************************************/
//字符串连接
int Concat(pHString T, pHString S1, pHString S2)
{
int Tlen = S1->length + S2->length;
T->ch = (char *)malloc(sizeof(char)*Tlen);
if (NULL == T->ch)
{
printf("内存分配失败!程序终止....");
exit(-1);
}
int i;
for (i=0; i<S1->length; ++i)
T->ch[i] = S1->ch[i];
int j;
for (j=0; j+i<Tlen; ++j)
T->ch[i+j] = S2->ch[j];
T->length = Tlen;
return 1;
}
/***********************************************/
//在Sub中返回S中第pos位开始的len个字符组成的子串
int SubString(pHString Sub, pHString S, int pos, int len)
{
if (pos<=0 || pos >S->length || len<0 || len>S->length-pos+1)
return 0;
Sub->ch = (char *)malloc(sizeof(char) * len);
int i;
for (i=0; i<len; ++i)
Sub->ch[i] = S->ch[pos+i-1];
Sub->length = len;
return 1;
}
/***********************************************/
//串的模式匹配 简单算法的实现
int Index(pHString T, pHString S, int pos)
{
if (pos<1 || pos >T->length)
return 0;
int Tlen = T->length;
int Slen = S->length;
int i = pos-1, j = 0;
while (i<Tlen && j<Slen)
{
if (T->ch[i] == S->ch[j])
{
++i;
++j;
}
else
{
i = i-j+1;
j = 0;
}
}
if (j>=Slen)
return i-Slen;
else
return -1;
}
/***********************************************/
这是以前写的代码,因为当时在VC6.0上新建文件的时候没有加.c 所以实际上建的是C++文件,所以在变量的定义上位置比较随便,当要用的时候再定义而在VC6.0中,C语言的变量必须定义在函数开始处。