您的位置:首页 > 其它

字符串定长顺序存储表示模板

2015-12-11 03:08 393 查看
///page71
///测试样例:nihao
///output
/*5
5    nihao
0
10 nihaonihao
4  aoni
4
14 nihaoaoninihao
9 noninihao
13 nombxzmbxzhao*/
#include <stdio.h>
#include <stdlib.h>
#include<string.h>
#include <malloc.h>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
#define maxlen 255
typedef  char sstring[maxlen+1];
typedef int status;
int StrLength(sstring s){
int cnt=0;
for(int i=0;s[i];i++)
cnt++;
return cnt;
}
status StrAssign(sstring &t,char *chars){
if(StrLength(chars)>maxlen)
return ERROR;
t[0]=StrLength(chars);
for(int i=1;i<=t[0];i++)
t[i]=*(chars+i-1);
t[t[0]+1]='\0';
}
void clears(sstring &s){
s[0]=0;
}
void StrCopy(sstring &s,sstring t){// 由串S复制得串T
int i;
for(i=0;i<=t[0];i++)
s[i]=t[i];
s[s[0]+1]='\0';
}
status StrEmpty(sstring s){// 若S为空串,则返回TRUE,否则返回FALSE
if(s[0]==0)
return TRUE;
else
return FALSE;
}
int StrCompare(sstring s,sstring t){// 初始条件:串S和T存在。操作结果:若S>T,则返回值>0;
//若S=T,则返回值=0;若S<T,则返回值<0
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];
}
status concat(sstring &t,sstring s1,sstring s2){
if(s1[0]+s2[0]<=maxlen){
for(int i=1;i<=s1[0];i++)
t[i]=s1[i];
for(int i=1;i<=s2[0];i++)
t[i+s1[0]]=s2[i];
t[0]=s1[0]+s2[0];
t[t[0]+1]='\0';
}
else if(s1[0]<maxlen){
for(int i=1;i<=s1[0];i++)
t[i]=s1[i];
for(int i=1;i<=maxlen-s1[0];i++)
t[i+s1[0]]=s2[i];
t[0]=maxlen;
}
else{
for(int i=1;i<=maxlen;i++)
t[i]=s1[i];
t[0]=maxlen;
}
}
status SubString(sstring &Sub,sstring S,int pos,int len)// 用Sub返回串S的第pos个字符起长度为len的子串。
{
int i;
if(pos<1||pos>S[0]||len<0||len>S[0]-pos+1)
return ERROR;
for(i=1;i<=len;i++)
Sub[i]=S[pos+i-1];
Sub[0]=len;
Sub[len+1]='\0';
return OK;
}
int Index(sstring S,sstring T,int pos){// 返回子串T在主串S中第pos个字符之后的位置。若不存在,则函数值为0。
int i,j;
if(1<=pos&&pos<=S[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;
}
else
return 0;
}
status StrInsert(sstring &S,int pos,sstring T){// 在串S的第pos个字符之前插入串T。
int i;                                     //完全插入返回TRUE,部分插入返回FALSE
if(pos<1||pos>S[0]+1)
return ERROR;
if(S[0]+T[0]<=maxlen){ // 完全插入
for(i=S[0];i>=pos;i--)
S[i+T[0]]=S[i];
for(i=pos;i<pos+T[0];i++)
S[i]=T[i-pos+1];
S[0]+=T[0];
S[S[0]+1]='\0';
return TRUE;
}
else{ // 部分插入
for(i=maxlen;i>=pos+T[0];i--)
S[i]=S[i-T[0]];
for(i=pos;i<pos+T[0]&&i<=maxlen;i++)
S[i]=T[i-pos+1];
S[0]=maxlen;

return FALSE;
}
}
status StrDelete(sstring &S,int pos,int len){//从串S中删除第pos个字符起长度为len的子串
int i;
if(pos<1||pos>S[0]-len+1||len<0)
return ERROR;
for(i=pos+len;i<=S[0];i++)
S[i-len]=S[i];
S[0]-=len;
S[S[0]+1]='\0';
return OK;
}

status Replace(sstring &S,sstring T,sstring V) // 用V替换主串S中出现的所有与T相等的不重叠的子串
{
int i=1; // 从串S的第一个字符起查找串T
status k;
if(StrEmpty(T)) // T是空串
return ERROR;
do
{
i=Index(S,T,i); // 结果i为从上一个i之后找到的子串T的位置
if(i) // 串S中存在串T
{
StrDelete(S,i,T[0]); // 删除该串T
k=StrInsert(S,i,V); // 在原串T的位置插入串V
if(!k) // 不能完全插入
return ERROR;
i+=V[0]; // 在插入的串V后面继续查找串T
}
}while(i);
S[S[0]+1]='\0';
return OK;
}

int main(){
sstring s,t,in;
scanf("%s",in);
//scanf("%s",t);
StrAssign(t,in);
printf("%d\n",t[0]);

StrCopy(s,t);
printf("%d    %s\n",s[0],s+1);

printf("%d\n",StrCompare(s,t));

sstring all;
concat(all,s,t);
printf("%d %s\n",all[0],all+1);

sstring sub;
SubString(sub,all,4,4);
printf("%d  %s\n",sub[0],sub+1);

int locate=Index(all,sub,2);
printf("%d\n",locate);

StrInsert(all,6,sub);
printf("%d %s\n",all[0],all+1);

StrDelete(all,2,5);
printf("%d %s\n",all[0],all+1);

sstring s1,s2;
s1[0]=2;
s1[1]='n',s1[2]='i',s1[3]='\0';
s2[0]=4,s2[1]='m',s2[2]='b',s2[3]='x',s2[4]='z',s2[5]='\0';
Replace(all,s1,s2);
printf("%d %s\n",all[0],all+1);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: