第四章 串、数组和广义表 —— 顺序串的基本操作

顺序串的基本操作

#include<bits/stdc++.h>

#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define MAXSTRLEN 255

typedef int Status;
typedef int ElemType;
typedef unsigned char SString[MAXSTRLEN + 1];  //0号单元存放串的长度
using namespace std;

Status StrAssign(SString T,char chars[])
{
    //赋值
    //生成一个其值等于chars的串T。
    int i;
    if(strlen(chars)>MAXSTRLEN)
        return ERROR;
    T[0]=strlen(chars);
    for(i=0; i<=T[0]; i++)
    {
        T[i+1]=chars[i];
    }
    return OK;
}

Status StrCopy(SString T,SString S)
{
    //复制
//由串S复制得串T
    int i;
    for(i=1; i<=S[0]; i++)
    {
        T[i]=S[i];
    }
    T[0]=S[0];
    return OK;
}

Status StrEmpty(SString S)
{
    //判空
    if(S[0]==0)
        return TRUE;
    else
        return FALSE;
}

Status Strcompare(SString S,SString T)
{
    //比较
    //若S>T,则返回值>0,若S=T,则返回值=0;若S<T,则返回值<0
    int i;
    for(i=1; i<=S[0]&&i<=T[0]; i++)
    {
        if(S[i]!=T[i])
            return S[i]-T[i];
    }
    return S[0]-T[0];
}

Status StrLength(SString S)
{
    //长度
    return S[0];
}

Status Concat(SString T,SString S1,SString S2)
{
    //连接
    //用串T返回由S1和S2连接而成的新串。
    int i,j;
    Status uncut;
    if(S1[0]+S2[0]<=MAXSTRLEN)//未截断
    {
        T[0]=S1[0]+S2[0];
        for(i=1; i<=S1[0]; i++)
        {
            T[i]=S1[i];
        }
        for(j=1; j<=S2[0]; j++)
        {
            T[S1[0]+j]=S2[j];
        }
        uncut=TRUE;
    }
    else if(S1[0]<MAXSTRLEN)//截断
    {
        T[0]=MAXSTRLEN;
        for(i=1; i<S1[0]; i++)
        {
            T[i]=S1[i];
        }
        for(j=1; j<=MAXSTRLEN-S1[0]; j++)
        {
            T[S1[0]+j]=S2[j];
        }
        uncut=FALSE;
    }
    else// S1[0]>MAXSTRLEN
    {
        T[0]=MAXSTRLEN;
        for(i=1; i<=MAXSTRLEN; i++)
        {
            T[i]=S1[i];
        }
        uncut=FALSE;
    }
    return uncut;
}
Status SubString(SString Sub,SString S,int pos,int len)
{
    //求子串
    //用Sub返回串S的第pos个字符起长度为len的子串
    int i,j;
    if(pos<1||pos>S[0]||len<0||len>S[0]-pos+1)
        return ERROR;
    if(!len)
    {
        Sub=NULL;
        Sub[0]=0;
    }
    else
    {
        for(i=1,j=pos; i<=len-1,j<=pos+len-1; i++,j++)
            Sub[i]=S[j];
        Sub[0]=len;
    }
    return OK;
}

Status Index(SString S,SString T,int pos)
{
    /*模式匹配
    若主串S中存在和串T相同的子串,则返回它在主串S的第pos个
    字符之后第一次出现的位置,否则函数值为0*/
    int n, m,i;
    SString Sub;
    if(pos>0)
    {
        n=StrLength(S);
        m=StrLength(T);
        i=pos;
        while(i<=n-m+1)
        {
            SubString(Sub, S, i, m);
            if (Strcompare(Sub, T) != 0)
                ++i;
            else
                return i;
        }
    }
    return 0;
}

