主题:求数据结构串的问题,求高手指点
#define MAXSIZE 100 /*串的最大长度*/
#include "stdio.h"
typedef struct
{
char ch[MAXSIZE]; /*存放串字符*/
int len; /*存放串的实际长度*/
} SqString;
void Assign(SqString &s,char t[]) /*赋值操作函数*/
{
int i=0;
while (t[i]!='\0')
{
s.ch[i]=t[i];
i++;
}
s.len=i;
}
void Input(SqString &s)
{
int i;
char t[MAXSIZE];
fflush(stdin); /*清空缓冲区*/
for(i=0; (t[i]=getchar()) != '\n'; i++);
t[i] = '\0';
Assign(s,t); /*调用赋值操作函数*/
}
void InitStr(SqString &s)
{
s.len = 0;
}
void StrCopy(SqString &s,SqString t)
{
int i;
for (i=0;i<t.len;i++) /*复制字符串t的内容到字符串s中*/
s.ch[i]=t.ch[i];
s.len=t.len; /*复制t的长度给s*/
}
int StrLength(SqString s)
{
return s.len;/*返回长度*/
}
int StrEqual(SqString s,SqString t)
{
int i=0;
if (s.len!=t.len)
return(0);/*如果长度不等,则两字符串不相等*/
else /*如果长度相等,则判断每个字符是否相等*/
{
for (i=0; i<s.len;i++)
if (s.ch[i]!=t.ch[i])
return(0);
printf("字符串相等\n");
return(1);
}
}
SqString Concat(SqString s,SqString t)
{
SqString r; /*定义字符串r用来保存链接后的字符串*/
int i,j;
for (i=0;i<s.len;i++) /*把字符串s复制到r中*/
r.ch[i]=s.ch[i];
for(j=0;j<t.len;j++) /*把字符串t紧接着复制到r中*/ ;
r.ch[j+s.len]=t.ch[j];
r.len=s.len+t.len; /*设置r的长度*/
return(r);
}
SqString SubStr(SqString s,int i,int j)
{
SqString t;
int k;
if (i<1 || i>s.len || j<1 || i+j>s.len+1)
t.len=0;
else
{
for (k=i-1;k<i+j;k++)
t.ch[k-i+1]=s.ch[k];
t.len=j;
}
return(t);
}
int Index(SqString s,SqString t)
{
int i=0,j=0,k; /*i和j分别扫描主串s和子串t*/
while (i<s.len && j<t.len)
{ if (s.ch[i]=t.ch[j]) //对应字符相同,继续比较下一对
{ i++;j++; }
else //主子串指针回溯重新开始下一次匹配
{ i=i-j+1;j=0; }
}
if (j>=t.len) k=i-s.len; //求出第一个字符的位置
else k=-1; //置特殊值-1
return(k);
}
int InsStr(SqString &s,int i,SqString t)
{
int j;
if (i>s.len+1 || i<1)
return(0);
else
{
for (i=0;i<t.len;i++) /*在s中为待插入子串t移动出足够的存储单元*/
s.len++;
for (j=0;j<t.len;j++) /*在第i个位置开始插入子串t*/
s.ch[i+j-1]=t.ch[j];
s.len=s.len+t.len; /*改变s的长度*/
return(1);
}
}
int DelStr(SqString &s,int i,int j)
{
int k;
SqString str;
str.len=0;
if (i>s.len||i<1||i+j>s.len+1) /*如果位置不对则无法进行删除*/
return(0);
else
{ for (k=0;k<i-1;k++) /*删除第i个位置开始的j个字符*/
str.ch[k]=s.ch[k];
for(k=i+j-1;k<s.len;k++)
str.ch[k-j]=s.ch[k];
s.len=s.len-j; /*s的长度改变*/
return(1);
}
}
SqString RepStrAll(SqString &s,SqString s1,SqString s2)
{
int i;
i=Index(s,s1);
while (i>=0)
{
DelStr(s,i,s1.len); /*删除i位置的s1*/
InsStr(s,i,s2); /*在i位置插入s2*/
i=Index(s,s1); /*查找下一个s1所在的位置i*/
}
return(s);
}
void DispStr(SqString s)
{ int i;
if(s.len>0)
{
for(i=0;i<s.len;i++)
printf("%c",s.ch[i]);
printf("\n");
}
else
printf("空字符串\n");
}
void Menu()
{
printf("===========顺序串基本操作====================\n");
printf(" 1=======输入字符串s1和s2\n");
printf(" 2=======显示字符串及其长度\n");
printf(" 3=======判断s1和s2是否相等\n");
printf(" 4=======复制s2到s3中\n");
printf(" 5=======连接s1和s2到s3中\n");
printf(" 6=======求s3中指定位置指定长度的字串\n");
printf(" 7=======求s3中某一字串的位置\n");
printf(" 8=======在s3中插入字串\n");
printf(" 9=======在s3中删除字串\n");
printf(" 10======查找并替换s3中的字串\n");
printf(" 0=======退出\n");
printf("==============================================\n");
printf("请选择:");}
void main()
{
int i,j,m;
SqString s1,s2,s3,t,str;
Menu();
do{
scanf("%d",&m);
switch(m)
{
case 1:
printf("请输入s1:");
Input(s1);
printf("请输入s2:");
Input(s2);
printf("请选择操作编号,输入0退出:\n");
break;
case 2:
printf("s1:");
DispStr(s1);
StrLength(s1);
printf("\n");
printf("s2:");
DispStr(s2);
StrLength(s2);
printf("\n");
printf("s3:");
DispStr(s3);
StrLength(s3);
printf("\n");
break;
case 3:
StrEqual(s1,s2);
printf("请选择:");
break;
case 4:
StrCopy(s3,s2);
DispStr(s3);
printf("请选择:");
break;
case 5:
Concat(s3,s1);
Concat(s1,s2);
DispStr(s3);
printf("请选择:");
break;
case 6:
scanf("%d",&i);
scanf("%d",&j);
SubStr(str,i,j);
DispStr(str);
printf("请选择:");
break;
case 7:
Input(t);
Index(s3,t);
printf("请选择:");
break;
case 8:
InsStr(s3,i,t);
Input(t);
scanf("%d",&i);
DispStr(s3);
printf("请选择:");
break;
case 9:
DelStr(s3,i,j);
scanf("%d",&i);
scanf("%d",&j);
DispStr(s3);
break;
case 10:
RepStrAll(s3,s1,s2);
Input(s1);
Input(s2);
DispStr(s3);
printf("请选择:");
break;
case 0:
break;
default:break;
}
}while(m<=10);
}
如果你懂,或者不明白我问题的意思,麻烦加我Q1264553284,万分感激!!!
#include "stdio.h"
typedef struct
{
char ch[MAXSIZE]; /*存放串字符*/
int len; /*存放串的实际长度*/
} SqString;
void Assign(SqString &s,char t[]) /*赋值操作函数*/
{
int i=0;
while (t[i]!='\0')
{
s.ch[i]=t[i];
i++;
}
s.len=i;
}
void Input(SqString &s)
{
int i;
char t[MAXSIZE];
fflush(stdin); /*清空缓冲区*/
for(i=0; (t[i]=getchar()) != '\n'; i++);
t[i] = '\0';
Assign(s,t); /*调用赋值操作函数*/
}
void InitStr(SqString &s)
{
s.len = 0;
}
void StrCopy(SqString &s,SqString t)
{
int i;
for (i=0;i<t.len;i++) /*复制字符串t的内容到字符串s中*/
s.ch[i]=t.ch[i];
s.len=t.len; /*复制t的长度给s*/
}
int StrLength(SqString s)
{
return s.len;/*返回长度*/
}
int StrEqual(SqString s,SqString t)
{
int i=0;
if (s.len!=t.len)
return(0);/*如果长度不等,则两字符串不相等*/
else /*如果长度相等,则判断每个字符是否相等*/
{
for (i=0; i<s.len;i++)
if (s.ch[i]!=t.ch[i])
return(0);
printf("字符串相等\n");
return(1);
}
}
SqString Concat(SqString s,SqString t)
{
SqString r; /*定义字符串r用来保存链接后的字符串*/
int i,j;
for (i=0;i<s.len;i++) /*把字符串s复制到r中*/
r.ch[i]=s.ch[i];
for(j=0;j<t.len;j++) /*把字符串t紧接着复制到r中*/ ;
r.ch[j+s.len]=t.ch[j];
r.len=s.len+t.len; /*设置r的长度*/
return(r);
}
SqString SubStr(SqString s,int i,int j)
{
SqString t;
int k;
if (i<1 || i>s.len || j<1 || i+j>s.len+1)
t.len=0;
else
{
for (k=i-1;k<i+j;k++)
t.ch[k-i+1]=s.ch[k];
t.len=j;
}
return(t);
}
int Index(SqString s,SqString t)
{
int i=0,j=0,k; /*i和j分别扫描主串s和子串t*/
while (i<s.len && j<t.len)
{ if (s.ch[i]=t.ch[j]) //对应字符相同,继续比较下一对
{ i++;j++; }
else //主子串指针回溯重新开始下一次匹配
{ i=i-j+1;j=0; }
}
if (j>=t.len) k=i-s.len; //求出第一个字符的位置
else k=-1; //置特殊值-1
return(k);
}
int InsStr(SqString &s,int i,SqString t)
{
int j;
if (i>s.len+1 || i<1)
return(0);
else
{
for (i=0;i<t.len;i++) /*在s中为待插入子串t移动出足够的存储单元*/
s.len++;
for (j=0;j<t.len;j++) /*在第i个位置开始插入子串t*/
s.ch[i+j-1]=t.ch[j];
s.len=s.len+t.len; /*改变s的长度*/
return(1);
}
}
int DelStr(SqString &s,int i,int j)
{
int k;
SqString str;
str.len=0;
if (i>s.len||i<1||i+j>s.len+1) /*如果位置不对则无法进行删除*/
return(0);
else
{ for (k=0;k<i-1;k++) /*删除第i个位置开始的j个字符*/
str.ch[k]=s.ch[k];
for(k=i+j-1;k<s.len;k++)
str.ch[k-j]=s.ch[k];
s.len=s.len-j; /*s的长度改变*/
return(1);
}
}
SqString RepStrAll(SqString &s,SqString s1,SqString s2)
{
int i;
i=Index(s,s1);
while (i>=0)
{
DelStr(s,i,s1.len); /*删除i位置的s1*/
InsStr(s,i,s2); /*在i位置插入s2*/
i=Index(s,s1); /*查找下一个s1所在的位置i*/
}
return(s);
}
void DispStr(SqString s)
{ int i;
if(s.len>0)
{
for(i=0;i<s.len;i++)
printf("%c",s.ch[i]);
printf("\n");
}
else
printf("空字符串\n");
}
void Menu()
{
printf("===========顺序串基本操作====================\n");
printf(" 1=======输入字符串s1和s2\n");
printf(" 2=======显示字符串及其长度\n");
printf(" 3=======判断s1和s2是否相等\n");
printf(" 4=======复制s2到s3中\n");
printf(" 5=======连接s1和s2到s3中\n");
printf(" 6=======求s3中指定位置指定长度的字串\n");
printf(" 7=======求s3中某一字串的位置\n");
printf(" 8=======在s3中插入字串\n");
printf(" 9=======在s3中删除字串\n");
printf(" 10======查找并替换s3中的字串\n");
printf(" 0=======退出\n");
printf("==============================================\n");
printf("请选择:");}
void main()
{
int i,j,m;
SqString s1,s2,s3,t,str;
Menu();
do{
scanf("%d",&m);
switch(m)
{
case 1:
printf("请输入s1:");
Input(s1);
printf("请输入s2:");
Input(s2);
printf("请选择操作编号,输入0退出:\n");
break;
case 2:
printf("s1:");
DispStr(s1);
StrLength(s1);
printf("\n");
printf("s2:");
DispStr(s2);
StrLength(s2);
printf("\n");
printf("s3:");
DispStr(s3);
StrLength(s3);
printf("\n");
break;
case 3:
StrEqual(s1,s2);
printf("请选择:");
break;
case 4:
StrCopy(s3,s2);
DispStr(s3);
printf("请选择:");
break;
case 5:
Concat(s3,s1);
Concat(s1,s2);
DispStr(s3);
printf("请选择:");
break;
case 6:
scanf("%d",&i);
scanf("%d",&j);
SubStr(str,i,j);
DispStr(str);
printf("请选择:");
break;
case 7:
Input(t);
Index(s3,t);
printf("请选择:");
break;
case 8:
InsStr(s3,i,t);
Input(t);
scanf("%d",&i);
DispStr(s3);
printf("请选择:");
break;
case 9:
DelStr(s3,i,j);
scanf("%d",&i);
scanf("%d",&j);
DispStr(s3);
break;
case 10:
RepStrAll(s3,s1,s2);
Input(s1);
Input(s2);
DispStr(s3);
printf("请选择:");
break;
case 0:
break;
default:break;
}
}while(m<=10);
}
如果你懂,或者不明白我问题的意思,麻烦加我Q1264553284,万分感激!!!