实现顺序串各种基本运算的算法

/**
*    实验题目:
*        实现顺序串各种基本运算的算法
*    实验目的:
*        领会顺序串存储结构和掌握顺序串中各种基本运算的算法设计
*    实验内容:
*        实现顺序串的各种基本运算
*        1、建立串s="abcdefghijklmn"和串s1="123"
*        2、输出串s
*        3、输出串s的长度
*        4、在串s的第9个字符位置插入串s1而产生串s2
*        5、输出串s2
*        6、删除串s第2个字符开始的3个字符而产生串s2
*        7、输出串s2
*        8、将串s第2个字符开始的5个字符替换成串s1而产生串s2
*        9、输出串s2
*        10、提取串s的第2个字符开始的10个字符而产生串s3
*        11、输出串s3
*        12、将串s1和串s2连接起来而产生串s4
*        13、输出串s4
*/

#include

#define MAX_SIZE 100

typedef struct
{
    char data[MAX_SIZE]; // 串中字符
    int length; // 串长
}SqString; // 声明顺序串类型

/*-----------------将字符串常量赋给串s--------------------*/
static void str_assign(SqString &s, char cstr[])
{
    int i;

    for(i = 0; cstr[i] != '\0'; i++)
        s.data[i] = cstr[i];
    s.length = i;
}

/*-----------------销毁串--------------------*/
static void destroy_str(SqString &s)
{

}

/*-----------------串复制--------------------*/
static void str_copy(SqString &s, SqString t)
{
    int i;

    for(i = 0; i < t.length; i++)
        s.data[i] = t.data[i];
    s.length = t.length;
}

/*-----------------判断串相等--------------------*/
static bool str_equal(SqString s, SqString t)
{
    bool same = true;

    if(s.length != t.length) // 长度不相等时返回false
        same = false;
    else
    {
        for(int i = 0; i < s.length; i++)
        {
            if(s.data[i] != t.data[i]) // 有一个对应字符不相同时返回假
            {
                same = false;
                break;
            }
        }
    }

    return same;
}

/*-----------------求串长度--------------------*/
static int str_length(SqString s)
{
    return s.length;
}

/*-----------------串连接--------------------*/
static SqString str_concat(SqString s, SqString t)
{
    int index;
    SqString str;

    str.length = 0;
    for(index = 0; index < s.length; index++) // s.data[0...s.length-1]->str
        str.data[index] = s.data[index];
    for(index = 0; index < t.length; index++) // t.data[0...t.length-1]->str
        str.data[s.length + index] = t.data[index];
    str.length = s.length + t.length; // 计算串长

    return str;
}

/*-----------------求子串--------------------*/
static SqString sub_str(SqString s, int start, int len)
{
    int index;
    SqString str;

    str.length = 0;
    if((start <= 0) || (start > s.length) || (len < 0) || (start + len - 1 > s.length)) // 参数不正确时返回空串
        return str;
    for(index = start - 1; index < start + len - 1; index++)
        str.data[index - start + 1] = s.data[index];
    str.length = len;

    return str;
}

/*-----------------插入子串--------------------*/
static SqString ins_str(SqString s1, int i, SqString s2)
{
    int j;
    SqString str;

    str.length = 0;

    if(i <= 0 || i > s1.length + 1) // 参数不正确时返回空串
        return str;

    for(j = 0; j < i - 1; j++) // s1.data[0...i-2]->str
        str.data[j] = s1.data[j];
    for(j = 0; j < s2.length; j++) // s2.data[0...s2.length-1]->str
        str.data[i + j - 1] = s2.data[j];
    for(j = i - 1; j < s1.length; j++) // s1.data[i-1...s1.length-1]->str
        str.data[s2.length + j] = s1.data[j];
    str.length = s1.length + s2.length;

    return str;
}

