数据结构——串

1 串

1.1 串的定义

  由零个或多个字符组成的有限序列,串又被称为字符串;标记为:s="a1,a2,a3,...,ai,...,an"(n>=0),其中ai可以使字母、数字、其他字符;

1.2 串的相关概念

  串的长度:串中的字符个数

  空串:不含任何字符的串

  空格串:只包含空格的串

  主串:包含子串的串

  子串:主串中任意个数的连续字符组成有限序列

1.3 串的抽象数据类型

  ADT串:

    data:

      s="a1,a2,a3,...,ai,...,an"(n>=0)

    operation   

InitString(S,str)      //初始化操作,建立串
DestoryString(S)  //销毁串
ClearString(S)    //清空串
StringEmpty(S)  //若串为空,返回true
                        //若串不为空,返回false
Length(str)      //获取指定字符串的长度
CopyString(S,str)  //将字符串str的所有字符复制到字符串S中
CompareString(S,T)   //比较两个字符串的大小
                               //若S<T,返回负数
                               //若S=T,返回0
                              //若S>T,返回整数

2 串的存储结构

2.1 串的存储结构

typedef struct String
{
  char *data;
  int length;
  int maxlength;
}String;

2.2 串的初始化操作

void InitString(String *S,char *str)
{
  int len=Length(str);
  S->data=(char*)malloc((len+1)*sizeof(char));
  S->length=len;
  S->maxlength=len;
  for(int i=0;i<len;i++)
  {
    S->data[i]=str[i];
  }
  S->data[i]='\0';
}

2.3 销毁串

void DestoryString(String *S)
{
  if(S->data==NULL)
    return;
  free(S->data);
  S->data=NULL;
  S->length=0;
  S->maxlength=0;
}

2.4 清空串

void ClearString(String *S)
{
  if(S->data==NULL)
    return;
  S->length=0;
}

2.5 判断串是否为空

bool StringEmpty(String *S)
{
  return S->data != NULL && S->length==0;
}

2.6 获取指定字符串长度

int length(char *str)
{
  int length=0
  while(str[length]!='\0')
  {
    length++;
  }
  return length;
}
int length(String *s)
{
  return s->length;
}

2.7 复制字符串

void CopyString(String *S,char *string)
{
  if(S->data==NULL)
    return;
  int length=length(string);
  if(length>S->maxlength)
  {
    S->data=(char*)realloc(S->data,(length+1)*sizeof(char));
    S->maxlength=length;
  }
  for(i=0;i<length;i++)
    S->data[i]=string[i];
  S->data[length]='\0';
  S->length=length;
}

2.8 字符串比较

int CompareString(String *S1,String *S2)
{
  if(S1->data==NULL && S2->data==NULL)
    return 0;
  if(S1->data==NULL && S2->data!=NULL)
    return -1;
  if(S1->data!=NULL && S2->data==NULL)
    return 1;
  if(S1->length==0)
    return(S2->length==0)?0:1;
  if(S2->length==0)
    return(S1->length==0)?0:1;
  int i=0;
  while(true)
  {
    if(S1->data[i]>S2->data[i])
      return 1;
    else if(S1->data[i]<S2->data[i])
      return -1;
    else if(S1->data[i]=='\0' && S1->data[i]==S2->data[i])
      return 0;
    i++;
  }
}

2.9 截取子串

char *subString(String *S,int pos,int len)
{
  if(S->data==NULL)
    return NULL;
  if(pos<0||pos>=S->length)
    return NULL;
  if(len>S->length-pos)
    return NULL;
  char *result=(char*)malloc((len+1)*sizeof(char));
  for(int i=0;i<len;i++)
    result[i]=S->data[pos+i];
  result[len]='\0';
  return result;
}

2.10 定位子串

int locate(String *S,char* str,int pos)
{
  if(S->data==NULL)
    return -1;
  if(pos<0||pos>=S->length)
    return -1;
  int len=length(str);
  if(len+pos>S->length)
    return -1;
  for(int i=pos;i<S->lenght-len;i++)
  {
    int j;
    for(j=0;j<len;j++)
    {
      if(S->data[i+j]!=str[j])
        break;
    }
    if(j==len)
      return i;
  }
  return -1;
}

2.11 插入子串

Status insert(String *S,int pos,char *str)
{
  if(S->data==NULL)
    return ERROR;
  if(pos<0||pos>=S->length)
    return ERROR;
  int len=length(str);
  if(len+pos>S->length)
    return -1;
  if(S->length+len>S->maxlength)
  {
    S->data=(char*)realloc(S->data,(S->length+len+1)*sizeof(char));
    S->maxlength=S->length+len;
  }
return SUCCESS; }

2.12 删除子串

Status delete(String *S,int pos,int len)
{
  if(S->data==NULL)
    return ERROR;
  if(pos<0||pos>=S->length)
    return ERROR;
  if(len+pos>S->length)
    return ERROR;
  for(int i=pos+len;i<S->lenght;i++)
    S->data[i-len]=S->data[i];
  S->length-=len;
  return SUCCESS;
}

2.13 替换子串

Status replaceString(String *S,char *oldstr,char *newstr)
{
  if(S->data==NULL)
    return ERROR;
  int index=locate(S,oldstr,0);
  while(index>=0)
  {
    int oldlen=length(oldstr);
    int newlen=length(newstr);
    delete(S,index,oldlen);
    insert(S,index,newstr);
    index=locate(S,oldstr,index+newlen);
  }
  return SUCCESS;
}

 

posted @ 2019-01-04 18:36  dongry  阅读(578)  评论(0编辑  收藏  举报