3.1 串的基本概念
数据对象为字符集的线性表
3.2 串的存储实现
3.2.1 定长顺序串
类似顺序表
#define MAXSIZE 40
typedef struct{
char ch[MAXSIZE];
int len;
}SString;
//串插入
int StrInsert(SString *s,int pos,SString t)
{
int i;
if(pos<0||pos>s->len) return 0;
if(s->len+t.len<=MAXSIZE)
{
for(i=s->len+t.len-1;i>=pos+t.len;i--)
s->ch[i]=s->ch[i-t.len];
for(i=pos;i<pos+t.len;i++)
s->ch[i]=t.ch[i-pos];
s->len=s->len+t.len;
}
else if(pos+t.len<=MAXSIZE)
{
for(i=MAXSIZE-1;i>=pos+t.len;i--)
s->ch[i]=s->ch[i-t.len];
for(i=pos;i<pos+t.len;i++)
s->ch[i]=t.ch[i-pos];
s->len=MAXSIZE;
}
else
{
for(i=pos;i<MAXSIZE;i++)
s->ch[i]=t.ch[i-pos];
s->len=MAXSIZE;
}
return 1;
}
//串删除
int StrDelete(SString *s,int pos,int len)
{
int i;
if(pos <0||pos>(s->len-len)) return(0);
for(i=pos+len;i<s->len-len;i++)
s->ch[i-len]=s->ch[i];
s->len=s->len-len;
return(1);
}
//串比较
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);
}
3.2.2 堆串
typedef struct{
char *ch;
int len;
}HString;
int StrInsert(HString *s,int pos,HString *t)//堆串插入函数
{
int i;
char * temp;
if(pos<0 ||pos>s->len) return 0;
temp=(char*)malloc(s->len+t->len);
if(temp==NULL) return 0;
for(i=0;i<pos;i++) temp[i]=s->ch[i];
for(i=0;i<t->len;i++) temp[i+pos]=t->ch[i];
for(i=pos;i<s->len;i++) temp[i+t->len]=s->ch[i];
s->len+=t->len;
free(s->ch);
s->ch=temp;
return 1;
}
int StrAssigh(HString *s,char *tval)//堆串赋值函数
{
int len,i=0;
if(s->ch!=NULL) free(s->ch);
while(tval[i]!='\0') i++;
len=i;
if(len)
{
s->ch=(char*)malloc(len);
if(s->ch==NULL) return 0;
for(i=0;i<len;i++) s->ch[i]=tval[i];
}
else
s->ch=NULL;
s->len=len;
return 1;
}
3.2.3 块链串
#definr BLOCK_SIZE 4//每个结点存放字符个数
typedef struct Block
{
char ch[BLOCK_SIZE];
struct Block *next;
} Block;
typedef struct{
Block *head;
Block *tail;
int len;
}BLString;
3.3 串的模式匹配
//字符串的匹配
#include<stdio.h>
#include<time.h>
#define MAXSIZE 100
typedef struct
{
char ch[MAXSIZE];
int len;
}SString;
void Ini(SString &S)
{
S.len=0;
}
int StrIndex(SString s,int pos,SString t)//顺序串的简单模式匹配
{
int start=pos;
int m=start,n=0;
if(t.len==0) return (0);
while(m<s.len && n<t.len)
{
if(s.ch[m]==t.ch[n])
{
m++,n++;
}
else
{
start++;
n=0;
m=start;
}
}
if(n==t.len) return start;
else return (-1);
}
int Kmp(SString s,SString t)//KMP算法
{
int i=0, j=0;
int k=-1;
int next[t.len];
//构建next数组
next[0]=-1;
while(j<t.len-1)
{
if(k==-1 || t.ch[j]==t.ch[k])
{
j++,k++;
next[j]=k;
}
else
{
k=next[k];
}
}
j=0;
//匹配规则
while(i<s.len && j<t.len)
{
if(s.ch[i]==t.ch[j] || j==-1)
{
i++,j++;
}
else
{
j=next[j];
}
}
if(j==t.len) return (i-j);
else return (-1);
}
int main()
{
int i=0,j=0,pos;
char c,l;
double duration;
clock_t start,stop;
SString s, t;
Ini(s);
Ini(t);
printf("please input the text string for s:");
c=getchar();
while(c!='$')
{
s.ch[i]=c;
s.len++;
i++;
c=getchar();
}
getchar();
printf("please input the match string for t:");
l=getchar();//注意换行符
while(l!='$')
{
t.ch[j]=l;
t.len++;
j++;
l=getchar();
}
printf("please input the pos:");
scanf("%d",&pos);
start=clock();
printf("简单模式匹配:");
if(StrIndex(s,pos,t)!=-1)
{
printf("\n匹配成功");
printf("\nThe start is %d",StrIndex(s,pos,t));
stop=clock();
duration=((double)(stop-start));
printf("\nthe StrIndex time is %f",duration);
}
else
printf("匹配失败");
start=clock();
printf("\nKMP匹配:");
if(Kmp(s,t)!=-1)
{
printf("\n匹配成功");
printf("\nThe start is %d",Kmp(s,t));
stop=clock();
duration=((double)(stop-start));
printf("\nthe Kmp time is %f",duration);
}
else
printf("匹配失败");
return 0;
}