字符串的实现及操作:
#include
<
malloc.h
>
#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef struct
... {
char *ch;
int length;
} HString;
// 清空
void ClearString(HString * s)
... {
if(s->ch)
...{
free(s->ch);
s->ch=NULL;
}
s->length=0;
}
// 赋值
int StrAssign(HString * s, char * chars)
... {
char *c=chars;
int i;
if(s->ch)
free(s->ch);
for(i=0;*c;i++,c++);
if(!i)
...{
s->ch=NULL;
s->length=0;
}
else
...{
s->ch=(char *)malloc(i*sizeof(char));
if(!s->ch)
...{
return OVERFLOW;
}
s->length=i;
for(;i>0;i--)
s->ch[i-1]=chars[i-1];
}
return OK;
}
// 计算长度
int StrLength(HString s)
... {
return s.length;
}
// 字符串的比较
int StrCompare(HString s,HString t)
... {
for(int 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;
}
void get_next(HString s, int * next)
... {
int i=0,j=-1;
next[0]=-1;
while(i<s.length-1)
...{
if(j==-1||s.ch[i]==s.ch[j])
...{
++i;
++j;
next[i]=j;
}
else
j=next[j];
}
}
void get_nextval(HString s, int * nextval)
... {
int i=0,j=-1;
nextval[0]=-1;
while(i<s.length-1)
...{
if(j==-1||s.ch[i]==s.ch[j])
...{
++i;
++j;
if(s.ch[i]!=s.ch[j])
nextval[i]=j;
else
nextval[i]=nextval[j];
}
else
j=nextval[j];
}
}
// KMP算法
int Index_kmp(HString s,HString t, int pos, int * next)
... {
int i=pos-1;
int j=0;
while(i<s.length&&j<t.length)
...{
if(j==-1||s.ch[i]==t.ch[j])
...{
++i;
++j;
}
else
j=next[j];
}
if(j>=t.length)
return i-t.length+1;
else
return 0;
}
// 简单模式匹配算法
int Index(HString s,HString t, int pos)
... {
int i=pos-1;
int j=0;
while(i<s.length&&j<t.length)
...{
if(s.ch[i]==t.ch[j])
...{
++i;
++j;
}
else
...{
i=i-j+1;
j=0;
}
}
if(j>=t.length)
return i-t.length+1;
else
return 0;
}
// 字符串连接
int Concat(HString * T,HString S1,HString S2)
... {
int i;
if(T->ch)
free(T->ch);
T->ch=(char *)malloc((S1.length+S2.length)*sizeof(char));
if(!T->ch)
return OVERFLOW;
for(i=0;i<S1.length;i++)
T->ch[i]=S1.ch[i];
for(i=0;i<S2.length;i++)
T->ch[S1.length+i]=S2.ch[i];
T->length=S1.length+S2.length;
return OK;
}
// 插入字符串
int Insert(HString * s,HString * t, int pos)
... {
int j=0;char *newbase;
int index=StrLength(*s);
int intval=StrLength(*t);
newbase=(char *)realloc(s->ch,(index+intval)*sizeof(char));
if(!newbase)
return OVERFLOW;
// for(int i=0;i<index;i++)
// {
// newbase[i]=s->ch[i];
// }
s->ch=newbase;
s->length=index+intval;
while(index>=pos)
...{
s->ch[index-1+intval]=s->ch[index-1];
index--;
}
while(j<intval)
...{
s->ch[index]=t->ch[j];
index++;
j++;
}
return OK;
}
/**/ /*显示串T*/
void StrPrint(HString T)
... {
for(int i=0;i<T.length;i++)
putchar(T.ch[i]);
// printf("%s",T.ch);
}
/**/ /*取回文子串*/
void IndexSubString(HString s, int & index, int & interval)
... {
int r=0;
index=0;
interval=0;
for(int i=0;i<s.length;i++)
...{
r=0;
while(i-r>=0&&i+r<s.length)
...{
if(s.ch[i-r]==s.ch[i+r])
r++;
else
break;
}
if(interval<r-1)
...{
interval=r-1;
index=i;
}
}
}
/**/ /*打印回文子串*/
void PrintSubString(HString s, int index, int interval)
... {
for(int i=index-interval;i<=index+interval;i++)
printf("%c",s.ch[i]);
}
int main( int argc, char * argv[])
... {
HString str1=...{NULL,0},str2=...{NULL,0},str3=...{NULL,0};
int next[11];
ClearString(&str1);
printf("the string is: ");
StrAssign(&str1,"helloworld");
StrAssign(&str1,"acabaabcaabaabcac");
printf(" the length is%d ",str1.length);
StrAssign(&str2,"abaabcac");
StrAssign(&str2,"abc");
get_next(str2,&next[0]);
get_next(str2,next);
get_nextval(str2,&next[0]);
printf("the index is: %d ",Index_kmp(str1,str2,1,next));
printf("the index is: %d ",Index(str1,str2,1));
printf("the result is: %d ",StrCompare(str1,str2));
Concat(&str3,str1,str2);
StrPrint(str3);
printf(" the length is%d ",str3.length);
Insert(&str1,&str2,2);
StrPrint(str1);
printf(" ");
int index=0;
int interval=0;
StrAssign(&str1,"abcdddadddcmnd");
IndexSubString(str1,index,interval);
PrintSubString(str1,index,interval);
printf(" ");
return 0;
}
#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef struct
... {
char *ch;
int length;
} HString;
// 清空
void ClearString(HString * s)
... {
if(s->ch)
...{
free(s->ch);
s->ch=NULL;
}
s->length=0;
}
// 赋值
int StrAssign(HString * s, char * chars)
... {
char *c=chars;
int i;
if(s->ch)
free(s->ch);
for(i=0;*c;i++,c++);
if(!i)
...{
s->ch=NULL;
s->length=0;
}
else
...{
s->ch=(char *)malloc(i*sizeof(char));
if(!s->ch)
...{
return OVERFLOW;
}
s->length=i;
for(;i>0;i--)
s->ch[i-1]=chars[i-1];
}
return OK;
}
// 计算长度
int StrLength(HString s)
... {
return s.length;
}
// 字符串的比较
int StrCompare(HString s,HString t)
... {
for(int 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;
}
void get_next(HString s, int * next)
... {
int i=0,j=-1;
next[0]=-1;
while(i<s.length-1)
...{
if(j==-1||s.ch[i]==s.ch[j])
...{
++i;
++j;
next[i]=j;
}
else
j=next[j];
}
}
void get_nextval(HString s, int * nextval)
... {
int i=0,j=-1;
nextval[0]=-1;
while(i<s.length-1)
...{
if(j==-1||s.ch[i]==s.ch[j])
...{
++i;
++j;
if(s.ch[i]!=s.ch[j])
nextval[i]=j;
else
nextval[i]=nextval[j];
}
else
j=nextval[j];
}
}
// KMP算法
int Index_kmp(HString s,HString t, int pos, int * next)
... {
int i=pos-1;
int j=0;
while(i<s.length&&j<t.length)
...{
if(j==-1||s.ch[i]==t.ch[j])
...{
++i;
++j;
}
else
j=next[j];
}
if(j>=t.length)
return i-t.length+1;
else
return 0;
}
// 简单模式匹配算法
int Index(HString s,HString t, int pos)
... {
int i=pos-1;
int j=0;
while(i<s.length&&j<t.length)
...{
if(s.ch[i]==t.ch[j])
...{
++i;
++j;
}
else
...{
i=i-j+1;
j=0;
}
}
if(j>=t.length)
return i-t.length+1;
else
return 0;
}
// 字符串连接
int Concat(HString * T,HString S1,HString S2)
... {
int i;
if(T->ch)
free(T->ch);
T->ch=(char *)malloc((S1.length+S2.length)*sizeof(char));
if(!T->ch)
return OVERFLOW;
for(i=0;i<S1.length;i++)
T->ch[i]=S1.ch[i];
for(i=0;i<S2.length;i++)
T->ch[S1.length+i]=S2.ch[i];
T->length=S1.length+S2.length;
return OK;
}
// 插入字符串
int Insert(HString * s,HString * t, int pos)
... {
int j=0;char *newbase;
int index=StrLength(*s);
int intval=StrLength(*t);
newbase=(char *)realloc(s->ch,(index+intval)*sizeof(char));
if(!newbase)
return OVERFLOW;
// for(int i=0;i<index;i++)
// {
// newbase[i]=s->ch[i];
// }
s->ch=newbase;
s->length=index+intval;
while(index>=pos)
...{
s->ch[index-1+intval]=s->ch[index-1];
index--;
}
while(j<intval)
...{
s->ch[index]=t->ch[j];
index++;
j++;
}
return OK;
}
/**/ /*显示串T*/
void StrPrint(HString T)
... {
for(int i=0;i<T.length;i++)
putchar(T.ch[i]);
// printf("%s",T.ch);
}
/**/ /*取回文子串*/
void IndexSubString(HString s, int & index, int & interval)
... {
int r=0;
index=0;
interval=0;
for(int i=0;i<s.length;i++)
...{
r=0;
while(i-r>=0&&i+r<s.length)
...{
if(s.ch[i-r]==s.ch[i+r])
r++;
else
break;
}
if(interval<r-1)
...{
interval=r-1;
index=i;
}
}
}
/**/ /*打印回文子串*/
void PrintSubString(HString s, int index, int interval)
... {
for(int i=index-interval;i<=index+interval;i++)
printf("%c",s.ch[i]);
}
int main( int argc, char * argv[])
... {
HString str1=...{NULL,0},str2=...{NULL,0},str3=...{NULL,0};
int next[11];
ClearString(&str1);
printf("the string is: ");
StrAssign(&str1,"helloworld");
StrAssign(&str1,"acabaabcaabaabcac");
printf(" the length is%d ",str1.length);
StrAssign(&str2,"abaabcac");
StrAssign(&str2,"abc");
get_next(str2,&next[0]);
get_next(str2,next);
get_nextval(str2,&next[0]);
printf("the index is: %d ",Index_kmp(str1,str2,1,next));
printf("the index is: %d ",Index(str1,str2,1));
printf("the result is: %d ",StrCompare(str1,str2));
Concat(&str3,str1,str2);
StrPrint(str3);
printf(" the length is%d ",str3.length);
Insert(&str1,&str2,2);
StrPrint(str1);
printf(" ");
int index=0;
int interval=0;
StrAssign(&str1,"abcdddadddcmnd");
IndexSubString(str1,index,interval);
PrintSubString(str1,index,interval);
printf(" ");
return 0;
}