//头文件
#include <stdio.h>
#include <stdlib.h>
/*定义串的最大长度*/
#define MAXLEN 40
typedef struct { /*串结构定义*/
char ch[MAXLEN];
int len;
}SString;
/*创建字符串*/
void createstring(SString *s)
{
int i,j;
char c;
fflush(stdin);
printf("请输入要建立的串的长度:");
scanf("%d",&j);
for(i=0; i<j; i++)
{
printf("请输入串的第%d个字符:",i+1);
fflush(stdin);
scanf("%c",&c);
s->ch[i] = c;
}
s->len = j;
}
/*输出字符串*/
void output(SString *s)
{
int i;
for (i=0;i<s->len;i++)
printf("%c ",s->ch[i]);
printf("\n");
}
/*插入子字符串*/
int StrInsert(SString *s, int pos, SString t)
/*在串s中下标为pos的字符之前插入串t */
{
int i;
if (pos<0 || pos>s->len) /*插入位置不合法*/
return(0);
if (s->len + t.len<=MAXLEN) /*插入后串长≤MAXLEN*/
{
for (i=s->len + t.len-1;i>=t.len + pos;i--)
s->ch[i]=s->ch[i-t.len];
for (i=0;i<t.len;i++)
s->ch[i+pos]=t.ch[i];
s->len=s->len+t.len;
}
else
{
if (pos+t.len<=MAXLEN) /*插入后串长>MAXLEN,但串t的字符序列可以全部插入*/
{
for (i=MAXLEN-1;i>t.len+pos-1;i--)
s->ch[i]=s->ch[i-t.len];
for (i=0;i<t.len;i++)
s->ch[i+pos]=t.ch[i];
s->len=MAXLEN;
}
else /*插入后串长>MAXLEN,并且串t的部分字符也要舍弃*/
{
for (i=0;i<MAXLEN-pos;i++)
s->ch[i+pos]=t.ch[i];
s->len=MAXLEN;
}
return(1);
}
}
/*字符串比较*/
int StrCompare(SString s, SString t)
/*若串s和t相等则返回0;若s>t则返回正数;若s<t则返回负数*/
{
int i;
for (i=0;i<s.len&&i<t.len;i++)
if (s.ch[i]!=t.ch[i])
return(s.ch[i] - t.ch[i]);
return(s.len - t.len);
}
/*字符串查找*/
int StrIndex(SString s,int pos, SString t)
/*求从主串s的下标pos起,串t第一次出现的位置,成功返回位置序号,不成功返回-1*/
{
int i, j, start;
if (t.len==0)
return(0); /* 模式串为空串时,是任意串的匹配串 */
start=pos;
i=start;
j=0; /* 主串从pos开始,模式串从头(0)开始 */
while (i<s.len && j<t.len)
if (s.ch[i]==t.ch[j])
{
i++;
j++;
} /* 当前对应字符相等时推进 */
else
{
start++; /* 当前对应字符不等时回溯 */
i=start;
j=0; /* 主串从start+1开始,模式串从头(0)开始*/
}
if (j>=t.len)
return(start); /* 匹配成功时,返回匹配起始位置 */
else
return(-1); /* 匹配不成功时,返回-1 */
}
/*实现插入字符串*/
void toInsert(SString *str1,SString str2){
int i,j,k,pos;
int flag=0;
printf("请输入要插入的位置:");
scanf("%d",&pos);
flag=StrInsert(str1,pos-1,str2);
if(flag == 0)
printf("插入操作失败!");
else
{
printf("插入后串为:\n");
output(str1);
}
}
/*实现字符串比较*/
void toCompare(SString *str1, SString str2){
int flag=0;
flag=StrCompare(*str1,str2);
printf("字符大小关系为:\n");
if(flag == 0)
printf("字符串相等!");
else
{
if(flag < 0)
printf("字符串1小于字符串2!\n\n");
else
printf("字符串1大于字符串2!\n\n");
}
}
/*实现查找*/
void toIndex(SString *str1){
int pos;
int flag=0;
SString youstring;
printf("请输入要查找的字符串:\n");
createstring(&youstring);
printf("请输入要查找的起始位置:");
scanf("%d",&pos);
flag=StrIndex(*str1,pos,youstring);
if(flag == -1)
printf("查找失败!");
else
{
printf("出现的位置为:%d\n",flag+1);
}
}
/*主函数、程序的入口*/
int main()
{
SString *str1;
SString str2;
str1 = (SString *)malloc(sizeof(SString));
str1->len = 0;
printf("建立字符串1:\n");
createstring(str1);
printf("建立字符串2:\n");
createstring(&str2);
//插入字符串
toInsert(str1,str2);
printf("**************************************************\n");
//比较字符串
toCompare(str1,str2);
printf("**************************************************\n");
//查找字符串
toIndex(str1);
printf("**************************************************\n");
return 0;
}
数据结构x实验三--串的操作
最新推荐文章于 2019-04-24 00:05:19 发布