C语言:顺序串基本操作

顺序串基本操作

定长顺序串类型定义

typedef struct{
	char ch[MAXLEN];
	int len;
}SString;

顺序串的初始化

void InitString(SString *s)
{
	gets_s(s->ch);
	s->len = strlen(s->ch);
}

顺序串插入操作

int StrInsert(SString *s,int pos,SString t)
{
	//在串s中下为pos的字符之前插入串t
	int i;
	//插入位置不合法
	if(pos < 0||pos > s->len) return 0;
	//插入后串长≤MAXLEN
	if(s->len + t.len <= 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;
	}
	//插入后串长>MAXLEN,但串t的字符序列可以全部插入
	else if(pos + t.len <= MAXLEN){
		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;
	}
	//插入后串长>MAXLEN,并且串t的部分字符也要舍弃
	else{
		for(i = 0;i < MAXLEN - pos;i++)
			s->ch[i+pos] = t.ch[i];	
		s->len = MAXLEN;
	}
	return 1;
}

顺序串删除操作

int StrDelete(SString *s,int pos,int len)
{
	//在串s中删除从下标pos起len个字符
	int i;
	//删除位置不合法
	if(pos < 0||pos > (s->len - len)) return 0;
	for(i = pos + len;i < s->len;i++)
		s->ch[i-len] = s->ch[i];
	s->len = s->len - len;
	return 1;
}

顺序串比较操作

int StrCompare(SString s,SString 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);
}

顺序串子串定位(BF算法)

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;
	while(i < s.len&&j < t.len)
	{
		if(s.ch[i] == t.ch[j]){
			i++;
			j++;
		}
		else{
			start++;
			i = start;
			j = 0;
		}
	}
	if(j >= t.len) return start;
	else return -1;
}

顺序串输出操作

void PrintString(SString s)
{
	for(int i = 0;i < s.len;i++)
		printf("%c",s.ch[i]);
}

Main函数测试

int main()
{
	int pos;
	SString s1,s2;
	InitString(&s1);
	InitString(&s2);
	if(StrCompare(s1,s2)) printf("s1>s2");
	else if(StrCompare(s1,s2)==0) printf("s1=s2");
	else printf("s1<s2");
	scanf_s("%d",&pos);
	if(StrInsert(&s1,pos,s2)){
		printf("插入成功:");
		PrintString(s1);
	}else printf("插入失败");
	int len;
	scanf_s("%d%d",&pos,&len);
	if(StrDelete(&s1,pos,len))
	{	
		printf("删除成功:");
		PrintString(s1);
	}else printf("删除失败");
	scanf_s("%d",&pos);
	if(StrIndex(s1,pos,s2)) 
		printf("找到字串,且字串第一个字母第一次出现的位置序号为%d\n",StrIndex(s1,pos,s2));
	else printf("无法找到该字串\n");
	return 0;
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值