串分为顺序串,堆串,快链串三种
#include<stdio.h>
#define MAXLEN 40
typedef struct String{
char ch[MAXLEN];
int len;//该串的长度
}SString;
//顺序串插入函数,将字符串t插入字符串s的pos位置之前
//1.S->len+t->len<=MAXLEN
//2.S->len+t->len>MAXLEN而且 pos+len<=MAXLEN,字符串t能够完全插入
//3.s->len+t->len>MAXLEN而且pos+len>MAXLEN,字符串t不能够完全插入
bool StrInsert(SString *s,int pos,SString t)
{
int i;
//插入位置不合法
if(pos<0||pos>MAXLEN)
return false;
//插入后长度小于MAXLEN
if(s->len+t.len<=MAXLEN)
{
//将s串下半部分放在正确位置
for(i=s->len+t.len-1;i>=pos+t.len;i--)
s->ch[i]=s->ch[i-t.len];
//将t串插入pos
for(i=0;i<t.len;i++)
s->ch[pos+i]=t.ch[i];
//改变新串的长度值len
s->len=s->len+t.len;
}
//插入后串长>MAXLEN,但是字符串t能够完全插入
else if(pos+t.len<=MAXLEN)
{
//将s串下半部分放在正确位置
for(i=MAXLEN-1;i>=pos+t.len;i--)
s->ch[i]=s->ch[i-t.len];
//将t串插入正确位置
for(i=0;i<t.len;i++)
s->ch[pos+i]=t->ch[i];
//改变新串的长度
s->len=MAXLEN;
}
//插入后串长>MAXLEN,且字符串t不能完全插入
else if(pos+t.len>MAXLEN)
{
//将t串部分元素放在正确位置
for(i=MAXLEN-1;i>=pos;i--)
{
s->ch[i]=t[i-pos];
}
s->len=MAXLEN
}
return true;
}
//顺序串删除函数
//从顺序串中pos的位置开始删除len个元素:len为0时不删除,len>0时从pos开始一直删除到pos+len-1
bool SteString(SString *s,int pos,int len)
{
int i;
if(pos<0||pos+len>s->len)
return false;
else
{
//从pos+len开始,每个元素都向前移动len个字符
for(i=pos+len;i<s->len;i++)
s->ch[i-len]=s->ch[i];
return true;
}
}
//串复制函数:将串t的值复制到s中
bool StrCopy(SString* s,SString t)
{
int i;
for(i=0;i<s->len;i++)
{
s->ch[i]=t.ch[i];
}
s->len=t.len;
}
//顺序串判空函数
bool IsEmpty(SString* s)
{
if(s->len==0)
return true;
else
return false;
}
int StrCompare(SString* s,SString* t)
{
int i;
for(i=0;i<s->len&&i<t->len;i++)
if(s->ch[i]!=t->ch[i])
return s->ch[i]-t->ch[i];
return s->len-t->len;
}
//求串长函数
int StrLength(SString* s)
{
return s->len;
}
//清空串函数
void StrClear(SString* s)
{
s->len=0;
}
//串连接函数:
/*
分为三种情况
1.如果s->len+t->len<=MAXLEN
2.如果s->len+t->len>MAXLEN而且s->len<MAXLEN,t能够连接部分进去
3.如果s->len=MAXLEN
*/
int StrCat(SString* s,SString* t)
{
int i,flag;//flag:0完全连接,1部分连接 2没有连接
if(s->len+t->len<=MAXLEN)
{
for(i=s->len;i<=s->len+t->len-1;i++)
s->ch[i]=t[i-s->len];
flag=0;
return flag
}
else if(s->len<MAXLEN)
for(i=MAXLEN-1;i>=s->len;i--)
s->ch[i]=t[i-s->len];
flag=1;
return flag;
else
flag=2;
return flag;
}
//求子串
bool SubString(SString* s,SString* t,int pos,int len)
{
int i;
if(pos<0||pos+len>s->len||s->len==0||len<1)
return false;
else
{
for(i=0;i<len;i++)
t->ch[i]=s->ch[pos+i];
t->len=len;
return true;
}
}
//顺序串的模式匹配
int StrIndex(SString* s,SString* t,int pos)
{
int i,j,start;
if(pos>=s->len)
return -1;
if(t->len==0)
return 0;//串为空串时,是任意串的匹配
start=pos;
i=start;
j=0;
while(i<s->len&&j<t->len)
{
if(s->ch[i]==t->ch[j])
{
i++;
j++
}
else
{
start++;
i=start;
j=0;
}
}
if(j>=t->len)
return start;
else
return -1;
}
恩,这是大概的实现,具体的以后再说