数据结构中串的各种算法

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

#define ERROR 0
#define OK 1
#define OVERFLOW
#define maxstrlen 100
#include
#include
#include
#include
typedef int status;
typedef unsigned char sstring[maxstrlen+1];//0号单元存放字符串的长度
status strassign(sstring &t,char *chars);//生成串
status strtraver(sstring s);//输出串
status concat(sstring &t,sstring s1,sstring s2);//连接串
status substring(sstring &sub,sstring s,int pos,int len);//用sub返回s的第pos个字符起长度为len的子串
status strcompare(sstring s,sstring t);//比较串
int index(sstring s,sstring t,int pos);//若s中存在t,返回t在主串中第pos个字符后第一次出现的位置


status strassign(sstring &t,char* chars)//生成串
{
int i=0,len=0;
chars=new char[maxstrlen];
gets(chars);
while(*(chars+i)!='\0'){
t[i+1]=chars[i];
i++;
len++;
}
t[0]=len;
/*int len=0,i=1;char s;
cout<<"请输入一串字符"<while((t[i++]=getchar())!='\n')
{
len++;
}
t[0]=len;*/
return OK;
}
status strtraver(sstring s){
int i=1;
while(i<=s[0]){
cout<i++;
}
cout<cout<<"长度:"<return OK;
}
status concat(sstring &t,sstring s1,sstring s2)//连接串
{
int uncut;
cout<<"输出s1和s2连接后的字符串";
if(s1[0]+s2[0]<=maxstrlen){
for(int i=1;i<=s1[0];i++)
t[i]=s1[i];
for(i=s1[0]+1;i<=s1[0]+s2[0];i++)
t[i]=s2[i-s1[0]];
t[0]=s1[0]+s2[0];
cout<<"(未截断):"<strtraver(t);
uncut=true;
}
else if(s1[0]for(int i=1;i<=s1[0];i++)
t[i]=s1[i];
for(i=s1[0]+1;i<=maxstrlen;i++)
t[i]=s2[i-s1[0]];
t[0]=maxstrlen;
cout<<"(截断):"<strtraver(t);
uncut=false;
}
else if(s1[0]==maxstrlen){
for(int i=1;i<=maxstrlen;i++)
t[i]=s1[i];
t[0]=maxstrlen;
cout<<"(截断)(仅取s1):"<strtraver(t);
uncut=false;
}
else{
cout<cout<<"s1过大,内存不足"<uncut=false;
}
return uncut;
}
status substring(sstring &sub,sstring s,int pos,int len)//用sub返回s的第pos个字符起长度为len的子串
{
sub[0]=len;
if(pos<1||pos>s[0]||len<0||len>s[0]-pos+1){
return 0;
}
for(int i=1;i<=len;i++)
sub[i]=s[pos+i-1];
return 1;

}
int strcompare(sstring s,sstring t){
if(s[0]>t[0]){
for(int i=1;i<=t[0];i++){
if(s[i]return -1;
}
}
return 1;
}
else if(s[0]for(int i=1;i<=s[0];i++){
if(s[i]>t[i]){
return 1;
}
}
return -1;
}
else{ //s[0]==t[0]的情况
for(int i=1;i<=t[0];i++){
if(s[i]return -1;
}
if(s[i]>t[i]){
return 1;
}
}
return 0;
}
}
int index(sstring s,sstring t,int pos)//若s中存在t,返回t在主串中第pos个字符后第一次出现的位置
{
if(pos>0){
int i=pos;
sstring sub;
while(i<=s[0]-t[0]+1){
substring(sub,s,i,t[0]);
if(strcompare(sub,

t)!=0)
i++;
else{
cout<<"子串在主串的第"<return i;
}
}
if(i>s[0]-t[0]+1){
cout<<"主串的第"<return -1;
}
}
cout<<"查询位置不合理"<return 0;
}



int main()
{
sstring s1,s2,t,t1,t2,sub,s;
int pos,len,l;
char* chars;
cout<<"输入字符串s1:"<strassign(s1,chars);
cout<<"输入要查找的位置和长度:";
cin>>pos;
cin>>len;
substring(sub,s1,pos,len);
if(substring(sub,s1,pos,len)==0)
cout<<"输入位置或长度有误"<else{
cout<<"输出字符串s1的第"<strtraver(sub);
}
cout<cout<<"输入字符串s2:"<strassign(s2,chars);
concat(t,s1,s2);
cout<cout<<"------------------------"<if(strcompare(s1,s2)<0)
cout<<"字符串s1小于字符串s2"<if(strcompare(s1,s2)>0)
cout<<"字符串s1大于字符串s2"<if(strcompare(s1,s2)==0)
cout<<"字符串s1等于字符串s2"<cout<<"------------------------"<cout<<"要查询的主串t1:"<strassign(t1,chars);
cout<<"要查询的子串t2:"<strassign(t2,chars);
cout<<"输入开始查询的位置:";
cin>>pos;
index(t1,t2,pos);
return 0;
}

相关文档
最新文档