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

实验目的】

(1)掌握顺序串的基本概念;

(2)掌握顺序串的基本运算;

(3)加深对串数据结构的理解,逐步培养解决实际问题的编程能力。

【实验准备】

(1)串的顺序存储结构的特点及算法描述;

(2)顺序串的基本操作。

【实验要求】

(1)采用函数调用的方式完成;

(2)文件funp4-1.cpp的作用是完成顺序串的各项基本操作;

(3)实验提交必须有完整正确的程序,核心语句的注释以及程序运行结果的截图。

【实验内容】

编写一个程序,实现顺序串的各种基本运算,完成如下功能:

(1)建立串s=”abcdefghijk”和串s1=”xy”。

(2)输出串s。

(3)输出串s的长度。

(4)输出串s1。

(5)输出串s1的长度。

(6)提取串s中从第3个字符开始的4个字符而产生串s2。

(7)输出串s2。

(8)将串s1和串s2连接起来而产生串s3。

(9)输出串s3。

注:在Visual Studio 2019中不能成功运行

#include<stdio.h>
#define MAX_SIZE 100

typedef struct
{
    char data[MAX_SIZE]; 
    int length; 
}SqString; 

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 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++) 
        str.data[index] = s.data[index];
    for (index = 0; index < t.length; index++) 
        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++) 
        str.data[index] = s.data[index];
    for (index = 0; index < t.length; index++) 
        str.data[start + index - 1] = t.data[index];
    for (index = start + len - 1; index < s.length; index++) 
        str.data[t.length + index - len] = s.data[index];
    str.length = s.length - len + t.length; 

    return str;
}



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, "abcdefghijk");
    str_assign(s1, "xy");
    printf("  (2)输出串s:");
    disp_str(s);
    printf("  (3)串s的长度:%d\n", str_length(s));
    printf("  (4)输出串s1:");
    disp_str(s1);
    printf("  (5)串s1的长度:%d\n", str_length(s1));
    printf("  (6)提取串s的第3个字符开始的4个字符而产生串s2\n");
    s2 = sub_str(s, 3, 4);
    printf("  (7)输出串s2:");
    disp_str(s2);
    printf("  (8)将串s1和串s2连接起来而产生串s3\n");
    s3 = str_concat(s1, s2);
    printf("  (9)输出串s3:");
    disp_str(s3);
    return 0;
}

  • 4
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值