编写程序,实现顺序串(堆分配存储结构)的各种基本运算
函数操作
Status StrAssign(HString &T, char * chars)//生成一个其值等于串常量chars的串T
int StrLength(HString S)//返回S的元素个数,称为串的长度
int StrCompare(HString S, HString T)//若S>T,则返回值>0;若S=T,则返回值=0;若S<T则返回值<0
Status ClearString(HString &S)//将S清空
Status Concat(HString &T, HString S1, HString S2)//用T返回由S1和S2联接而成的新串
Status SubString(HString &Sub, HString S, int pos, int len)
//用Sub返回串S的第pos个字符起长度为len的子串。
int Index_BF(HString S, HString T, int pos){//朴素模式匹配算法
// 返回子串T在主串S中第pos个字符之后的位置,若不存在,则函数值为0。
Status StrInsert(HString &S,int pos,HString T)//在串S的第pos个字符之前插入串T。
Status StrDelete(HString &S,int pos,int len)//从串S中删除第pos个字符起长度为len的子串
代码实现
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define MaxSize 100
typedef int Status;
typedef struct
{
char data[MaxSize];
int length;
}HString;
Status StrAssign(HString &T,char *chars);//生成一个其值等于串常量chars的串T
int StrLength(HString S);//返回S的元素个数,称为串的长度
int StrCompare(HString S, HString T);//若S>T,则返回值>0;若S=T,则返回值=0;若S<T则返回值<0
Status ClearString(HString &S);//将S清空
Status Concat(HString &T, HString S1, HString S2);//用T返回由S1和S2联接而成的新串
Status SubString(HString &Sub, HString S, int pos, int len);
//用Sub返回串S的第pos个字符起长度为len的子串。
int Index_BF(HString S, HString T, int pos);//朴素模式匹配算法
// 返回子串T在主串S中第pos个字符之后的位置,若不存在,则函数值为0。
Status StrInsert(HString &S,int pos,HString T);//在串S的第pos个字符之前插入串T。
Status StrDelete(HString &S,int pos,int len);//从串S中删除第pos个字符起长度为len的子串
void DispStr(HString s);
Status StrAssign(HString &T,char *chars)//生成一个其值等于串常量chars的串T
{
int i=0;
for(;chars[i]!='\0';i++)
{
T.data[i]=chars[i];
}
T.length=i;
return true;
}
int StrLength(HString S)//返回S的元素个数,称为串的长度
{
return S.length;
}
int StrCompare(HString S, HString T)//若S>T,则返回值>0;若S=T,则返回值=0;若S<T则返回值<0
{
return S.length-T.length;
}
Status ClearString(HString &S)//将S清空
{
S.length=0;return true;
}
Status Concat(HString &T, HString S1, HString S2)//用T返回由S1和S2联接而成的新串
{
int i=0,j=0;
for(;i<S1.length;i++)
T.data[i]=S1.data[i];
for(j=0;j<S2.length;j++)
T.data[i+j]=S2.data[j];
T.length=S1.length+S2.length;
return true;
}
Status SubString(HString &Sub, HString S, int pos, int len)//用Sub返回串S的第pos个字符起长度为len的子串
{
int i,j=0;
for(i=pos-1;i<pos+len-1;i++,j++)
Sub.data[j]=S.data[i];
Sub.length=len;
return true;
}
int Index_BF(HString S, HString T, int pos)//朴素模式匹配算法
// 返回子串T在主串S中第pos个字符之后的位置,若不存在,则函数值为0。
{
int i,j,sum=0;
for(i=pos;i<S.length;i++)
{
sum=0;
for(j=0;j<T.length;j++)
{
if(S.data[i+j]!=T.data[j])
break;
if(S.data[i+j]==T.data[j])
sum++;
if(sum>=T.length)
return i+1;//返回主串的匹配首字符的位置
}
}
return 0;
}
Status StrInsert(HString &S,int pos,HString T)//在串S的第pos个字符之前插入串T。
{
int j;
HString str;
str.length=0;
if(pos<=0||pos>S.length+1) return 0;//参数不正确,返回空串
for(j=0;j<pos-1;j++)//将S.data[0...i-2]复制到str
str.data[j]=S.data[j];
for(j=0;j<T.length;j++)//将S.data[0....s2.length-1]复制到str
str.data[pos+j-1]=T.data[j];
for(j=pos-1;j<S.length;j++)//将S.data[i-1...s1.length-1]复制到str
str.data[T.length+j]=S.data[j];
str.length=S.length+T.length;
S=str;
return 1;
}
Status StrDelete(HString &S,int pos,int len)//从串S中删除第pos个字符起长度为len的子串
{
int i;
HString str;
for(i=0;i<pos-1;i++)
str.data[i]=S.data[i];
for(;i<S.length-len;i++)
str.data[i]=S.data[i+len];
str.length=S.length-len;
S=str;
return true;
}
void DispStr(HString s)
{
int i;
if(s.length>0)
{
for(i=0;i<s.length;i++)
printf("%c",s.data[i]);
printf("\n");
}
}
int main()
{
HString S,T,Sub,xx;
StrAssign(S,"abcdefghijklmnopqrstuvwxyz");//创造一个主串
DispStr(S);
printf("S串的长度为%d\n",StrLength(S));
StrAssign(T,"def");//创造一个模式串
DispStr(T);
printf("比较S和T的长度:");
if(StrCompare(S, T))printf("str比较长\n");
else printf("T比较长\n");
printf("返回子串T在主串S中第3个字符之后的位置,在主串中的位置为%d\n",Index_BF(S,T,3));// 返回子串T在主串sS中第pos个字符之后的位置,若不存在,则函数值为0。
printf("用Sub返回串S的第2个字符起长度为2的子串:");
SubString(Sub,S,2,2);//用Sub返回串S的第pos个字符起长度为len的子串
DispStr(Sub);
printf("用xx返回由Sub和T联接而成的新串: ");
Concat(xx, Sub, T);//用xx返回由Sub和T联接而成的新串
DispStr(xx);
printf("在串S的第3个字符之前插入串T:");
StrInsert(S,3,T);//在串S的第3个字符之前插入串T
DispStr(S);
printf("从串S中删除第2个字符起长度为2的子串:");
StrDelete(S,2,2);//从串S中删除第2个字符起长度为2的子串
DispStr(S);
printf("将T清空\n");
ClearString(T);//将T清空
printf("T的长度为%d",StrLength(T));
}
输出
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)