实验名称:串的定义,基本操作及模式匹配
实验目的:
掌握这种抽象数据类型的特点;熟练掌握串的顺序存储结构表示和基本操作,并能利用这些基本操作实现串的其他各种操作。
实验要求:
- 定义串的定长顺序存储结构;
- 实现串赋值,求串长,求子串,串连接,串比较等基本操作,以及简单模式匹配:检索子串在主串中出现的次数及相应的位置。
代码:
分别用两种存储方式实现
- 串的定长顺序存储实现
//串的定长顺序存储结构
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int Status;
#define MAXSTRLEN 255//可在255以内定义最大串长
typedef unsigned char SString[MAXSTRLEN+1];
//0号单元存放串长
//串赋值
Status StrAssign(SString &S,char *chars)
{
int i,j;char *c;
for(i=0,c=chars;*c;++i,++c);
if(i>MAXSTRLEN) return ERROR;
else
{
S[0]=i;
for(j=1;j<=S[0];j++)
S[j]=*(chars+j-1);
}
return OK;
}//StrAssign
//创建串
Status CreateString(SString &T)
{
char chars1[50];
int k;
gets(chars1);
k=StrAssign(T,chars1);
if(!k)
{
printf("串长超过MAXSTRLEN(=%d)\n",MAXSTRLEN);
exit(0);
}
return OK;
}//CreateString
//求串长
int StrLength(SString S)
{
return S[0];
}
//输出字符串
void StrPrint(SString S)
{
int i;
for(i=1;i<=S[0];i++)
{
printf("%c",S[i]);
}
printf("\n");
}//StrPrint
//求子串
Status SubString(SString &Sub, SString S,int pos,int len)
{
//用Sub返回串S的第pos个字符起长度为len的字串
int i,j;
if(pos<1||pos>S[0]||len<0||len>S[0]-pos+1)
return ERROR;
if(!len)
{
Sub[0]=0;
}
else
{
for(i=1,j=pos;i<=len-1,j<=pos+len-1;i++,j++)
Sub[i]=S[j];
Sub[0]=len;
}
return OK;
}//SubString
//串连接
Status Concat(SString &T,SString S1,SString S2)
{
//用T返回由S1和S2连接成的新串.
//若未截断,则返回TRUE,否则返回FALSE.
int i,j;
Status uncut;
if(S1[0]+S2[0]<=MAXSTRLEN)//未截断
{
T[0]=S1[0]+S2[0];
for(i=1;i<=S1[0];i++)
{
T[i]=S1[i];
}
for(j=1;j<=S2[0];j++)
{
T[S1[0]+j]=S2[j];
}
uncut=TRUE;
}
else if(S1[0]<MAXSTRLEN)//截断
{
T[0]=MAXSTRLEN;
for(i=