参考资料:《数据结构(C语言版)严蔚敏著》
版权说明:未经作者允许,禁止转载。如引用本文内容,需标明作者及出处。如本文侵犯了您的权益,请联系我删除并致歉。
文章说明:如文章中出现错误,请联系我更改。如您对文章的内容有任何疑问,也欢迎来与我讨论。
本文正在施工中...请稍等...
串的顺序表示
串的顺序表示即用一组地址连续的存储单元存储串值的字符序列。常采用数组来存储串,根据数组空间的分配方式,有两种描述方法:静态分配、动态分配。
静态分配
#define MAXSTRLEN 255 //最大串长
typedef unsigned char SString[MAXSTRLEN+1]; //0号单元存放串的长度
动态分配
typedef struct{
char *ch;
int length;
}HString;
顺序串上基本操作的实现
1、赋值
Status StrAssign(SString &T, chat *chars){
for(i=0, c=chars; *c; ++i, ++c);
if(i>MAXSTRLEN) return ERROR;
T[1..i]=chars[0..i-1];
T[0]=i;
return OK;
}
Status StrAssign(HString &T, char *chars){
if(T.ch) free(T.ch);
for(i=0, c=chars; *c; ++i, ++c); //求chars的长度i
if(!i) { T.ch=NULL; T.length=0; }
else{
if(!(T.ch=(char*)malloc(i*sizeof(char))))
exit(OVERFLOW);
T.ch[0..i-1]=chars[0..i-1];
T.length=i;
}
return OK;
}
2、复制
Status StrCopy(SString &T, SString S){
T[0..S[0]]=S[0..S[0]];
return OK;
}
Status StrCopy(HString &T, HString S){
if(T.ch) free(T.ch);
if(!S.length) { T.ch=NULL; T.length=0; }
else{
if(!(T.ch=(char*)malloc(i*sizeof(char))))
exit(OVERFLOW);
T.ch[0..S.length-1]=S.ch[0..S.length-1];
T.length=S.length;
}
return OK;
}
3、判空
Status StrEmpty(SString S){
if(!S[0]) return TRUE;
return FALSE;
}
Status StrEmpty(HString S){
if(!S.length) return TRUE;
return FALSE;
}
4、比较
int StrCompare(SString S, SString T){
for(i=1; i<S[0] && i<T[0]; ++i)
if(S[i]!=T[i]) return S[i]-T[i];
return S[0]-T[0];
}
int StrCompare(HString S, HString T){
for(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;
}
5、串长
int StrLength(SString S){
retrun S[0];
}
int StrLength(HString S){
retrun S.length;
}
6、清空
Status ClearString(SString &S){
S[0]=0;
return OK;
}
Status ClearString(HString &S){
S.length=0;
return OK;
}
7、连接
Status Concat(SString &T, SString S1, SString S2){
if(S1[0]+S2[0]<=MAXSTRLEN){
T[1..S1[0]]=S1[1..S1[0]];
T[S1[0]+1..S1[0]+S2[0]]=S2[1..S2[0]];
T[0]=S1[0]+S2[0];
uncut=TRUE;
}
else if(S1[0]<MAXSTRLEN){
T[1..S1[0]]=S1[1..S1[0]];
T[S1[0]+1..MAXSTRLEN]=S2[1..MAXSTRLEN-S1[0]];
T[0]=MAXSTRLEN;
uncut=FALSE;
}
else{
T[0..MAXSTRLEN]=S1[0..MAXSTRLEN];
uncut=FALSE;
}
return uncut;
}
Status Concat(HString &T, HSTring S1, HString S2){
if(T.ch) free(T.ch);
if(!(T.ch=(char*)malloc((S1.length+S2.length)*sizeof(char))))
exit(OVERFLOW);
T.ch[0..S1.length-1]=S1.ch[0..S1.length-1];
T.length=S1.length+S2.length;
T.ch[S1.length..T.length-1]=S2.ch[0..S2.length-1];
return OK;
}
8、子串
Status SubString(SString &Sub, SString S, int pos, int len){
if(pos<1 || pos>S[0] || len<0 || len>S[0]-pos+1)
return ERROR;
Sub[1..len]=S[pos..pos+len-1];
Sub[0]=len;
return OK;
}
Status SubString(HString &Sub, HString S, int pos, int len){
if(pos<1 || pos>S.length || len<0 || len>S.length-pos+1)
return ERROR;
if(Sub.ch) free(Sub.ch);
if(!len) { Sub.ch=NULL; Sub.length=0; }
else{
Sub.ch=(char*)malloc(len*sizeof(char));
Sub.ch[0..len-1]=S.ch[pos-1..pos+len-2];
Sub.length=len;
}
return OK;
}
9、子串位置
int Index(SString S, SString T, int pos){
i=pos; j=1;
while(i<=S[0] && j<=T[0]){
if(S[i]==T[i]) { ++i; ++j; }
else{ i=i-j+2; j=1; }
}
if(j>T[0]) return i-T[0];
else return 0;
}
int Index(HString S, HString T, int pos){
i=pos-1; j=0;
while(i<S.length && j<T.length){
if(S.c[i]==T.c[i]) { ++i; ++j; }
else{ i=i-j+1; j=0; }
}
if(j==T.length) return i-T.length;
else return -1;
}
10、 替换
Status Replace(SString &S, SString T, SString V){
}
11、插入
Status StrInsert(SString &S, int pos, SString T){
if(pos<1 || pos>S[0]+1 || S[0]+T[0]>MAXSTRLEN) return ERROR;
for(i=S[0]; i>=pos; --i)
S[i+T[0]]=S[i];
S[pos..pos+T[0]-1]=T[1..T[0]];
S[0]=S[0]+T[0];
}
Status StrInsert(HString &S, int pos, HString T){
if(pos<1 || pos>S.length+1) return ERROR;
if(T.length){
if(!(S.ch=(char*)realloc(S.ch, (S.length+T.length)*sizeof(char))))
exit(OVERFLOW);
for(i=S.length-1; i>=pos-1; --i)
S.ch[i+T.length]=S.ch[i];
S.ch[pos-1..pos+T.length-2]=T.ch[0..T.length-1];
S.length+=T.length;
}
return OK;
}
12、删除
Status StrDelete(SString &S, int pos, int len){
if(pos<1 || pos>S[0]-len+1) return ERROR;
for(i=0; i<len && pos+len+i<S[0]; ++i){
S[pos]=S[pos+len+i];
}
S[0]=S[0]-len;
return OK;
}
13、销毁
Status DestroyString(HString &S){
if(S.ch) free(S.ch);
S.ch=NULL;
return OK;
}