串的静态顺序存储基本操作

来源:互联网 发布:java获取ad域用户信息 编辑:程序博客网 时间:2024/05/16 05:15

C语言中没有专门的字符串变量,通常用一个字符数组来存放一个字符串。字符串总是以'\0'作为串的结束符。因此当把一个字符串存入一个数组时,也把结束符 '\0'存入数组,并以此作为该字符串是否结束的标志。有了'\0'标志后,就不能再用字符数组的长度来判断字符串的长度了。

#include <iostream>#include <stdbool.h>#define MAXSIZE 225using namespace std;typedef unsigned char SString[MAXSIZE + 1];//typdef unsigned char a[MAX_LEN]意思是定义类型unsigned char                                            // [MAX_LEN]为a的形式/******************************************/void  init(SString &T)//初始化{    T[0] = 0; //一定要初始化,否则判空无法完成 t[0]为t装入字符串的长度    return ;}/******************************************/void  Create(SString &T, char chars[])//创建{    int i;    for(i=0;chars[i]!='\0' && i+1<=MAXSIZE;i++)    {        T[i+1]=chars[i];    }    T[0]=i;}/******************************************/void Display(SString &T)//遍历{    int i;    for(i=1;i<=T[0];i++)        cout<<T[i];}/******************************************/void Contact(SString &T1,SString &T2,SString &T3)//串连接 t1与t2连接成t3{    int i,k;    for(i=1;i<=MAXSIZE && i<=T1[0];i++)    {        T3[i]=T1[i];    }    k=i-1;//k为t1的长度    T3[0]=k;    for(i=1;i+k<=MAXSIZE && i<=T2[0];i++)    {        T3[i+k]=T2[i];    }    T3[0]=T3[0]+i-1;//如果t1的长度大于max则因为上面的for里面有i=1所以t3的长度还是t1的长度}/******************************************/void Copy(SString &T,SString &S)//串拷贝{    int i;    for(i=1;i<=T[0];i++)        S[i]=T[i];    S[0]=T[0];}/******************************************/bool empty(SString &T)//串判空{    if(T[0]==0)        return true;    else        return false;        }/******************************************/int lengh(SString &T)//求串长{    return T[0];    }/******************************************/void clear(SString &T){    T[0]=0;}/******************************************///若T大于S 返回值>0        若T等于S 返回值=0 若T小于S 返回值<0//如果T串是以S串开头的主串  只能返回0//如果S串是以T串开头的主串  可能返回不确定值//所以该函数应该是再判断了双方都不是对方的子串的时候才使用//串比较,如果第一个字符相等,则比较第二个字符,如果t1大于s1则返回正数,小于返回负数,t和s相等返回0int compare(SString &T,SString &S)//串比较{    int i,n=0;    for(i=1;i<=T[0];i++)    {        if(T[i]!=S[i])        {            n=T[i]-S[i];            break;        }    }    return n;}/******************************************/void substr(SString &S,SString &sub, int pos,int len)//子串提取操作从pos的位置提取长度为len的子串{    int i;    if(pos<0  || len<0 || pos+len-1>S[0])        return;    for(i=1;i<=len;i++)    {        sub[i]=S[pos+i-1];    }        sub[0]=i-1;}/******************************************/void insert(SString &S,int pos,SString &T)//插入{    SString new_;    SString temp;    substr(S,temp,1,pos-1);//把s的第一个字符到pos-1个字符提取成子串temp    Display(temp);cout<<endl;    Contact(temp,T,new_);   //把子串temp和要插入的字符串t连接成字符串new_    Display(new_);cout<<endl;    substr(S,temp,pos,S[0]-pos+1 );//把s的第pos个字符到最后一个字符提取成子串temp    Display(new_);cout<<endl;    Contact(new_,temp,S);//把new_子串和temp子串连接成串s,注意new_和temp的顺序影响新生成字符    Display(S);cout<<endl;}/*****************************************///从第一个到要删除的位置的前一个的字符提取子串,从要删除的最后一个字符的下一个到最后提取子串//然后把两个子串从连接给svoid delete_(SString &s,int pos,int len)//串删除{    SString temp;    SString sub;    if(pos<1 || pos+len>s[0]+1)        return ;    substr(s, temp, 1, pos-1);    substr(s,sub,pos+len,s[0]-pos-len+1);    Contact(temp, sub , s);}/******************************************/int Index(SString &S, SString &T, int pos)//寻找子串返回子串首次在母串中出现的首字符的位置{    int i=pos;//从第几个位置开始寻找子串t    int j=1;//从子串的第一个字符开始进行匹配        while (i<=S[0] && j<=T[0])//当i不大于s0的长度且j不大于t0的长度的时候进入循环    {        if (S[i] == T[j])//如果当前字符匹配成功,则匹配下一个        {            ++i;            ++j;        }        else  //如果当前匹配不成功,j为t的第一个字符,i为当前匹配到的字符        {            i = i-j+2;//i不写成i++的原因是虽然可以表示如果第一个字符不符合而后面的符合            j = 1;    //但不能表示当第一个符合s的第二个不符合t的第二个但不一定不符合t的第一个,所以应该保留当前位置        }             //如果是i++则会继续前进    }        if (j > T[0])        return i-T[0];    else        return 0;}/****************************/int main(){    SString t1,t2;    char a[100],b[100];    cin>>a;    cin>>b;    init(t1);    init(t2);    Create(t1, a);    Create(t2, b);    return 0;    }

http://blog.csdn.net/zhuyi2654715/article/details/6740707
0 0
原创粉丝点击