/**
* 实验题目:
* 实现顺序串各种基本运算的算法
* 实验目的:
* 领会顺序串存储结构和掌握顺序串中各种基本运算的算法设计
* 实验内容:
* 实现顺序串的各种基本运算
* 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