串的定长顺序存储实现(参考:数据结构严蔚敏C)

该实现需提前给定定长的存储空间,手动实现增强一下字符串相关函数的原理理解。

使用提前申请好的顺序空间来存储字符串中的每个字符,并在这个基础上完成一系列字符串的操作。

(个人感觉就是自己实现一个字符串数组的处理)

头文件:SequenceString.h

PS:在该头文件中#include "Status.h" 中主要包含一些逻辑常量(SUCCESS、FALSE、ERROR、OK),并定义了数据类型Status(typedef后的int)。

#ifndef SEQUENCESTRING_H_INCLUDED
#define SEQUENCESTRING_H_INCLUDED
#include<stdio.h>
#include<string.h>
#include"Status.h"

#define MAXSTRLEN 255  //顺序穿最大串长

typedef unsigned char SString[MAXSTRLEN+1]; // 0号单元存放串的长度 将SString定义为一个字符串数组


Status StrAssign_Sq(SString T , const char *chars);
//生成一个其值等于常量chars的串T(串赋值)

void StrCopy_Sq(SString T,SString S);
//由串S复制得到串T

Status StrEmpty_Sq(SString S);

int StrCompare_Sq(SString S , SString T);
//

int StrLength_Sq(SString S);

void ClearString_Sq(SString S);

Status Concat_Sq(SString T , SString S1 , SString S2);
//用T返回由S1和S2连接而成的新串

Status SubString_Sq(SString Sub , SString S , int pos , int len);

//用Sub返回串S的第pos个字符起长度为len的字串.

int Index_Sq_1(SString S , SString T , int pos);
//返回T在S中第Pos个字符后第一次出现的位置,不存在则返回0.

Status Replace_Sq(SString S , SString T , SString V);
//用V替换主串S中出现的所有与T相等的不重叠的字串,可以被完全替换返回OK

Status StrInsert_Sq(SString S , int pos , SString T);
//在串S的第pos个字符之前插入串T,可以完全插入返回OK,否则返回ERROR

Status StrDelete_Sq(SString S , int pos , int len);
//从串S中删除第pos个字符起长度为len的字串

void DestroyString_Sq(SString S);
//销毁串S

void StrPrint_Sq(SString S);
//输出串S

#endif // SEQUENCESTRING_H_INCLUDED

具体实现:SequenceString.c

#include"SequenceString.h"

Status StrAssign_Sq(SString T,const char *chars)
{
    int len = strlen(chars);
    if(len>MAXSTRLEN)
    {
        return ERROR;
    }
    else
    {
        int i ;
        T[0] = len;
        for(i = 0;i < len;i++ )
        {
            T[i+1] = chars[i];
        }
        return SUCCESS;
    }
}

void StrCopy_Sq(SString T,SString S)
{
    int i;
    for(i = 0;i<=S[0];i++)
    {
        T[i] = S[i];
    }

}

Status StrEmpty_Sq(SString S)
{
    if(S[0]==0)
    {
        printf("this Str is Empty!\n");
        return YES;
    }
    else
    {
        printf("this Str is not Empty!\n");
        return ERROR;
    }

}

int StrCompare_Sq(SString S,SString T)
{
    int i =1;
    while(S[i]==T[i]&&i<=S[0]&&i<=T[0])
    {
        i++;
    }
    //退出循环:第i项不相等、S或T至少有一个越界
    if(i>S[0]&&i>T[0])
    {
        printf("they are same!\n");
        return 0;
    }
    if(i>S[0])
    {
        printf("the second is bigger than the first!\n");
        return -1;
    }
    if(i>T[0])
    {
        printf("the first is bigger than the second!\n");
        return 1;
    }
    if(S[i]>T[i])
    {
        printf("the first is bigger than the second!\n");
        return 1;
    }
    else
    {
        printf("the second is bigger than the first!\n");
        return -1;
    }
}

int StrLength_Sq(SString S)
{

    return S[0];
}

void ClearString_Sq(SString S)
{
    S[0] = 0;
}

Status Concat_Sq(SString T,SString S1,SString S2)
{
    int tmp = (int)S1[0]+ (int)S2[0];
    if(tmp>MAXSTRLEN)
    {
        printf("链接字符串长度超出限制!\n");
        return ERROR;
    }
    int tmp0 = S1[0];
    T[0] = (unsigned char ) tmp;


    int i;
    for(i = 1;i<=tmp0;i++)
    {

        T[i] = S1[i];
    }
    for( ; i<=T[0] ; i++)
    {
        T[i] = S2[i-tmp0];

    }
    return SUCCESS;
}

