【数据结构】串的基本操作

2021-01-15 Views588字3 min read
featureimg

利用最小操作子集实现定位函数

#include <stdio.h>
#define  MaxLen  256    
           
typedef struct
{ 
  char  str[MaxLen];                              /*定义可容纳MaxLen个字符的字符数组*/
  int  curlen;                                    /*定义当前实际串长度*/
} SString;

void InitString(SString *s,char a[])
{
  int i,j;
  for(j=0;a[j]!='\0';j++);
  for(i=0;i<j;i++)
    s->str[i]=a[i];
  s->curlen=j;
}

void show(SString S)
{
  int i;
  for(i=0;i<S.curlen;i++)
   printf("%c",S.str[i]);
  printf("\n字符串实际长度是:%d",S.curlen);
}

int StrLength(SString s){

}

int StrEqual(SString s,SString t)
/*判串s和串t是否相等。相等,返回l;否则返回0*/
{
  int i,j;
  if(s.curlen==t.curlen)                     /*首先判断两个串的长度是否相等*/
  {
    for(i=0;i<s.curlen;i++)                  /*长度相等则继续比较对应位置的每个字符是否相等*/
    {
      if(s.str[i]==t.str[i])
        j=1;
      else
      {
        j=0;                                  /*若对应位置字符出现不等,终止比较*/
        break;
      }
    }
  }
  else                                       /*长度不相等则判定两个串不相等,返回0*/
     j=0;
  return  j;
}



SString SubStr(SString s,int pos,int len)
/*求出串s中从第pos个字符起长度为len的子串*/
{
  int i,j=0;
  SString ch;
  if((pos>=1 && pos<=s.curlen) && (len>=0 && len<= s.curlen- pos+1))
  {
    for(i=pos-1;i<len+pos-1;i++)
    {                                         /*将s.str[pos-1]~ s.str[1en+pos-2]复制至ch*/
      ch.str[j++]=s.str[i];
    }
    ch.curlen=len;
    ch.str[ch.curlen]= '\0';
  }
  else
  {
    printf("\n error! \n");                   /*参数不正确时返回错误信息*/
  }
  return ch;
}

int StrIndex (SString s, SString t, int pos) 
/* t为非空串。若主串s中第pos个字符之后存在与t相等的子串,则返回第一个这样的子串在s中的位置,否则返回-1。*/
{
	SString sub;
	int m,n,i;

  if (pos>0) 
  {
     
     n = s.curlen; 
     m = t.curlen; 
     i = pos;


     while (i<=n-m+1) 
     { 
       sub=SubStr(s,i,m);
		//printf("%d",i);
		//show(sub);

       if (StrEqual(sub,t) != 0)  
          ++i;
       else 
          return i;                              /* 返回子串在主串中的位置*/
     } 
  } 
  return -1;                                     /* s中不存在与t相等的子串*/
} 


main()
{
  SString S,T;
  char a[MaxLen],b[MaxLen];
  int wz,x;
  printf("\n请输入主串S:");
  gets(a); 
  printf("\n请输入子串T:");
  gets(b);
  InitString(&S,a);
  InitString(&T,b);
  printf("\n主串S:");show(S);
  printf("\n子串T:");show(T);
  printf("\n请输入开始搜索的位置:");
  scanf("%d",&wz);   
  x=StrIndex(S,T,wz);
  printf("\n子串在主串的位置是%d\n",x);
}
EOF