顺序存储实现串

实现代码:

#include<iostream>
using namespace std;
//顺序存储实现串 

#define MaxLen 255

struct String{
	char ch[MaxLen]; //存储串的字符元素 
	int length; //串的长度 
};

//初始化串
void InitString(String &S){
	S.length=0;
} 

//赋值操作,将字符串chars的值赋值给串S 
void StringAssign(String &S,char *chars){
	
	int i=0;
	for(i=0;chars[i]!='\0';i++){
		S.ch[i]=chars[i];
	}
	S.length=i;
	
} 

//复制操作,将串T复制到串S 
void StringCopy(String &S,String &T){
	
	for(int i=0;i<T.length;i++){
		S.ch[i]=T.ch[i];
	}
	S.length=T.length;
}


//判断串是否为空
bool IsEmpty(String &S){
	
	return S.length==0; 
	
} 

//求串的长度 
int StringLength(String &S){
	
	return S.length;
	
}

//清空字符串
void StringClear(String &S){
	
	S.length=0;
	
} 


//比较两个串,0代表相等,1代表前一个串大于后一个串,-1表示前一个串小于后一个串 
bool StringCompare(String &S,String &T){
	
	for(int i=0;i<S.length&&i<T.length;i++){
		if(S.ch[i]!=T.ch[i])
			return S.ch[i]-T.ch[i];
	}
	
	return S.length-T.length;	
} 

//用串T返回串S1和串S2连接成的新串
void StringConcat(String &T,String S1,String S2){
	
	int i=0;
	for(i=0;i<S1.length;i++){
		T.ch[i]=S1.ch[i];
	}
	for(int j=i;j<S2.length+i;j++){
		T.ch[j]=S2.ch[j-S2.length];
	}
	T.length=S1.length+S2.length;
	
} 

//取子串,pos表示第pos个字符,不是下标 
bool SubString(String &S,String &sub,int pos,int len){
	
	if(pos+len-1>S.length||pos<1||pos>S.length){
		cout<<"输入不合法"<<endl;
		return false;
	}
	
	for(int i=pos-1;i<=pos+len;i++){
		sub.ch[i-pos]=S.ch[i];
	}
	sub.length=len;
	
	return true;
}

//判断主串S中是否有子串T,如果存在返回子串在主串中的起始下标,不存在则返回-1 
int StringIndex(String &S,String &T){
	
	int i=0,n=StringLength(S),m=StringLength(T);
	
	String sub; //用于暂存子串
	
	for(i=1;i<n-m+1;i++){
		
		SubString(S,sub,i,m); 
		if(StringCompare(sub,T)==0)
			return i;
	} 	
	
	return -1; //S中不存在与T相等的子串 
}


//打印串
void PrintString(String &S){
	
	for(int i=0;i<S.length;i++)
		cout<<S.ch[i];
	cout<<endl;
} 

int main(){
	
	String S; //定义一个串
	char chars[15]="abcdefg"; 
	
	InitString(S); //初始化串
	
	cout<<IsEmpty(S)<<endl; //判断串是否为空 
	
	StringAssign(S,chars); //将字符串常量chars的值赋值给串S
	
	PrintString(S); //打印串
	
	cout<<IsEmpty(S)<<endl; //判断串是否为空 
	cout<<"串S的长度为:"<<StringLength(S)<<endl;  
	
	String T; //定义一个串
	StringCopy(T,S); //将串S的值复制给串T
	PrintString(T); //打印串T 
	cout<<"串T的长度为:"<<StringLength(T)<<endl;  
	cout<<StringCompare(S,T)<<endl; //比较串S和T是否相等 
	
	cout<<"---------------------"<<endl;
	cout<<"---------------------"<<endl;
	cout<<"---------------------"<<endl;
	
	String Slink; //定义一个串
	StringConcat(Slink,T,S); //将串T和串S连接成一个新串Slink
	PrintString(Slink); //打印串Slink
	cout<<StringCompare(Slink,S)<<endl; //比较串Slink和串S是否相等 
	cout<<"串Slink的长度为:"<<StringLength(Slink)<<endl;  
	
	cout<<"---------------------"<<endl;
	cout<<"---------------------"<<endl;
	cout<<"---------------------"<<endl;
	
	String substr; //定义一个串
	SubString(S,substr,2,2); //取子串 
	SubString(S,substr,5,6);
	PrintString(substr); //打印串substr
	cout<<"串substr的长度为:"<<StringLength(substr)<<endl;  
	
	cout<<"---------------------"<<endl;
	cout<<"---------------------"<<endl;
	cout<<"---------------------"<<endl;
	
	String St; 
	char chart[15]="cdd";
	StringAssign(St,chart); //给串st赋值 
	cout<<StringIndex(S,substr)<<endl; //判断串S中是否存在子串substr
	cout<<StringIndex(S,St)<<endl; //判断串S中是否存在子串St 
	
	return 0;
} 

运行结果:

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值