/*-----------------删除子串--------------------*/
static SqString del_str(SqString s, int start, int len)
{
    int index;
    SqString str;

    str.length = 0;

    if((start <= 0) || (start > s.length) || (start + len > s.length + 1)) // 参数不正确时返回空串
        return str;
    for(index = 0; index < start - 1; index++) // s.data[0...start-2]->str
        str.data[index] = s.data[index];
    for(index = start + len - 1; index < s.length; index++) // s.data[start + len - 1...s.length-1]->str
        str.data[index - len] = s.data[index];
    str.length = s.length - len;

    return str;
}

/*-----------------替换子串--------------------*/
static SqString rep_str(SqString s, int start, int len, SqString t)
{
    int index;
    SqString str;

    str.length = 0;

    if((start <= 0) || (start > s.length) || (start + len - 1 > s.length)) // 参数不正确时返回空串
        return str;
    for(index = 0; index < start - 1; index++) // s.data[0...start-2]->str
        str.data[index] = s.data[index];
    for(index = 0; index < t.length; index++) // t.data[0...t.length-1]->str
        str.data[start + index - 1] = t.data[index];
    for(index = start + len - 1; index < s.length; index++) // s.data[start + len - 1...s.length - 1]->str
        str.data[t.length + index - len] = s.data[index];
    str.length = s.length - len + t.length; // 计算串长

    return str;
}


/*-----------------输出串s--------------------*/
static void disp_str(SqString s)
{
    int i;

    if(s.length > 0)
    {
        for(i = 0; i < s.length; i++)
            printf("%c", s.data[i]);
        printf("\n");
    }
}

int main(int argc, char *argv[])
{
    SqString s, s1, s2, s3, s4;

    printf("顺序串的基本运算如下:\n");
    printf("  (1)建立串s和串s1\n");
    str_assign(s, "abcdefghijklmn");
    str_assign(s1, "123");
    printf("  (2)输出串s:");
    disp_str(s);
    printf("  (3)串s的长度:%d\n", str_length(s));
    printf("  (4)在串s的第9个字符位置插入串s1而产生串s2\n");
    s2 = ins_str(s, 9, s1);
    printf("  (5)输出串s2:");
    disp_str(s2);

    printf("  (6)删除串s第2个字符开始的3个字符而产生串s2\n");
    s2 = del_str(s, 2, 3);
    printf("  (7)输出串s2:");
    disp_str(s2);

    printf("  (8)将串s第2个字符开始的5个字符替换成串s1而产生串s2\n");
    s2 = rep_str(s, 2, 5, s1);
    printf("  (9)输出串s2:");
    disp_str(s2);

    printf("  (10)提取串s的第2个字符开始的10个字符而产生串s3\n");
    s3 = sub_str(s, 2, 10);
    printf("  (11)输出串s3:");
    disp_str(s3);

    printf("  (12)将串s1和串s2连接起来而产生串s4\n");
    s4 = str_concat(s1,s2);
    printf("  (13)输出串s4:");
    disp_str(s4);
    destroy_str(s);
    destroy_str(s1);
    destroy_str(s2);
    destroy_str(s3);
    destroy_str(s4);

    return 0;
}
测试结果:

顺序串的基本运算如下:
  (1)建立串s和串s1
  (2)输出串s:abcdefghijklmn
  (3)串s的长度:14
  (4)在串s的第9个字符位置插入串s1而产生串s2
  (5)输出串s2:abcdefgh123ijklmn
  (6)删除串s第2个字符开始的3个字符而产生串s2
  (7)输出串s2:aefghijklmn
  (8)将串s第2个字符开始的5个字符替换成串s1而产生串s2
  (9)输出串s2:a123ghijklmn
  (10)提取串s的第2个字符开始的10个字符而产生串s3
  (11)输出串s3:bcdefghijk
  (12)将串s1和串s2连接起来而产生串s4
  (13)输出串s4:123a123ghijklmn

你可能感兴趣的:(数据结构与算法)