数据结构 串的定长顺序存储

#include<stdio.h>
#include<stdlib.h>
#include<string>
#include<iostream>
using namespace std;

#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define OVERFLOW -2

typedef int Status;

#define MAXSTRLEN 255
typedef unsigned char SString[MAXSTRLEN + 1];  //0号单元存放串的长度

Status StrAssign(SString T,char chars[])
{ //赋值
  //生成一个其值等于chars的串T。
  int i; 
  if(strlen(chars)>MAXSTRLEN)
	 return ERROR;
  T[0]=strlen(chars);
  for(i=0;i<=T[0];i++)
  {
    T[i+1]=chars[i];
  }
  return OK;
}

Status StrCopy(SString T,SString S)
{//复制
 //由串S复制得串T
  int i;
  for(i=1;i<=S[0];i++)
  {
    T[i]=S[i];
  }
  T[0]=S[0];
  return OK;
}

Status StrEmpty(SString S)
{//判空
  if(S[0]==0)
	  return TRUE;
  else
	  return FALSE;
}

Status Strcompare(SString S,SString T)
{//比较
 //若S>T,则返回值>0,若S=T,则返回值=0;若S<T,则返回值<0
  int i;
  for(i=1;i<=S[0]&&i<=T[0];i++)
  {
    if(S[i]!=T[i])
		return S[i]-T[i]; 
  }
  return S[0]-T[0];
}

Status StrLength(SString S)
{//长度
  return S[0];
}

Status Concat(SString T,SString S1,SString S2)
{ //连接
  //用串T返回由S1和S2连接而成的新串。
	int i,j;
	Status uncut;
	if(S1[0]+S2[0]<=MAXSTRLEN)//未截断
	{
	  T[0]=S1[0]+S2[0];
      for(i=1;i<=S1[0];i++)
	  {
	   T[i]=S1[i];
	  }
      for(j=1;j<=S2[0];j++)
	  {
		  T[S1[0]+j]=S2[j];
	  }
	  uncut=TRUE;
	}
    else if(S1[0]<MAXSTRLEN)//截断
	{
	  T[0]=MAXSTRLEN;
	  for(i=1;i<S1[0];i++)
	  {
	    T[i]=S1[i];
	  }
	  for(j=1;j<=MAXSTRLEN-S1[0];j++)
      {
		 T[S1[0]+j]=S2[j];
	  }
	  uncut=FALSE;
	}
	else// S1[0]>MAXSTRLEN
	{
	   T[0]=MAXSTRLEN;
       for(i=1;i<=MAXSTRLEN;i++)
	   {
	     T[i]=S1[i];
	   }
	   uncut=FALSE;
	}
	return uncut;
}
Status SubString(SString Sub,SString S,int pos,int len)
{   //求子串
	//用Sub返回串S的第pos个字符起长度为len的子串
	int i,j;
    if(pos<1||pos>S[0]||len<0||len>S[0]-pos+1)
	    return ERROR;
    if(!len)
	{
	   Sub=NULL;
	   Sub[0]=0;
	}
	else
	{
	 for(i=1,j=pos;i<=len-1,j<=pos+len-1;i++,j++)
		 Sub[i]=S[j];
	 Sub[0]=len;
	}
	return OK;
}

Status Index(SString S,SString T,int pos) 
{ //模式匹配
  //若主串S中存在和串T相同的子串,则返回它在主串S的第pos个
  //字符之后第一次出现的位置,否则函数值为0
	int n, m,i;
	SString Sub;
    if(pos>0)
    {
      n=StrLength(S);
      m=StrLength(T);
      i=pos;
      while(i<=n-m+1)
      {
		 SubString(Sub, S, i, m);
		 if (Strcompare(Sub, T) != 0)
			++i;
		 else
		    return i;
       }
     }
	return 0;
}

Status StrInsert(SString S,int pos,SString T)
{  //插入函数
   //在串S的第pos个字符之前插入串T。
	int i;
	if (pos<1 || pos>S[0])
		return ERROR;
	if (S[0] + T[0] < MAXSTRLEN)//完全插入
	{
		for (i = S[0]; i >= pos; i--)
		{
			S[i + T[0]] = S[i];
		}
		for (i = 1; i <=T[0]; i++)
		{
			S[pos-1+i] = T[i];
		}
		S[0] = S[0] + T[0];
		return TRUE;
	}
	else
	{
		for (i = S[0]; i >= MAXSTRLEN-S[0];i--)
		{
			S[MAXSTRLEN-S[0]+1] = S[i];
		}
		for (i = 1; i <= MAXSTRLEN - S[0];i++)
		{
			S[pos - 1 + i] = T[i];
		}
		return FALSE;
	}
}

Status StrDelete(SString S,int pos,int len)
{  //删除
   //从串S中删除第pos个字符起长度为len的子串
	int i;
	if (pos<1 || pos>S[0])
		return ERROR;
	else
	for (i = pos + len ; i<=S[0]; i++)
	{
		S[i-len] = S[i];
	}
	S[0] -= len;
	return  OK;
}

Status StrPrint(SString S)
{//输出函数
	int i;
	for (i = 1; i <= S[0]; i++)
	{
		cout << S[i];
	}
	cout << endl;
	return 0;
}

int main()
{    
	int pos,len;
	SString S1,S2,T1,T2,Sub;
	char a[100], b[100];
	cout << "请输入两个串,分别赋值给串s1和串s2" << endl;
	cin >> a >> b;
	StrAssign(S1, a);
	StrAssign(S2, b);
	cout << "把串S1拷贝给T1,输出T1:";
	StrCopy(T1, S1);
	StrPrint(T1);

	if (StrEmpty(T1) == 1)
		cout << "串T1为空!" << endl;
	else
		cout << "串T1非空!" << endl;

	if (Strcompare(S1, S2) > 0)
		cout << "S1>S2" << endl;
	else if (Strcompare(S1, S2) < 0)
		cout << "S1<S2" << endl;
	else
		cout << "S1=S2" << endl;

	cout << "连接S1,S2为T2,输出T2:";
	if (Concat(T2, S1, S2) == 1)
		StrPrint(T2);
	else
		cout << "串连接失败" << endl;

	cout << "串T2的长度为:";
	cout <<StrLength(T2)<< endl;

    cout << "请输入求子串的pos和len的值"<<endl;
	cin >> pos>> len;
	if (SubString(Sub, S1, pos, len) == 1)
	{
		cout << "输出子串Sub:";
		StrPrint(Sub);
	}
	else
		cout << "求子串失败!" << endl;

	
	if (Index(T2, S2, pos))
	{
		cout << "pos的值为:";
		cout << pos << endl;
	}
	else
		cout << "pos的值不合法" << endl;

	cout << "在串S1的第pos位置插入串S2" << endl;
	cout << "输入pos的值:";
	cin >> pos;
	if (StrInsert(S1, pos, S2) == 1)
	{
		cout << "输出串S1:";
		StrPrint(S1);
	}
	else
		cout << "插入失败" << endl;
	 
	cout << "从串S1中删除第pos位置起长度为len的字符" << endl;
	cout << "输入pos,len的值:";
	cin >> pos >> len;
	if (StrDelete(S1, pos, len) == 1)
	{
		cout << "输出删除后的串S1:";
		StrPrint(S1);
	}
	else
		cout << "删除失败" << endl;
	return 0;
}

</pre><pre><pre name="code" class="cpp">

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值