#define MANLAN 255
typedef struct{
char ch[MANLAN]; //存放字符
int length; //串长度
}SString;
堆分配存储
typedef struct{
char *ch; //指向基地址
int length; //串长度
}HString; //按串长分配存储区
HString S;
S.ch=(char *)malloc(MANLAN*sizeof(char));
S.length=0;
块链式存储
typedef struct StringNode{
char ch[4]; //一个结点(块)存放多个字符
struct StringNode * next;
}StringNode * SString;
定长顺序存储定义方便、操作简单;堆分配存储长度可变,不会浪费空间;块链式存储每个结点(快)可以存储多个字符,可以提高存储密度。
操作集void StrAssian(SString &T,char chars[]);//赋值 int StrCompare(SString S,SString T);//比较 int StrLength(SString S);//求串长 void Concat(SString &T,SString S1,SString S2);//串联接 void SubString(SString &Sub,SString S,int pos,int len);//求子串 bool StrEmpty(SString S);//判空 int Index(SString S,SString T);//定位
以下用常用的定长顺序存储实现
赋值//赋值操作。把串T赋值为chars
void StrAssian(SString &T,char chars[]){
T.length=0;
while(chars[T.length]!=' ')
T.ch[++T.length]=chars[T.length-1];
}
比较
//比较操作。若S>T,则返回值>0;若S=T,则返回值=0;若ST.ch[i]) return 1; else return -1; } if(S.length>T.length) return 1; else if(S.length 求串长 //求串长。返回串S的元素个数。 int StrLength(SString S){ return S.length; }串联接//串联接。用T返回由S1和S2联接而成的新串。 void Concat(SString &T,SString S1,SString S2){ T.length=S1.length+S2.length; int i=1; for(;i<=S1.length;i++) T.ch[i]=S1.ch[i]; for(;i<= T.length;i++) T.ch[i]=S2.ch[i-S1.length]; }求子串//求子串。用Sub返回串s的第pos个字符起长度为len的子串。 void SubString(SString &Sub,SString S,int pos,int len){ if(pos+len>S.length) { Sub.length=0; return ; } Sub.length=len; for(int i=1;i<=len;i++) Sub.ch[i]=S.ch[i+pos-1]; }判空//判空操作。若s为空串,则返回 TRUE,否则返回FALSE。 bool StrEmpty(SString S){ return StrLength(S)==0; }定位//定位操作。若主串s中存在与串T值相同的子串,则返回它在主串s中第一次出现的位置;否则函数值为0。 int Index(SString S,SString T){ int i=1,n=S.length,m=T.length; SString Sub; while(i<=n-m-1){ SubString(Sub,S,i,m); if(StrCompare(Sub,T)!=0) i++; else return i; } return 0; }完整代码#includeusing namespace std; #define MANLAN 255 typedef struct{ char ch[MANLAN]; int length; }SString; void StrAssian(SString &T,char chars[]);//赋值 int StrCompare(SString S,SString T);//比较 int StrLength(SString S);//求串长 void Concat(SString &T,SString S1,SString S2);//串联接 void SubString(SString &Sub,SString S,int pos,int len);//求子串 bool StrEmpty(SString S);//判空 int Index(SString S,SString T);//定位 //不同的高级语言对串的基本操作集可以有不同的定义方法。在上述定义的操作中, //串赋值StrAssian.电比较StrCompare、求串长StrLength、串联接Concat及求子串SubString //五种操作构成串类型的最小操作子集,即这些操作不可能利用其他串操作来实现: //反之,其他串操作(除串清除ClearString和串销毁 DestroyString外)均可在该最小操作子集上实现。 int main(){ SString S,T,R; char chars1[]="bcbcdefaaa"; char chars2[]="abcdefa"; StrAssian(S,chars1); StrAssian(T,chars2); cout<<"S:"; for(int i=1;i<=S.length;i++)cout< 0) printf("S>Tn"); // else if(StrCompare(S,T)<0) printf("S


