目录
串的定义:
在计算机科学中,字符串(或简称为“串”)是字符序列的一种表示形式。这些字符可以是字母、数字、符号或其他可打印的字符。字符串通常用于文本处理、文件操作、网络通信等许多不同的应用领域。
在编程语言中,字符串通常被表示为一种特殊的字符数组。每个字符串都有一个开始字符(第一个字符),一个结束字符(最后一个字符),以及一个指向第一个字符的指针。字符串中的每个字符都有一个特定的位置,从0开始计数。
例如,在Python中,字符串可以表示为文本字符串或字节字符串。在Java中,字符串是特殊的类,而不是数组。在其他语言中,如C和C++,字符串通常表示为字符数组,最后一个元素是空字符('\0')。
在处理字符串时,常见的操作包括连接、分割、查找、替换、排序等。这些操作通常需要使用特定的函数或方法来实现。
串的优缺点:
串的优点主要包括:
- 简单易用:字符串是一个非常简单的数据结构,可以方便地进行操作和处理。
- 灵活性强:字符串可以存储任意类型的数据,并且可以根据需要进行格式化和处理。
- 应用广泛:字符串在计算机科学中应用非常广泛,如文本处理、文件操作、网络通信等。
- 高效性能:字符串在内存中通常以连续的方式存储,这使得读取和写入操作非常快速高效。
- 便于维护:字符串是可变的,可以随时进行修改和更新,这使得数据易于维护和更新。
总之,串作为一种基本的数据结构,在计算机科学中发挥着重要的作用,是进行数据处理和信息交流的重要手段之一。
串的缺点主要包括:
- 存储空间浪费:在串的顺序存储结构中,存储元素需要使用连续的存储空间,这可能会导致存储空间的浪费。特别是在插入和删除操作时,可能需要移动多个元素,导致额外的空间浪费。
- 插入和删除操作效率低:与数组类似,串的顺序存储结构的插入和删除操作需要移动元素,这会导致操作效率低下。特别是当数据量较大时,操作时间可能会显著增加。
- 不适合大量存储:由于串是字符序列,因此其长度通常受限于字符集的大小。对于需要存储大量数据的场景,串可能不是最优的选择。
- 不便于处理大量文本:对于需要处理大量文本的情况,串可能需要频繁地进行插入、删除、查找等操作,这会增加代码的复杂度和运行时间。
- 不支持随机访问:由于串是顺序存储结构,因此不支持随机访问。要访问特定位置的字符,需要从头开始按顺序遍历串,这会降低访问速度。
串的基本运算:
1.初始化
2.添加字符(拷贝)
3.模式匹配
4.打印字符串
5.字符串比较
6.查询字符串第一次出现的位置
7.查询字符串最后出现的位置
8.字符串拼接
9.查询字符串长度
10.查询字符在串中出现的次数
11.帮助
结构体:
typedef struct{
char *data;
int length;
int maxSize;
} sstring;
1.初始化
首先我们在初始化串的时候先给串申请一块内存空间,在把串结构体里面的lenth赋值为0,空间大小手动输入。初始化成功的时候再次初始化子串。我们这里先给串开辟一块2000大小的内存空间。子串大小与主串相等。
执行代码:
//初始化串
int init(sstring *S,int maxSize){
S->data=(char*)malloc(sizeof(char)*maxSize);
if(!S){
return 100001;
}
S->length=0;
S->maxSize=maxSize;
return 0;
}
//这里是执行条件
case 1:
printf("请输入串的容量\n");
scanf("%d",&num);
status=init(&S,num);
if(status==0){
treeColor(status);
printf("初始化成功\n");
init(&B,num);
}
break;
2.添加字符串
添加字符串就是拷贝键盘输入过来的字符数组,先判断这个数组的长度是否大于容量,如果大于,就提示异常信息,如果小于,则一个一个循环依次添加到串里面,再给串长度赋值,我们这里先给主串添加dingjunran,在给子串添加jun
执行代码
int sstrcopy(sstring *S,char *data){
int i;
int length=strlen(data);
if(length>S->maxSize){
return 100002;
}
S->length=0;
for(i=0;i<length;i++){
S->data[i]=data[i];
}
S->data[i]='\0';
S->length=length;
return 0;
}
//这里是执行条件
case 2:
printf("请选择子添加子串还是主串(1主0子)\n");
scanf("%d",&num);
if(num==1){
printf("请输入字符串\n");
scanf("%s",&str1);
status=sstrcopy(&S,str1);
if(status==0){
printf("字符串");
treeColor(status);
printf("%s",str1);
initColor();
printf("成功添加到主串中\n");
}else if(status==100002){
treeColor(4);
printf("错误,串容量不够\n");
}
}else if(num==0){
printf("请输入字符串\n");
scanf("%s",&str1);
status=sstrcopy(&B,str1);
if(status==0){
printf("字符串");
treeColor(status);
printf("%s",str1);
initColor();
printf("成功添加到子串中\n");
}else if(status==100002){
treeColor(4);
printf("错误,串容量不够\n");
}
}else{
treeColor(4);
printf("请输入正确的操作\n");
}
break;
3.模式匹配
模式匹配实现逻辑是,用子串匹配主串,如果子窜前字符纯在主串,子串往后移动,如果有一个匹配不成功,子串回归原位,主串指针往后移动。因为我这里主串数据dingjunran,子串数据,所以能匹配成功。
执行代码
//模式匹配
int sstringMatch(sstring *S,sstring *sub){
int i;
int j;
int k;
int m=S->length;
int n=sub->length;
for(i=0;i<=m;i++){
j=0;
k=i;
while(j<n &&S->data[k]==sub->data[j]){
j++;
k++;
}
if(j==n){
return i;
}
}
return 100003;
}
//这里是执行条件
case 3:
printf("请输入子串进行匹配\n");
status=sstringMatch(&S,&B);
if(status!=100003){
printf("成功匹配字符");
treeColor(0);
printf("%s",str2);
initColor();
printf("在位置");
treeColor(0);
printf("%d",status);
initColor();
printf("处\n");
}else{
treeColor(4);
printf("匹配失败,主串没有该字符串\n");
}
break;
4.打印字符串
打印字符串就是使用循环,以串的长度为终止条件,我这里是打印子串和主串的
执行代码:
void printfString(sstring *S){
int i;
for(i=0;i<S->length;i++){
printf("%c",S->data[i]);
}
printf("\n");
}
//这里是执行条件
case 4:
printf("主串:");
treeColor(0);
printfString(&S);
initColor();
printf("\n");
printf("子串:");
treeColor(0);
printfString(&B);
break;
5.字符串比较
字符串比较逻辑就是主串的长度比较子串的长度,长度一样在比较主串的阿斯克码
因为我这里主串是dingjunran子串是jun,自然就是主串比子串长。
执行代码:
//字符串比较
int stringEquls(sstring *S1,sstring *S2){
if(S1->length<S2->length){
return 100004;
}else if(S1->length>S2->length){
return 100003;
}
int i;
for(i=0;i<S1->length;i++){
if(S1->data[i]<S2->data[i]){
return 100005;
}else if(S1->data[i]>S2->data[i]){
return 100005;
}
}
//执行条件
case 5:
status=stringEquls(&S,&B);
if(status==0){
treeColor(status);
printf("主串和子串相等\n");
}else if(status==100003){
treeColor(6);
printf("主串比子串长\n");
}else if(status==100004 && status!=1){
treeColor(4);
printf("主串比子串短\n");
}
break;
6.查询字符第一次出现的位置
实现逻辑是通过键入一个字符比较串的数据,如果找到返回串的下标,我这边是使用循环来匹配
如果找到直接返回下标,查询的是d这个字符。因为主串是dingjuran,子串是jun。
执行代码:
//查询字符第一次出现的位置
int indexOf(sstring *S,char data[]){
if(S->length==0){
return -1;
}
//只能查询单个字符
if(strlen(data)>1){
return -10086;
}
int i;
for(i=0;i<S->length;i++){
if(S->data[i]==data[0]){
return i;
}
}
return -100006;
}
//这里是执行代码
case 6:
printf("请输入要匹配主串还是子串(1主0子)\n");
scanf("%d",&num);
if(num==1){
printf("请输入字符(单个)\n");
scanf("%s",&str1);
status=indexOf(&S,str1);
if(status!=-100006 && status!=-1 &&status!=-10086){
printf("查询到字符串");
treeColor(0);
printf("%s",str1);
initColor();
printf("第一次出现在主串的");
treeColor(0);
printf("%d",status+1);
printf("位置\n");
}else if(status==-1){
treeColor(6);
printf("请输入单个字符\n");
}else if(status==-10086){
treeColor(4);
printf("主串没有字符!\n");
}else{
treeColor(4);
printf("主串没有该字符\n");
}
}else if(num==0){
printf("请输入字符(单个)\n");
scanf("%s",&str1);
status=indexOf(&B,&str1);
if(status!=-100006 && status!=-1 && status!=-10086){
printf("查询到字符串");
treeColor(0);
printf("%c",c);
initColor();
printf("第一次出现在子串的");
treeColor(0);
printf("%d",status+1);
printf("位置\n");
}else if(status==-10086){
treeColor(6);
printf("请输入单个字符\n");
}else if(status==-1){
treeColor(4);
printf("子串没有字符!\n");
}else{
treeColor(4);
printf("子串没有该字符\n");
}
}else{
treeColor(4);
printf("请输入正确的操作\n");
}
break;
7.查询字符在串中最后出现的位置
这个实现逻辑是,我先定义一个查询字符在串里面出现的个数函数stringNum(后面解释这个怎么实现的),之后在通过循环如果有该字符stringNum-1,当个数为1的时候返回下标,我这里查询的是n,主串是dingjunran,子串是jun(数组下标从0开始,我这边加1了)。
执行代码
//查询字符最后出现的位置
int lastIndexOf(sstring *S,char data[]){
if(S->length==0){
return -1;
}
if(strlen(data)>1){
return -10086;
}
int num=stringNum(S,data);
int i;
for(i=0;i<S->length;i++){
if(S->data[i]==data[0]){
if(num==1){
return i;
}
num--;
}
}
return -100005;
}
//这里是执行条件
case 7:
printf("请输入要匹配主串还是子串(1主0子)\n");
scanf("%d",&num);
printf("请输入字符(单个)\n");
scanf("%s",&str1);
if(num==1){
status=lastIndexOf(&S,str1);
printf("%d\n",status);
if(status!=-100005 && status!=-10086 &&status!=-1){
printf("查询到字符串");
treeColor(0);
printf("%s",str1);
initColor();
printf("最后一次出现在主串的");
treeColor(0);
printf("%d",status+1);
printf("位置\n");
}else if(status==-10086){
treeColor(6);
printf("请输入单个字符\n");
}else if(status==-1){
treeColor(4);
printf("主串没有字符!\n");
}else{
treeColor(4);
printf("主串没有该字符\n");
}
}else if(num==0){
status=lastIndexOf(&B,&str1);
if(status!=-100005 && status!=-1 && status!=-10086){
printf("查询到字符串");
treeColor(0);
printf("%c",c);
initColor();
printf("最后一次出现在子串的");
treeColor(0);
printf("%d",status+1);
printf("位置\n");
}else if(status==-10086){
treeColor(6);
printf("请输入单个字符\n");
}else if(status==-1){
treeColor(4);
printf("子串没有字符!\n");
}else{
treeColor(4);
printf("子串没有该字符\n");
}
}else{
treeColor(4);
printf("请输入正确的操作\n");
}
break;
break;
8.字符串拼接
实现逻辑是如果子串加主串大于容量,就扩容一下,我这里写了一个动态扩容的函数,扩容之后在使用C语言自带的strcat()函数拼接,之后串长度赋值为子串加主串长度,我这里先拼接在打印。
执行代码:
//自己封装动态扩容
int stringCapacity(sstring *s1,sstring *s2){
s1->data=(char*)realloc(s1->data,(s1->length+s2->length)*sizeof(char));
s1->maxSize=s1->length+s2->length+1;
return 0;
}
//字符串的拼接
int sstringSplic(sstring *s1,sstring *s2){
if(s1->length+s2->length>s1->maxSize){
stringCapacity(s1,s2);
}
strcat(s1->data+s1->length,s2->data);
s1->length+=s2->length;
return 0;
}
//这里是执行条件
case 8:
status=sstringSplic(&S,&B);
int str1Len=sstringLength(&S);
int str2Len=sstringLength(&B);
if(status==0){
treeColor(status);
printf("拼接成功主串原长度为");
treeColor(status);
printf("%d",str1Len);
initColor();
printf("现长度为");
treeColor(status);
printf("%d\n",(str1Len+str2Len));
}
break;
9.串的长度查询
这个比较简单执行返子串或者主串的长度
执行代码:
//查询字符串长度
int sstringLength(sstring *S){
return S->length;
}
//执行条件
case 9:
printf("请输入要查询子串还是主串(1主0子)\n");
scanf("%d",&num);
if(num==1){
status=sstringLength(&S);
printf("主串长度为");
treeColor(0);
printf("%d\n",status);
}else if(num==0){
status=sstringLength(&B);
printf("子串长度为");
treeColor(0);
printf("%d\n",status);
}else{
treeColor(4);
printf("请输入正确的操作\n");
}
break;
10.查询字符在串里面出现的个数
实现逻辑 先定一个num 在遍历字符串,之后有相等的字符num就++。我这里查询的是n,因为主串之前拼接了dingjunranjun,子串jun
执行代码
//查询字符出现的个数
int stringNum(sstring *S,char data[]){
if(strlen(data)>1){
return -10086;
}
if(S->length==0){
return -1;
}
int i;
int num=0;
for(i=0;i<S->length;i++){
if(S->data[i]==data[0]){
num++;
}
}
return num;
}
//这里是执行条件
case 10:
printf("请输入要查询子串还是主串(1主0子)\n");
scanf("%d",&num);
printf("请输入要查询的字符\n");
scanf("%s",&str1);
if(num==1){
status=stringNum(&S,str1);
if(status!=-10086&&status!=-1){
printf("主串出现%s字符有",str1);
treeColor(0);
printf("%d个\n",status);
}else if(status==-1){
treeColor(4);
printf("请输入单个字符\n");
}else if(status==-10086){
treeColor(4);
printf("主串为空\n");
}else{
treeColor(4);
printf("主串没有该字符\n");
}
}else if(num==0){
status=stringNum(&B,str1);
if(status!=-10086&&status!=-1){
printf("子串出现%s字符有",str1);
treeColor(0);
printf("%d个\n",status);
}else if(status==-1){
treeColor(4);
printf("请输入单个字符\n");
}else if(status==-10086){
treeColor(4);
printf("子串为空\n");
}else{
treeColor(4);
printf("子串没有该字符\n");
}
}else{
treeColor(4);
printf("请输入正确的操作\n");
}
break;
11.帮助
本次作业串数据结构由季老师指导,丁俊冉完成\n。
整体代码
tree.h
#include <windows.h>
int tree(){
int i, j, n, b, s;
printf("1.深蓝色 2.深绿色 3.深蓝绿色 4.深红色 5.紫色\n");
printf("请输入树的层数以及你喜欢的颜色:");
scanf("%d", &n);
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),n);
for (i = 1; i <= n; i++)
{
for (j = 1; j <= i + 1; j++)
{
for (s = 1; s <= n + 1 - j; s++)
{
printf(" ");
}
for (s = 1; s <= 2 * j - 1; s++)
{
if(s==1){
printf("丁");
}else if(s==2){
printf("俊");
}else{
printf("冉");
}
}
printf("\n");
}
}
for (b = 1; b <= n * 2; b++)
for (s = 1; s <= n * 2; s++)
{
if (s == n * 2)
{
printf("|三|\n");
continue;
}
printf(" ");
}
printf("\n");
}
treeColor(int n){
if(n==0){
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),2);
}else{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),n);
}
}
initColor(){
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),7);
}
sstring.h
char *data;
int length;
int maxSize;
} sstring;
//初始化串
int init(sstring *S,int maxSize);
//字符串常量拷贝
int sstrcopy(sstring *S,char *data);
//模式匹配
int sstringMatch(sstring *S,sstring *sub);
//打印字符串
void printfString(sstring *S);
//字符串比较
int stringEquls(sstring *S1,sstring *S2);
//查询指定字符第一次的位置
int indexOf(sstring *S,char data[]);
//查询字符最后一次出现的位置
int lastIndexOf(sstring *S,char data[]);
//字符串的拼接
int sstringSplic(sstring *s1,sstring *s2);
//查询字符串的长度
int sstringLength(sstring *S);
int stringCapacity(sstring *s1,sstring *s2);
//查询字符在串中出现的次数
int stringNum(sstring *S,char data[]);
sstring.c
//查询字符出现的个数
int stringNum(sstring *S,char data[]){
if(strlen(data)>1){
return -10086;
}
if(S->length==0){
return -1;
}
int i;
int num=0;
for(i=0;i<S->length;i++){
if(S->data[i]==data[0]){
num++;
}
}
return num;
}
//查询字符最后出现的位置
int lastIndexOf(sstring *S,char data[]){
if(S->length==0){
return -1;
}
if(strlen(data)>1){
return -10086;
}
int num=stringNum(S,data);
int i;
for(i=0;i<S->length;i++){
if(S->data[i]==data[0]){
if(num==1){
return i;
}
num--;
}
}
return -100005;
}
//查询字符第一次出现的位置
int indexOf(sstring *S,char data[]){
if(S->length==0){
return -1;
}
//只能查询单个字符
if(strlen(data)>1){
return -10086;
}
int i;
for(i=0;i<S->length;i++){
if(S->data[i]==data[0]){
return i;
}
}
return -100006;
}
//查询字符串长度
int sstringLength(sstring *S){
return S->length;
}
//自己封装动态扩容
int stringCapacity(sstring *s1,sstring *s2){
s1->data=(char*)realloc(s1->data,(s1->length+s2->length)*sizeof(char));
s1->maxSize=s1->length+s2->length+1;
return 0;
}
//字符串的拼接
int sstringSplic(sstring *s1,sstring *s2){
if(s1->length+s2->length>s1->maxSize){
stringCapacity(s1,s2);
}
strcat(s1->data+s1->length,s2->data);
s1->length+=s2->length;
return 0;
}
//字符串比较
int stringEquls(sstring *S1,sstring *S2){
if(S1->length<S2->length){
return 100004;
}else if(S1->length>S2->length){
return 100003;
}
int i;
for(i=0;i<S1->length;i++){
if(S1->data[i]<S2->data[i]){
return 100005;
}else if(S1->data[i]>S2->data[i]){
return 100005;
}
}
return 0;
}
//模式匹配
int sstringMatch(sstring *S,sstring *sub){
int i;
int j;
int k;
int m=S->length;
int n=sub->length;
for(i=0;i<=m;i++){
j=0;
k=i;
while(j<n &&S->data[k]==sub->data[j]){
j++;
k++;
}
if(j==n){
return i;
}
}
return 100003;
}
//初始化串
int init(sstring *S,int maxSize){
S->data=(char*)malloc(sizeof(char)*maxSize);
if(!S){
return 100001;
}
S->length=0;
S->maxSize=maxSize;
return 0;
}
int sstrcopy(sstring *S,char *data){
int i;
int length=strlen(data);
if(length>S->maxSize){
return 100002;
}
S->length=0;
for(i=0;i<length;i++){
S->data[i]=data[i];
}
S->data[i]='\0';
S->length=length;
return 0;
}
void printfString(sstring *S){
int i;
for(i=0;i<S->length;i++){
printf("%c",S->data[i]);
}
printf("\n");
}
main.c
#include <stdio.h>
#include <stdlib.h>
#include "tree.h"
#include "sstring.c"
int main(int argc, char *argv[]) {
sstring S;
sstring B;
int num;
int cmd;
char str1[1000];
char str2[1000];
char c;
int status;
tree();
do
{
//初始化颜色
initColor();
printf("---------串演示程序-----------\n");
printf(" 1. 初始化\n");
printf(" 2. 字符串添加\n");
printf(" 3. 模式匹配\n");
printf(" 4. 打印字符串\n");
printf(" 5. 字符串比较\n");
printf(" 6. 查询字符第一次出现的位置\n");
printf(" 7. 查询字符最后出现的位置\n");
printf(" 8. 字符串的拼接\n");
printf(" 9. 查询字符串长度\n");
printf(" 10.查询字符在串中出现的次数\n");
printf(" 11.帮助\n");
printf("请选择(0~9,0退出):");
scanf("%d", &cmd);
switch(cmd)
{
case 1:
printf("请输入串的容量\n");
scanf("%d",&num);
status=init(&S,num);
if(status==0){
treeColor(status);
printf("初始化成功\n");
init(&B,num);
}
break;
case 2:
printf("请选择子添加子串还是主串(1主0子)\n");
scanf("%d",&num);
if(num==1){
printf("请输入字符串\n");
scanf("%s",&str1);
status=sstrcopy(&S,str1);
if(status==0){
printf("字符串");
treeColor(status);
printf("%s",str1);
initColor();
printf("成功添加到主串中\n");
}else if(status==100002){
treeColor(4);
printf("错误,串容量不够\n");
}
}else if(num==0){
printf("请输入字符串\n");
scanf("%s",&str1);
status=sstrcopy(&B,str1);
if(status==0){
printf("字符串");
treeColor(status);
printf("%s",str1);
initColor();
printf("成功添加到子串中\n");
}else if(status==100002){
treeColor(4);
printf("错误,串容量不够\n");
}
}else{
treeColor(4);
printf("请输入正确的操作\n");
}
break;
case 3:
printf("请输入子串进行匹配\n");
status=sstringMatch(&S,&B);
if(status!=100003){
printf("成功匹配字符");
treeColor(0);
printf("%s",str2);
initColor();
printf("在位置");
treeColor(0);
printf("%d",status);
initColor();
printf("处\n");
}else{
treeColor(4);
printf("匹配失败,主串没有该字符串\n");
}
break;
case 4:
printf("主串:");
treeColor(0);
printfString(&S);
initColor();
printf("\n");
printf("子串:");
treeColor(0);
printfString(&B);
break;
case 5:
status=stringEquls(&S,&B);
if(status==0){
treeColor(status);
printf("主串和子串相等\n");
}else if(status==100003){
treeColor(6);
printf("主串比子串长\n");
}else if(status==100004 && status!=1){
treeColor(4);
printf("主串比子串短\n");
}
break;
case 6:
printf("请输入要匹配主串还是子串(1主0子)\n");
scanf("%d",&num);
if(num==1){
printf("请输入字符(单个)\n");
scanf("%s",&str1);
status=indexOf(&S,str1);
if(status!=-100006 && status!=-1 &&status!=-10086){
printf("查询到字符串");
treeColor(0);
printf("%s",str1);
initColor();
printf("第一次出现在主串的");
treeColor(0);
printf("%d",status+1);
printf("位置\n");
}else if(status==-1){
treeColor(6);
printf("请输入单个字符\n");
}else if(status==-10086){
treeColor(4);
printf("主串没有字符!\n");
}else{
treeColor(4);
printf("主串没有该字符\n");
}
}else if(num==0){
printf("请输入字符(单个)\n");
scanf("%s",&str1);
status=indexOf(&B,&str1);
if(status!=-100006 && status!=-1 && status!=-10086){
printf("查询到字符串");
treeColor(0);
printf("%c",c);
initColor();
printf("第一次出现在子串的");
treeColor(0);
printf("%d",status+1);
printf("位置\n");
}else if(status==-10086){
treeColor(6);
printf("请输入单个字符\n");
}else if(status==-1){
treeColor(4);
printf("子串没有字符!\n");
}else{
treeColor(4);
printf("子串没有该字符\n");
}
}else{
treeColor(4);
printf("请输入正确的操作\n");
}
break;
case 7:
printf("请输入要匹配主串还是子串(1主0子)\n");
scanf("%d",&num);
printf("请输入字符(单个)\n");
scanf("%s",&str1);
if(num==1){
status=lastIndexOf(&S,str1);
printf("%d\n",status);
if(status!=-100005 && status!=-10086 &&status!=-1){
printf("查询到字符串");
treeColor(0);
printf("%s",str1);
initColor();
printf("最后一次出现在主串的");
treeColor(0);
printf("%d",status+1);
printf("位置\n");
}else if(status==-10086){
treeColor(6);
printf("请输入单个字符\n");
}else if(status==-1){
treeColor(4);
printf("主串没有字符!\n");
}else{
treeColor(4);
printf("主串没有该字符\n");
}
}else if(num==0){
status=lastIndexOf(&B,&str1);
if(status!=-100005 && status!=-1 && status!=-10086){
printf("查询到字符串");
treeColor(0);
printf("%c",c);
initColor();
printf("最后一次出现在子串的");
treeColor(0);
printf("%d",status+1);
printf("位置\n");
}else if(status==-10086){
treeColor(6);
printf("请输入单个字符\n");
}else if(status==-1){
treeColor(4);
printf("子串没有字符!\n");
}else{
treeColor(4);
printf("子串没有该字符\n");
}
}else{
treeColor(4);
printf("请输入正确的操作\n");
}
break;
break;
case 8:
status=sstringSplic(&S,&B);
int str1Len=sstringLength(&S);
int str2Len=sstringLength(&B);
if(status==0){
treeColor(status);
printf("拼接成功主串原长度为");
treeColor(status);
printf("%d",str1Len);
initColor();
printf("现长度为");
treeColor(status);
printf("%d\n",(str1Len+str2Len));
}
break;
case 9:
printf("请输入要查询子串还是主串(1主0子)\n");
scanf("%d",&num);
if(num==1){
status=sstringLength(&S);
printf("主串长度为");
treeColor(0);
printf("%d\n",status);
}else if(num==0){
status=sstringLength(&B);
printf("子串长度为");
treeColor(0);
printf("%d\n",status);
}else{
treeColor(4);
printf("请输入正确的操作\n");
}
break;
case 10:
printf("请输入要查询子串还是主串(1主0子)\n");
scanf("%d",&num);
printf("请输入要查询的字符\n");
scanf("%s",&str1);
if(num==1){
status=stringNum(&S,str1);
if(status!=-10086&&status!=-1){
printf("主串出现%s字符有",str1);
treeColor(0);
printf("%d个\n",status);
}else if(status==-1){
treeColor(4);
printf("请输入单个字符\n");
}else if(status==-10086){
treeColor(4);
printf("主串为空\n");
}else{
treeColor(4);
printf("主串没有该字符\n");
}
}else if(num==0){
status=stringNum(&B,str1);
if(status!=-10086&&status!=-1){
printf("子串出现%s字符有",str1);
treeColor(0);
printf("%d个\n",status);
}else if(status==-1){
treeColor(4);
printf("请输入单个字符\n");
}else if(status==-10086){
treeColor(4);
printf("子串为空\n");
}else{
treeColor(4);
printf("子串没有该字符\n");
}
}else{
treeColor(4);
printf("请输入正确的操作\n");
}
break;
case 11:
printf("本次作业串数据结构由季老师指导,丁俊冉完成\n");
break;
}
}while(cmd!=0);
return 0;
}
总结
串是一种基本的数据结构,它是字符序列的一种表示形式,可以方便地进行操作和处理。串具有简单易用、灵活性强、应用广泛等优点,同时也有一些缺点,如存储空间浪费、插入和删除操作效率低、不适合大量存储、不便于处理大量文本以及不支持随机访问等。
在Java里面大部分api底层都是串实现
参考文献
百度
季老师代码
文心一言