字符串的实现及操作: #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;}