• 数据结构之串——顺序串


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

    #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;
    }
    

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

    亲爱的听众朋友我是你的代班DJ
  • 相关阅读:
    魔术球问题
    【模板】网络最大流
    [SCOI2010]股票交易
    [SCOI2009]生日礼物
    [HAOI2007]修筑绿化带
    [HAOI2007]理想的正方形
    [USACO12MAR]花盆Flowerpot
    滑动窗口
    斐波那契公约数
    [SDOI2008]仪仗队
  • 原文地址:https://www.cnblogs.com/YTYMblog/p/5409879.html
Copyright © 2020-2023  润新知