学习贺利坚老师顺序串算法库
数据结构之自建算法库——顺序串_创建顺序串s1,创建顺序串s2-CSDN博客
本人详细解析博客
串的概念及操作_串的基本操作-CSDN博客
版本更新日志
V1.0: 在贺利坚老师算法库指导下, 结合本人详细解析博客思路基础上,进行测试, 加入异常弹出信息
v1.0补丁: 完善Error ,合法性检测内部,加入英语提示,并有对应函数标号
V1.0
函数功能:
//(1)将一个字符串数组赋值给顺序串
void Assignment_Sequential_string(Sequential_string &New_String, char Assign_array[]);
//(2) 复制一个串,到另一个串
void Copy_Sequential_String(Sequential_string &accept_string, Sequential_string copy_string);
//(3)判断两个串是否相等
bool Equal_Sequential_String(Sequential_string judge_string1, Sequential_string judge_string2);
//(4)求顺序串串长
int Length_Sequential_String(Sequential_string measure_string);
//(5)串连接
Sequential_string Connect_Sequential_String(Sequential_string link1, Sequential_string link2);
//(6)求子串(从begin_loation开始的number个字符)
Sequential_string Get_Sequential_Substring(Sequential_string substring, int begin_loation, int number);
//(7)插入串(从从begin_loation开始插入字符串,然后组合成新的串)
Sequential_string Insert_Sequential_String(Sequential_string old_string, int begin_loation,Sequential_string insert_string);
//(8)删除串(从begin 开始的number个字符)
Sequential_string Delete_Sequential_String(Sequential_string old_string, int begin_loation,int number);
//(9)串替换(从begin 开始的number个字符)
Sequential_string Replace_Sequential_String(Sequential_string old_string, int begin_loation,int number,Sequential_string new_string);
//(10)输出展示串
void Display_Sequential_String(Sequential_string show_String);
顺序串头函数
Sequential_string.h
#ifndef _SEQUENTIAL_STRING_H_INCLUDE
#define _SEQUENTIAL_STRING_H_INCLUDE
#include <stdio.h>
#define MaxSize 100 //最多字符个数
//顺序串数据结构
typedef struct
{
char Sequential_string_data[MaxSize];//数组串数据
int length; //实际串长
}Sequential_string;
//(1)将一个字符串数组赋值给顺序串
void Assignment_Sequential_string(Sequential_string &New_String, char Assign_array[]);
//(2) 复制一个串,到另一个串
void Copy_Sequential_String(Sequential_string &accept_string, Sequential_string copy_string);
//(3)判断两个串是否相等
bool Equal_Sequential_String(Sequential_string judge_string1, Sequential_string judge_string2);
//(4)求顺序串串长
int Length_Sequential_String(Sequential_string measure_string);
//(5)串连接
Sequential_string Connect_Sequential_String(Sequential_string link1, Sequential_string link2);
//(6)求子串(从begin_loation开始的number个字符)
Sequential_string Get_Sequential_Substring(Sequential_string substring, int begin_loation, int number);
//(7)插入串(从从begin_loation开始插入字符串,然后组合成新的串)
Sequential_string Insert_Sequential_String(Sequential_string old_string, int begin_loation,Sequential_string insert_string);
//(8)删除串(从begin 开始的number个字符)
Sequential_string Delete_Sequential_String(Sequential_string old_string, int begin_loation,int number);
//(9)串替换(从begin 开始的number个字符)
Sequential_string Replace_Sequential_String(Sequential_string old_string, int begin_loation,int number,Sequential_string new_string);
//(10)输出展示串
void Display_Sequential_String(Sequential_string show_String);
#endif
顺序串库函数
Sequential_string.cpp
#include "Sequential_string.h"
/**************************************************
(1)函数名: Assignment_Sequential_string
功 能: 将一个字符串数组赋值给顺序串
参 数: (1)Sequential_string &New_String:创建的新串
(2)char Assign_array[]: 原始字符串数组
注 意: 顺序数组,结尾加入'\0'
返回值: 无
**************************************************/
void Assignment_Sequential_string(Sequential_string &New_String, char Assign_array[])
{
int counter;
for(counter = 0; Assign_array[counter] != '\0'; counter++)
{
New_String.Sequential_string_data[counter] = Assign_array[counter];
}
New_String.Sequential_string_data[counter] = '\0';
New_String.length = counter; //更新串最大位序
}
/**************************************************
(2)函数名: Copy_Sequential_String
功 能: 复制一个串,到另一个串
参 数: (1)Sequential_string &accept_string: 复制成的串
(2)Sequential_string copy_string:要复制的串
注 意: 复制成的串,传回的是地址,所以不用传回参数
返回值: 无
**************************************************/
void Copy_Sequential_String(Sequential_string &accept_string, Sequential_string copy_string)
{
int counter;
for(counter = 0; counter < copy_string.length;counter++)
{
accept_string.Sequential_string_data[counter] = copy_string.Sequential_string_data[counter];
}
accept_string.Sequential_string_data[counter] = '\0';
accept_string.length = copy_string.length;
}
/**************************************************
(3)函数名: Equal_Sequential_String
功 能: 判断两个串是否相等
参 数: (1)Sequential_string judge_string1:第一个串
(2)Sequential_string judge_string2:第二个串
返回值: bool?是否相等,true:false
**************************************************/
bool Equal_Sequential_String(Sequential_string judge_string1, Sequential_string judge_string2)
{
bool same = true;
int counter;
if(judge_string1.length != judge_string2.length)
{
same = false;
}
else
{
for(counter = 0; counter < judge_string1.length;counter++)
{
if(judge_string1.Sequential_string_data[counter] != judge_string2.Sequential_string_data[counter])
{
same = false;
break;
}
}
}
return same;
}
/**************************************************
(4)函数名: Length_Sequential_String
功 能: 求顺序串串长
参 数: Sequential_string measure_string:要进行测量的串
返回值: int:顺序串长度信息
**************************************************/
int Length_Sequential_String(Sequential_string measure_string)
{
return measure_string.length;
}
/**************************************************
(5)函数名: Connect_Sequential_String
功 能: 把两个串连接成一个串
参 数: Sequential_string link1, Sequential_string link2:两个要链接的串
返回值: 返回Sequential_string Connection_string: 链接成的串
**************************************************/
Sequential_string Connect_Sequential_String(Sequential_string link1, Sequential_string link2)
{
Sequential_string Connection_string;
int counter;
Connection_string.length = link1.length + link2.length;
//将第一个串加入链接的串
for(counter = 0; counter < link1.length; counter++)
{
Connection_string.Sequential_string_data[counter] = link1.Sequential_string_data[counter];
}
//将第二个串加入链接的串
for(counter = 0; counter < link2.length; counter++)
{
Connection_string.Sequential_string_data[link1.length+counter] = link2.Sequential_string_data[counter];
}
Connection_string.Sequential_string_data[link1.length+counter] = '\0';
return Connection_string;
}
/**************************************************
(6)函数名: Get_Sequential_Substring
功 能: 求子串(从begin_loation开始的number个字符)
参 数: (1)Sequential_string mother_String:母串
(2)int begin_loation:开始分割子串的位置
(3)int number:子串的数量
返回值: Sequential_string son_String:得到的子串
**************************************************/
Sequential_string Get_Sequential_Substring(Sequential_string mother_String, int begin_loation, int number)
{
Sequential_string son_String;
int counter;
son_String.length = 0;
if(begin_loation <= 0 || begin_loation > mother_String.length || number < 0 || begin_loation+number-1>mother_String.length)
{
//错误:分割的子字符串的位置错误。
printf("\nError<6>:The position of the divided substring is wrong.\n");
return son_String; // 参数不正确返回空串
}
for(counter = begin_loation-1; counter < begin_loation+number-1; counter++)
{
son_String.Sequential_string_data[counter-begin_loation+1] = mother_String.Sequential_string_data[counter];
}
son_String.Sequential_string_data[counter-begin_loation+1] = '\0';
son_String.length = number;
return son_String;
}
/**************************************************
(7)函数名: Insert_Sequential_String
功 能: 插入串(从从begin_loation开始插入字符串,然后组合成新的串)
参 数: (1)Sequential_string old_string:在原始串的基础上插入
(2)int begin_loation: 插入的位置
(3)Sequential_string insert_string:插入的新串
思 路: 在原有串的基础上,割开一个口子,放上新串,然后组合成新串
返回值: Sequential_string form_string:组合成的新串
**************************************************/
Sequential_string Insert_Sequential_String(Sequential_string old_string, int begin_loation,Sequential_string insert_string)
{
int counter;
Sequential_string form_string;
form_string.length = 0;
//参数不正确, 返回空串
if(begin_loation <= 0 || begin_loation > old_string.length+1)
{
//错误:插入位置错误
printf("\nError<7>: wrong insertion position.\n");
return form_string;
}
for(counter = 0; counter < begin_loation-1;counter++)
{
form_string.Sequential_string_data[counter] = old_string.Sequential_string_data[counter];
}
for(counter = 0; counter < insert_string.length;counter++)
{
form_string.Sequential_string_data[begin_loation-1+counter] = insert_string.Sequential_string_data[counter];
}
for(counter = begin_loation-1; counter<old_string.length;counter++)
{
form_string.Sequential_string_data[insert_string.length+counter] = old_string.Sequential_string_data[counter];
}
form_string.Sequential_string_data[insert_string.length+counter] = '\0';
form_string.length = old_string.length + insert_string.length;
return form_string;
}
/**************************************************
(8)函数名: Delete_Sequential_String
功 能: 删除串(从begin 开始的number个字符)
参 数: (1)Sequential_string old_string:在原有串的基础上删除
(2)int begin_loation: 开始删除的位置(从逻辑1开始)
(3)int number:删除的数量
注 意: 要判断删除的位置和数量是否正确
返回值:Sequential_string new_string:删除完后的新串
**************************************************/
Sequential_string Delete_Sequential_String(Sequential_string old_string, int begin_loation,int number)
{
int counter;//定义计数器
Sequential_string new_string;
new_string.length = 0;
//合法性判断(begin_loation理应从1开始到leng长度)
if(begin_loation <= 0 || begin_loation > old_string.length || (begin_loation+number-1) > old_string.length)
{
//错误:删除的位置或数量错误。
printf("Error<8>: Wrong location or quantity of deletion.");
return new_string;//返回空串
}
//择出删除位置之前的串
for(counter = 0; counter < begin_loation-1;counter++)
{
new_string.Sequential_string_data[counter] = old_string.Sequential_string_data[counter];
}
//择出删除位置之后的串
for(counter = begin_loation+number-1; counter < old_string.length; counter++)
{
new_string.Sequential_string_data[counter-number] = old_string.Sequential_string_data[counter];
}
new_string.Sequential_string_data[counter-number] = '\0';
new_string.length = old_string.length - number;
return new_string;
}
/**************************************************
(9)函数名: Replace_Sequential_String
功 能: 串替换(从begin 开始的number个字符)
参 数: (1)Sequential_string old_string:原始串
(2)int begin_loation:开始替换的位置
(3)int number:替换的字符个数
(4)Sequential_string replace_string:要替换成的字符串
思 路: 锁定old_string从begin_loation开始的number个字符,
然后开始剪切建立新串,
①把begin_loation之前的字符加入新串,
②要替换成的串加入,
③锁定后的字符加入
④组合成新串,返回传出
注 意: 最后加'\0'
返回值: Sequential_string new_string:替换后,产生的新串
**************************************************/
Sequential_string Replace_Sequential_String(Sequential_string old_string, int begin_loation,int number,Sequential_string replace_string)
{
int counter;
Sequential_string new_string;
new_string.length = 0;
//合法性判断
if(begin_loation <= 0 || begin_loation > old_string.length || begin_loation+number-1>old_string.length)
{
//错误:要替换位置出现错误
printf("\nError<9>: There is an error in the position to be replaced.\n");
return new_string;//返回空串
}
//开始复制剪切
for(counter = 0; counter < begin_loation-1; counter++)
{
new_string.Sequential_string_data[counter] = old_string.Sequential_string_data[counter];
}
//加入要替换的串
for(counter = 0; counter < replace_string.length; counter++)
{
new_string.Sequential_string_data[begin_loation-1+counter] = replace_string.Sequential_string_data[counter];
}
//被替换位置,后面剩余的串
for(counter = begin_loation+number-1; counter < old_string.length; counter++)
{
new_string.Sequential_string_data[counter-number+replace_string.length] = old_string.Sequential_string_data[counter];
}
new_string.Sequential_string_data[counter-number+replace_string.length] = '\0';
new_string.length = old_string.length - number + replace_string.length;
return new_string;
}
/**************************************************
(10)函数名: Display_Sequential_String
功 能: 输出展示串
参 数: Sequential_string show_String:要输出展示的串
注 意: 字符串后续可以换成自定义类型
返回值: 无
**************************************************/
void Display_Sequential_String(Sequential_string show_String)
{
int counter;
if(show_String.length > 0)
{
for(counter = 0; counter < show_String.length; counter++)
{
printf("%c", show_String.Sequential_string_data[counter]);
}
printf("\n");
}
}
main函数测试 1:
范围正常情况下测试:
主函数文件名字
main.cpp
#include <stdio.h>
#include "Sequential_string.h"
int main()
{
Sequential_string test_string,test_string1,test_string2,test_string3,test_string4;
char test_char1[ ] = {'a','b','c','d','e','f','g','h','i','j','k','l','m','n','\0'};
char test_char2[] = {'1','2','3','\0'};
printf("\n顺序串的基本运算如下:\n");
printf("\n(1)建立串test_string和test_string1\n");
Assignment_Sequential_string(test_string, test_char1);
printf("\n(2)输出串test_string:\n");
Display_Sequential_String(test_string);
Assignment_Sequential_string(test_string1, test_char2);
printf("\n(2)输出串test_string1:\n");
Display_Sequential_String(test_string1);
printf("\n(3)串test_string的长度是:%d\n",Length_Sequential_String(test_string));
printf("\n(4)在串test_string的第9个字符位置插入串test_string1,从而产生test_string2\n");
test_string2 = Insert_Sequential_String(test_string,9,test_string1);
printf("\n(5)输出串test_string2:\n");
Display_Sequential_String(test_string2);
printf("\n(6)删除串test_string2第2个字符开始的五个字符,而产生串2\n");
test_string2 = Delete_Sequential_String(test_string2,2,5);
printf("\n(7)输出串test_string2:\n");
Display_Sequential_String(test_string2);
printf("\n(8)将串2第二个字符开始的5个字符替换成串1,从而产生串2\n");
test_string2 = Replace_Sequential_String(test_string2,2,5,test_string1);
printf("\n(9)输出串2\n");
Display_Sequential_String(test_string2);
printf("\n(10)提取串2的第二个字符开始的5个字符而产生串3\n");
test_string3 = Get_Sequential_Substring(test_string2,2,5);
printf("\n(11)输出串3\n");
Display_Sequential_String(test_string3);
printf("\n(12)将串2和串3链接起来,而产生串4\n");
test_string4 = Connect_Sequential_String(test_string2,test_string3);
printf("\n(13)输出串4\n");
Display_Sequential_String(test_string4);
return 0;
}
运行结果展示:
main函数测试 2:
范围超出情况下测试:
主函数文件名字
main.cpp
#include <stdio.h>
#include "Sequential_string.h"
int main()
{
Sequential_string test_string,test_string1,test_string2,test_string3,test_string4;
char test_char1[ ] = {'a','b','c','d','e','f','g','h','i','j','k','l','m','n','\0'};
char test_char2[] = {'1','2','3','\0'};
printf("\n顺序串的基本运算如下:\n");
printf("\n(1)建立串test_string和test_string1\n");
Assignment_Sequential_string(test_string, test_char1);
printf("\n(2)输出串test_string:\n");
Display_Sequential_String(test_string);
Assignment_Sequential_string(test_string1, test_char2);
printf("\n(2)输出串test_string1:\n");
Display_Sequential_String(test_string1);
printf("\n(3)串test_string的长度是:%d\n",Length_Sequential_String(test_string));
printf("\n(4)在串test_string的第100个字符位置插入串test_string1,从而产生test_string2\n");
test_string2 = Insert_Sequential_String(test_string,100,test_string1);
printf("\n(5)输出串test_string2:\n");
Display_Sequential_String(test_string2);
printf("\n(6)删除串test_string2第99个字符开始的五个字符,而产生串2\n");
test_string2 = Delete_Sequential_String(test_string2,99,5);
printf("\n(7)输出串test_string2:\n");
Display_Sequential_String(test_string2);
printf("\n(8)将串2第88个字符开始的5个字符替换成串1,从而产生串2\n");
test_string2 = Replace_Sequential_String(test_string2,88,5,test_string1);
printf("\n(9)输出串2\n");
Display_Sequential_String(test_string2);
printf("\n(10)提取串2的第33个字符开始的5个字符而产生串3\n");
test_string3 = Get_Sequential_Substring(test_string2,33,5);
printf("\n(11)输出串3\n");
Display_Sequential_String(test_string3);
printf("\n(12)将串2和串3链接起来,而产生串4\n");
test_string4 = Connect_Sequential_String(test_string2,test_string3);
printf("\n(13)输出串4\n");
Display_Sequential_String(test_string4);
return 0;
}