Status StrInsert(SString S,int pos,SString T)
{
    //插入函数
    //在串S的第pos个字符之前插入串T。
    int i;
    if (pos<1 || pos>S[0])
        return ERROR;
    if (S[0] + T[0] < MAXSTRLEN)//完全插入
    {
        for (i = S[0]; i >= pos; i--)
        {
            S[i + T[0]] = S[i];
        }
        for (i = 1; i <=T[0]; i++)
        {
            S[pos-1+i] = T[i];
        }
        S[0] = S[0] + T[0];
        return TRUE;
    }
    else
    {
        for (i = S[0]; i >= MAXSTRLEN-S[0]; i--)
        {
            S[MAXSTRLEN-S[0]+1] = S[i];
        }
        for (i = 1; i <= MAXSTRLEN - S[0]; i++)
        {
            S[pos - 1 + i] = T[i];
        }
        return FALSE;
    }
}

Status StrDelete(SString S,int pos,int len)
{
    //删除
    //从串S中删除第pos个字符起长度为len的子串
    int i;
    if (pos<1 || pos>S[0])
        return ERROR;
    else
        for (i = pos + len ; i<=S[0]; i++)
        {
            S[i-len] = S[i];
        }
    S[0] -= len;
    return  OK;
}

Status StrPrint(SString S)
{
    //输出函数
    int i;
    for (i = 1; i <= S[0]; i++)
    {
        cout << S[i];
    }
    cout << endl;
    return 0;
}

int main()
{
    int pos,len;
    SString S1,S2,T1,T2,Sub;
    char a[100], b[100],c[100];
    cout << "请输入两个串,分别赋值给串s1和串s2" << endl;
    cin >> a >> b;
    StrAssign(S1, a);
    StrAssign(S2, b);
    cout << "把串S1拷贝给T1,输出T1:";
    StrCopy(T1, S1);
    StrPrint(T1);
    cout<<endl;

    if (StrEmpty(T1) == 1)
        cout << "串T1为空!" << endl;
    else
        cout << "串T1非空!" << endl;
    cout<<endl;

    if (Strcompare(S1, S2) > 0)
        cout << "S1>S2" << endl;
    else if (Strcompare(S1, S2) < 0)
        cout << "S1<S2" << endl;
    else
        cout << "S1=S2" << endl;
    cout<<endl;

    cout << "连接S1,S2为T2,输出T2:";
    if (Concat(T2, S1, S2) == 1)
        StrPrint(T2);
    else
        cout << "串连接失败" << endl;
    cout<<endl;

    cout << "串T2的长度为:";
    cout <<StrLength(T2)<< endl;
    cout<<endl;

    cout << "请输入求T2子串的pos和len的值"<<endl;
    cin >> pos>> len;
    if (SubString(Sub, T2, pos, len) == 1)
    {
        cout << "所选区间的子串Sub为:";
        StrPrint(Sub);
    }
    else
        cout << "求子串失败!" << endl;
    cout<<endl;

    cout<<"请输入要查询的子串:";
    cin>>c;
    StrAssign(Sub,c);
    cout<<"请输入要从哪个位置之后开始查询:";
    cin>>pos;
    if (Index(T2,Sub,pos))
    {
        cout<<"pos的值为:";
        cout<<Index(T2,Sub,pos)<<endl;
    }
    else
        cout << "查询失败" << endl;
    cout<<endl;

    cout << "在串S1的第pos位置插入串S2" << endl;
    cout << "输入pos的值:";
    cin >> pos;
    if (StrInsert(S1, pos, S2) == 1)
    {
        cout << "输出串S1:";
        StrPrint(S1);
    }
    else
        cout << "插入失败" << endl;
    cout<<endl;

    cout << "从串S1中删除第pos位置起长度为len的字符" << endl;
    cout << "输入pos,len的值:";
    cin >> pos >> len;
    if (StrDelete(S1, pos, len) == 1)
    {
        cout << "输出删除后的串S1:";
        StrPrint(S1);
    }
    else
        cout << "删除失败" << endl;
    return 0;
}


原创文章 85 获赞 46 访问量 1万+

猜你喜欢

转载自blog.csdn.net/Deam_swan_goose/article/details/105340427