严蔚敏 吴伟明 数据结构 串定长顺序存储 (全是自己上机调试过的)
#include<stdio.h>#define MAXSTRLEN 20
typedef char sstring[MAXSTRLEN+1];
/*jiang.2010.05.15
也许简单,但都是心血*/
void strassign(sstring t,char *chars){
int i;
if(strlen(chars)>MAXSTRLEN) return;
t[0]=strlen(chars);
for(i=0;i<=t[0];i++){
t[i+1]=chars[i];
}
}
void strcopy(sstring s,sstring t){
int i;
for(i=0;i<=t[0];i++)
s[i]=t[i];
}
int strempty(sstring s){
if(s[0]==0) return 1;
else return 0;
}
int strcompare(sstring s,sstring t){
int i;
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 strlength(sstring s){
return s[0];
}
void clearstring(sstring s){
s[0]=0;
}
int concat(sstring t,sstring s1,sstring s2){
int i;
if(s1[0]+s2[0]<=MAXSTRLEN){
for(i=1;i<=s1[0];i++)
t[i]=s1[i];
for(i=1;i<=s2[0];i++)
t[s1[0]+i]=s2[i];
t[0]=s1[0]+s2[0];
}
else{
for(i=1;i<=s1[0];i++)
t[i]=s1[i];
for(i=1;i<=MAXSTRLEN-s1[0];i++)
t[s1[0]+i]=s2[i];
t[0]=MAXSTRLEN;
}
}
void substring(sstring sub,sstring s,int pos,int len){
int i;
if(pos<1||pos>s[0]||len<0||len>s[0]-pos+1)
return;
for(i=1;i<=len;i++)
sub[i]=s[pos+i];
sub[0]=len;
}
int index(sstring s,sstring t,int pos){
int i,j;
if(pos<0||pos>s[0]) return 0;
i=pos;
j=1;
while(i<=s[0]&&j<=t[0]){
if(s[i]==t[j]){i++;j++;}
else{i=i-j+2;j=1;}
}
if(j>t[0])
return i-t[0];
else
return 0;
}
int strinsert(sstring s,int pos,sstring t){
int i;
if(pos<1||pos>s[0]+1)
return 0;
if(s[0]+t[0]<=MAXSTRLEN){
for(i=s[0];i>=pos;i--)
s[i+t[0]]=s[i];
for(i=pos;i<=pos+t[0]-1;i++)
s[i]=t[i-pos+1];
s[0]+=t[0];
}
else{
for(i=MAXSTRLEN;i>=MAXSTRLEN-t[0];i++)
s[i]=s[i-t[0]];
for(i=pos;i<=pos+t[0]-1;i++)
s[i]=t[i-pos+1];
s[0]=MAXSTRLEN;
}
}
int strdelete(sstring s,int pos, int len){
int i;
if(pos<1||pos>s[0]-len+1)
return 0;
for(i=pos+len;i<=s[0];i++)
s[i-len]=s[i];
s[0]-=len;
}
void replace(sstring s,sstring t,sstring v){
int i=1;
if(strempty(t))
return;
do{
i=index(s,t,i);
if(i){
strdelete(s,i,t[0]);
strinsert(s,i,v);
i+=v[0];
}
}while(i);
}
void strprint(sstring s){
int i;
for(i=1;i<=s[0];i++){
printf("%c",s[i]);
}
printf("\n");
}
main(){
sstring s1,s2,s3,s4,s5,t;
char c,*a="aa",*b="**",*p="112233",*q="aabbccaa";
int i;
strassign(s1,p);
printf("s1:");
strprint(s1);
printf("s1/length:%d/empty(1 :Yes):%d\n",strlength(s1),strempty(s1));
strcopy(s3,s1);
printf("copy/s1->s3:");
strprint(s3);
strassign(s2,q);
printf("s2:");
strprint(s2);
i=strcompare(s1,s2);
if(i<0) c='<';
else if(i==0) c='=';
else c='>';
printf("s1%cs2\n",c);
concat(t,s1,s2);
printf("concat/s1+s2->t:");
strprint(t);
strassign(s4,a);
printf("s4:");
strprint(s4);
i=index(s2,s4,1);printf("index/s2/s4/1:%d\n",i);
i=index(s2,s4,3);printf("index/s2/s4/3:%d\n",i);
strinsert(s1,2,s4);
printf("insert/s1/2/s4:");
strprint(s1);
strdelete(s1,2,3);
printf("delete/s1/2/3:");
strprint(s1);
strassign(s5,b);
printf("s5:");
strprint(s5);
replace(t,s4,s5);
printf("replace/s4/s5:");
strprint(t);
clearstring(s1);
printf("clear/s1:");
strprint(s1);
printf("s1/length:%d/empty(1 :Yes):%d\n",strlength(s1),strempty(s1));
}