Status SubString_Sq(SString Sub,SString S,int pos,int len)
{
    if(pos+len-1>MAXSTRLEN)
    {
        printf("字符串没有这么长!\n");
        return ERROR;
    }
    Sub[0] = len;
    int i = 1;
    for( ; i<=len ; i++)
    {
        Sub[i] = S[pos+i-1];
    }
    return SUCCESS;

}

int Index_Sq_1(SString S , SString T,int pos)
{
    int Tlength = T[0] , Slength = S[0];
    if(!Tlength||!Slength)
    {
        printf("两个串都不能为空!\n");
        return ERROR;
    }
    if(Tlength>Slength-pos+1)
    {
        printf("子串不能长于目标主串!\n");
        return 0;
    }
    SString tmp;
    int i ;
    for(i=pos;i<=Slength-Tlength+1;i++)
    {
        SubString_Sq(tmp , S ,i,Tlength);
        if(!StrCompare_Sq(tmp,T))
        {
            return i;
        }
    }
    printf("未找到该字串!\n");
    return 0;

}

int Index_Sq_2(SString S , SString T , int pos)
{
    int count = 0;
        int Tlength = T[0] , Slength = S[0];
    if(!Tlength||!Slength)
    {
        printf("两个串都不能为空!\n");
        return ERROR;
    }
    if(Tlength>Slength)
    {
        printf("子串不能长于主串!\n");
        return 0;
    }
    SString tmp;
    int i ;
    for(i=1;i<=Slength-Tlength+1;i++)
    {
        SubString_Sq(tmp , S ,i,Tlength);
        if(!StrCompare_Sq(tmp,T))
        {
            count = i;
        }
    }
    if(!count)
    {
           printf("未找到该字串!\n");
           return 0;
    }
    else
    {
       return count ;
    }


}

Status Replace_Sq(SString S,SString T,SString V)
{
    int i=1 ,itmp =1;
    SString tmp;
    tmp[0] = 0;
    SString stringTmp;
    stringTmp[0] = 0;
    while(i<S[0])
    {
      i=Index_Sq_1(S,T,i);
      printf("\ni is:%d\n",i);

      if(i == 0)
      {
          SubString_Sq(stringTmp , S ,itmp,S[0]-itmp+1);
          Concat_Sq(tmp,tmp,stringTmp);
          printf("查找结束!\n");
          break;
      }
      SubString_Sq(stringTmp,S,itmp,i-1);//先找出前面的字符串

      Concat_Sq(tmp,tmp,stringTmp);//给tmp加一个strTmp
      Concat_Sq(tmp,tmp,V); //给tmp加一个V
      printf("now the tmp is:");
      ShowSString(tmp);
      i=i+T[0];

      itmp = i;

    }

    StrCopy_Sq(S,tmp);


}

Status StrInsert_Sq(SString S,int pos,SString T)
{
    if(S[0]+T[0]>MAXSTRLEN)
    {

        printf("失败!容量不足!\n");
        return ERROR;
    }
    SString tmp;
    tmp[0] = 0;
    SString stringTmp;
    stringTmp[0] = 0;
    SubString_Sq(stringTmp,S,1,pos-1);
    Concat_Sq(tmp,tmp,stringTmp);
    Concat_Sq(tmp,tmp,T);
    SubString_Sq(stringTmp,S,pos,S[0]-pos+1);
    Concat_Sq(tmp,tmp,stringTmp);
    StrCopy_Sq(S,tmp);
}

Status StrDelete_Sq(SString S,int pos,int len)
{
    SString tmp ,stringTmp;
    tmp[0]=0,stringTmp[0] =0;
    if(pos+len-1>MAXSTRLEN)
    {
        printf("串的总长度不够!\n");
        return ERROR;
    }
    SubString_Sq(stringTmp,S,1,pos-1);
    Concat_Sq(tmp,tmp,stringTmp);
    SubString_Sq(stringTmp,S,pos+len,S[0]-pos-len+1);
    Concat_Sq(tmp,tmp,stringTmp);
    StrCopy_Sq(S,tmp);
    return SUCCESS;
}


void ShowSString(SString S)
{
    int i;
    for(i=1;i<=S[0];i++)
    {
        printf("%c",S[i]);
    }
    printf("\n");
}

具体的测试main函数大家可以自己写一写。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值