数据结构---字符串
来源:互联网 发布:直通车卡首屏软件 编辑:程序博客网 时间:2024/04/26 23:06
字符串的实现及操作:
#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;
}
- 数据结构---字符串
- 数据结构-字符串
- 数据结构---字符串
- 数据结构-字符串
- 数据结构-字符串
- 数据结构-字符串
- 数据结构--字符串
- [数据结构复习]字符串1
- 数据结构之 字符串
- 数据结构(十) --- 字符串
- redis数据结构之字符串
- 【数据结构】字符串查找
- 数据结构-字符串查找
- 数据结构-查找字符串1
- 数据结构-查找字符串2
- 数据结构-查找字符串
- [数据结构] KMP字符串匹配
- 数据结构(scheme) -- 字符串
- margin属性的四个方向的顺序
- 关于主对话框数据于子对话框数据的交换
- kbox1.03版
- 数据结构---队列
- 搜索spider对二叉查找树查找实验(中文翻译)
- 数据结构---字符串
- VS2005的复制网站功能
- 第三方控件个人理解
- NSIS常见问题集锦
- 爬虫/蜘蛛程序的制作(C#语言)(备忘录)
- 数据结构---数组
- ♀o︶随︶o♀
- 我对你的爱净重21克!!
- MSVCRTD.lib(MSVCR71D.dll) : error LNK2005: __CrtDbgReport 已经在 LIBCD.lib(dbgrpt.obj) 中定义