数据结构-串

本文介绍了计算机中串数据结构的概念,串是由零个或多个字符组成的有限序列,存储时通常使用堆存储。讨论了串的基本操作,包括初始化、比较、获取长度、销毁、清空、复制、拼接、插入和删除等。这些操作对于理解和处理字符串数据至关重要。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

计算机上的非数值处理的对象基本上是字符串数据。串是由零个或多个字符组成的有限序列,一般记为

s='a1a2..an'

其中s是串的名,用单引号括起来的字符系序列是串的值;ai可以是字母、数字或其他字符,串中字符的数目n称为串的长度。零个字符的串称为空串。它的长度为零。

存储的时候,我们用堆存储。存储空间是在程序执行过程中动态分配而得。

首先是辅助宏的定义:

#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define OVERFLOW -1
typedef int Status;

串的存储结构定义:

//串的堆存储结构定义
typedef struct{
    char *ch; 
    int length;//串长度
}HString;

初始化一个空串.

Status InitString(HString &T){
    //初始化一个空串
    T.ch=NULL;
    T.length=0;
    return OK;
}

生成一个其值等于串常量chars 的串T.

Status StrAssign(HString &T,char *chars){
    //生成一个其值等于串常量chars 的串T
    if(T.ch) //如果T串不空 释放原有空间
        free(T.ch);
    int n=0,i=0;
    while(chars[n]!='\0')
         n++; //求chars的串长 n
    if(!n) //如果串长为0  T串赋空
         T.ch=NULL;
    else{
         T.ch=(char *)malloc(n*sizeof(char));
         if(!T.ch) //存储分配失败
             exit(OVERFLOW);
         while(chars[i]!='\0')
             T.ch[i]=chars[i++];
    }
    T.length=n;
    return OK;
}

若S>T 则返回值>0,若S==T 则返回值==0 若S<T 则返回值<0.

int StrCompare(HString S,HString T){
    //若S>T 则返回值>0,若S==T 则返回值==0 若S<T 则返回值<0 
    int i;
    for(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; 
}

若串S为空串 返回TRUE 否则返回FALSE.

Status StrEmpty(HString S){
    //若串S为空串 返回TRUE 否则返回FALSE
    if(!S.length)
        return TRUE;
    return FALSE;
}

返回串的长度.

int  StrLength(HString &S){
    //返回串的长度
    return S.length;
}

如果S串存在 就销毁S串.

Status DestroyString(HString &S){
    //如果S串存在 就销毁S串
    if(S.ch)
        free(S.ch);
    S.ch=NULL; //赋空S串
    S.length=0;
    return OK;
}

清空串S.

Status ClearString(HString &S){
   //清空串S
    S.length=0;
    return OK;
}

输出串S.

Status PrintString(HString &S){
    //输出串S
    if(!S.length) //空串
        printf("空串");
    else{
       int i;
       for(i=0;i<S.length;i++)
           printf("%c",S.ch[i]);
    }
    printf("\n");
    return OK;
}

由串S复制的串T.

Status StrCopy(HString &T,HString S){
     //由串S复制的串T
     if(T.ch) //如果串T不空 释放原有空间
        free(T.ch);
     T.length=S.length;
     if(S.length){ //如果S不为空串
         int i=0;
         T.ch=(char *)malloc(T.length*sizeof(char));
         if(!T.ch) //存储分配失败
             exit(OVERFLOW);
         for(i=0;i<T.length;i++)
             T.ch[i]=S.ch[i];
     }
     else //否则T串赋空
         T.ch=NULL;
     return OK;
}

用Sub返回串S中的第pos个字符起长度为len的字串,pos>=1&&pos<=S.length  len>=0&&len<=S.length-pos+1.

Status SubString(HString &Sub,HString S,int pos,int len)
{
     //用Sub返回串S中的第pos个字符起长度为len的字串
     //pos>=1&&pos<=S.length len>=0&&len<=S.length-pos+1
    if(pos<1||pos>S.length||len<0||len>S.length-pos+1)
        return ERROR;//pos不合法或者len不合法
    if(Sub.ch)//如果字串不空 释放原有空间
        free(Sub.ch);
    if(len) {//如果len不为0
        int j=0,i;
        Sub.ch=(char *)malloc(len*sizeof(char));
        if(!Sub.ch)//存储分配失败
            exit(OVERFLOW);
        for(i=pos-1;i<pos+len-1;i++)
            Sub.ch[j++]=S.ch[i];
    }
    else//否则字串赋空
         Sub.ch=NULL;
    Sub.length=len;
    return OK;
}

用T返回S1与S2拼接成的串.

Status Concat(HString &T,HString S1,HString S2){
    //用T返回S1与S2拼接成的串
    if(T.ch) //原来T串不空 释放T原来的空间
        free(T.ch);
    T.length=S1.length+S2.length;
    if(T.length){ //如果S1与S2不同时为空
        int i,j;
         T.ch=(char *)malloc(T.length*sizeof(char));
        if(!T.ch)//存储分配失败
             exit(OVERFLOW);
        for(i=0;i<S1.length;i++)
             T.ch[i]=S1.ch[i];
        for(j=0;j<S2.length;j++)
             T.ch[i+j]=S2.ch[j];	 
    }
    else //否则T串赋空
        T.ch=NULL;
    return OK;
}

在串S的第pos个字符前插入串T pos>=1&&pos<=S.length+1.

Status StrInsert(HString &S,int pos,HString T){
    //在串S的第pos个字符前插入串T pos>=1&&pos<=S.length+1
    if(pos<1||pos>S.length+1) //pos值非法
        return ERROR;
    int i,j=0;
    if(T.length) {   //如果T串不为空 重新分配存储空间
          S.ch=(char *)realloc(S.ch,(S.length+T.length)*sizeof(char));
    if(!S.ch) //存储分配失败
          exit(OVERFLOW);
    for(i =S.length-1;i>=pos-1;i--) //为插入T而腾出位置
          S.ch[i+T.length]=S.ch[i];
    for(i=pos-1;i<pos-1+T.length;i++)//插入T
          S.ch[i]=T.ch[j++];
    S.length+=T.length;
    }
    return OK;
}

从串S中删除第pos个字符开始,长度为len的字串. pos>=1&&pos<=S.length+1 len>=0&&len<=S.length-pos+1

Status StrDelete(HString &S,int pos,int len){
    //从串S中删除第pos个字符开始,长度为len的字串
    //pos>=1&&pos<=S.length+1 len>=0&&len<=S.length-pos+1
    if(pos<1||pos>S.length+1||len<0||len>S.length-pos+1)
        return ERROR;
    int i;
    for(i=pos-1;i<S.length-len;i++) //元素前移
         S.ch[i]=S.ch[i+len];
    S.length-=len;//长度减少
    return OK;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值