数据结构-串的操作

#include<iostream>
#include<string.h>
using namespace std;
#define OK 1;
#define ERROR 0;

typedef struct        //结构体定义
{
   char data[100];
   int length;
}  SqString;


 void StrAssign(SqString &s,char cstr[5])    //输入字符串
 {
   int i;
   for (i=0;cstr[i]!='\0';i++)
   s.data[i]=cstr[i];
   s.length = i; 

 }



void DispStr(SqString s)   //输出字符串
{

 int i;
 if (s.length>0)
 for(i=0 ; i<s.length ; i++)
	 cout<<s.data[i]<<ends;
}
 

void StrCopy( SqString &s, SqString t)  //替换字符串
{

  int i;
  for (i=0;i<t.length;i++)
  s.data[i]=t.data[i];
  s.length =t.length;
 
}

 
bool StrEqual( SqString s, SqString t)  //判断两字符串是否相等
{  bool same=true;
   int i;
   if(s.length!=t.length)
   same=false;
   else
   for(i=0;i<s.length;i++)
    if(s.data[i]!=t.data[i])
	  {
	    same=false;
		break;
	  }
	
    return same;

}



SqString Concat(SqString s,SqString t)   //连接字符串
{
	SqString str;
	int i;
	str.length=s.length+t.length;
	for(i=0;i<s.length;i++)
	  str.data[i]=s.data[i];

	for(i=0;i<t.length;i++)
	  str.data[s.length+i]=t.data[i];

    DispStr(str);                   // 必须输出字符串才能返回结果
      return str;
}


 SqString SubStr(SqString s,int i,int j)          //求第i个元素起长度为j的子串 
 {
 	SqString str;
 	int k;
 	str.length=0;
 	if(i<=0||i>s.length||j<0||i+j-1>s.length)    //判断是否符合要求
 	return str;
 	for(k=i-1;k<i+j-1;k++)   //从第i个元素到i+j个元素
 	str.data[k-i+1]=s.data[k];    
 	str.length=j;
    DispStr(str);
 	return  str;
 }


SqString InsStr(SqString s1,int i,SqString s2)      //插入字符串 
 {
 	int j,k;
 	SqString str;
 	str.length=0;
 	if(i<=0||i>s1.length+1)    //判断i的合法性
 	return str;

 	for(j=0;j<i-1;j++)       //将s1中前i-1个元素赋于串str前i-1元素中
 	str.data[j]=s1.data[j];

 	for(j=0;j<s2.length;j++)        //将串s2中的元素从串s1第i个元素即[i-1]开始
 	str.data[i+j-1]=s2.data[j];

 	for(k=0;k<s1.length-i+1;k++)   //将剩余s1中剩余元素输入串str,从串str元素第i+j个元素即[i+j-1]开始
    str.data[i-1+j+k]=s1.data[k];

    str.length=s1.length+s2.length;
	DispStr(str);
 	return str;
 }


SqString DelStr(SqString s,int i, int j)        //删除字符串 
 {



	int k;
 	SqString str;
 	str.length=0;
 	if(i<=0||i>s.length||i+j>s.length+1)
 	return str;

 	for(k=0;k<i-1;k++)
 	str.data[k]=s.data[k];

 	for(k=i+j-1;k<s.length;k++)
 	str.data[k-j]=s.data[k];

 	str.length=s.length-j;
	DispStr(str);
 	return str;
}


SqString RepStr(SqString s,int i,int j,SqString t)      //替换字符串
{
	int l,k;
	SqString str;
	str.length=0;
	if(i<=0||i>s.length||i+j-1>s.length)   //判断i的合法性
	return str;

	for(k=0;k<i-1;k++)
	str.data[k]=s.data[k];         //串s中 前k个元素输给 串str 前k个

	for(k=0;k<j;k++)              //将串t中长度为j的字符串赋给串str,起始位置为第i个元素开始
	str.data[i+k-1]=t.data[k];

	for(l=0;l<s.length-(i+j-1);l++)       //将剩余的字符串s中的元素输入str
	str.data[i+k-1+l]=s.data[l];

	str.length=s.length-j+t.length;
    DispStr(str);
	return str;
}




 int main ()

 {  
	  int m,n,j,k,l,o,p;
	  SqString  s1, t1,s2;
	  char cstr1[5],cstr2[5],cstr3[5];

	  printf("输入长度为5的字符串S1:");//输入字符串
	  gets(cstr1);
      StrAssign(s1,cstr1);


	   cout<<"输出字符串S1:";   //输出字符串
     	DispStr(s1);
        cout<<endl;


        printf("输入长度为5,复制的字符串S:");    //复制字符串
	    gets(cstr2);
	    StrAssign(t1,cstr2);
		StrCopy( s1, t1);cout<<"输出复制后的字符串S1:";
     	DispStr(s1);
		cout<<endl;


	  printf("输入比较的字符串S2:");   //比较字符串
	  gets(cstr3);
      StrAssign(s2,cstr3);
       cout<<"判断结果为:"<<StrEqual( s1,s2)<<endl;


    	cout<<"链接字符串S1和S2:";    //链接需要比较的字符串
	    Concat(s1,s2);  
	    cout<<endl;

        cout<<"输入查找字符串S1的子串起始位置及长度";   //查找子串
		cin>>m>>n;
		cout<<"输出子串";
        SubStr(s1,m,n);
		 cout<<endl;


         cout<<"输入插入的位置"<<endl;       //插入字符串 
		 cin>>j;
		  cout<<"输出S2插入S1后的字符串"<<endl;
         InsStr( s1, j ,s2);
		  cout<<endl;

          cout<<"已知字符串S1进行删除,输入删除的起始位置及长度";    //删除字符串 
		  cin>>k>>l;
          DelStr(s1,k, l) ;
          cout<<endl;

        cout<<"已知字符串S2,将代替的是字符串S1";      //替换字符串
        cout<<"输入要替换的起始部分及长度";
        cin>>o>>p;
		RepStr(s1,o,p,s2) ;

        return OK;
  }

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值