数据结构之串——顺序串

串分为顺序串,堆串,快链串三种

#include<stdio.h>
#define MAXLEN 40
typedef struct  String{
	char ch[MAXLEN];
	int len;//该串的长度 
}SString;
//顺序串插入函数,将字符串t插入字符串s的pos位置之前 
//1.S->len+t->len<=MAXLEN
//2.S->len+t->len>MAXLEN而且 pos+len<=MAXLEN,字符串t能够完全插入
//3.s->len+t->len>MAXLEN而且pos+len>MAXLEN,字符串t不能够完全插入 
bool StrInsert(SString *s,int pos,SString t)
{
	int i;
	//插入位置不合法 
	if(pos<0||pos>MAXLEN)
		return false;
	//插入后长度小于MAXLEN 
	if(s->len+t.len<=MAXLEN)
	{
		//将s串下半部分放在正确位置
		for(i=s->len+t.len-1;i>=pos+t.len;i--)
			s->ch[i]=s->ch[i-t.len];
		//将t串插入pos
		for(i=0;i<t.len;i++)
			s->ch[pos+i]=t.ch[i];
		//改变新串的长度值len
		s->len=s->len+t.len; 
	}
	//插入后串长>MAXLEN,但是字符串t能够完全插入
	else if(pos+t.len<=MAXLEN)
	{
	//将s串下半部分放在正确位置
		for(i=MAXLEN-1;i>=pos+t.len;i--)
			s->ch[i]=s->ch[i-t.len];
	//将t串插入正确位置
		for(i=0;i<t.len;i++)
			s->ch[pos+i]=t->ch[i];
	//改变新串的长度
		s->len=MAXLEN;
	}
	//插入后串长>MAXLEN,且字符串t不能完全插入 
	else if(pos+t.len>MAXLEN)
	{
		//将t串部分元素放在正确位置
		for(i=MAXLEN-1;i>=pos;i--)
		{
			s->ch[i]=t[i-pos];
		}
		s->len=MAXLEN
		
		
	}
	return true;
}

//顺序串删除函数
//从顺序串中pos的位置开始删除len个元素:len为0时不删除,len>0时从pos开始一直删除到pos+len-1
bool SteString(SString *s,int pos,int len)
{
	int i;
	if(pos<0||pos+len>s->len)
		return false;
	else
	{
		//从pos+len开始,每个元素都向前移动len个字符 
		for(i=pos+len;i<s->len;i++)
			s->ch[i-len]=s->ch[i];
		return true;
	}
	
}

//串复制函数:将串t的值复制到s中 
bool StrCopy(SString* s,SString t)
{
	int i;
	for(i=0;i<s->len;i++)
	{
		s->ch[i]=t.ch[i];
	}
	s->len=t.len;
} 

//顺序串判空函数 
bool IsEmpty(SString* s)
{
	if(s->len==0)
	return true;
	else 
	return false;
}

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;
}
//求串长函数
int StrLength(SString* s)
{
	return s->len;
}

//清空串函数 
void StrClear(SString* s)
{
	s->len=0;
}

//串连接函数:
/*	
分为三种情况
1.如果s->len+t->len<=MAXLEN
2.如果s->len+t->len>MAXLEN而且s->len<MAXLEN,t能够连接部分进去
3.如果s->len=MAXLEN 
*/	 
int StrCat(SString* s,SString* t)
{
	int i,flag;//flag:0完全连接,1部分连接 2没有连接 
	if(s->len+t->len<=MAXLEN)
	{
		for(i=s->len;i<=s->len+t->len-1;i++)
			s->ch[i]=t[i-s->len];
		flag=0;
		return flag
	}
	else if(s->len<MAXLEN)
		for(i=MAXLEN-1;i>=s->len;i--)
			s->ch[i]=t[i-s->len];
		flag=1;
		return flag;
	else
	flag=2;
	return flag;
}
//求子串
bool SubString(SString* s,SString* t,int pos,int len)
{
	int i;
	if(pos<0||pos+len>s->len||s->len==0||len<1)
		return false;
	else
	{
		for(i=0;i<len;i++)
		t->ch[i]=s->ch[pos+i];
		t->len=len;
		return true;
	}

} 
//顺序串的模式匹配 
int StrIndex(SString* s,SString* t,int pos)
{
	int i,j,start;
	if(pos>=s->len)
		return -1;
	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;
}

  恩,这是大概的实现,具体的以后再说

转载于:https://www.cnblogs.com/YTYMblog/p/5409879.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值