使用C语言实现数据结构串

目录

串的定义:

串的优缺点:

   串的优点主要包括:

  串的缺点主要包括:

串的基本运算:

1.初始化

2.添加字符串

3.模式匹配 

4.打印字符串

5.字符串比较

6.查询字符第一次出现的位置

7.查询字符在串中最后出现的位置

8.字符串拼接

9.串的长度查询

10.查询字符在串里面出现的个数

11.帮助

整体代码

tree.h

sstring.h

sstring.c

main.c

总结

参考文献


串的定义:

   在计算机科学中,字符串(或简称为“串”)是字符序列的一种表示形式。这些字符可以是字母、数字、符号或其他可打印的字符。字符串通常用于文本处理、文件操作、网络通信等许多不同的应用领域。

在编程语言中,字符串通常被表示为一种特殊的字符数组。每个字符串都有一个开始字符(第一个字符),一个结束字符(最后一个字符),以及一个指向第一个字符的指针。字符串中的每个字符都有一个特定的位置,从0开始计数。

例如,在Python中,字符串可以表示为文本字符串或字节字符串。在Java中,字符串是特殊的类,而不是数组。在其他语言中,如C和C++,字符串通常表示为字符数组,最后一个元素是空字符('\0')。

在处理字符串时,常见的操作包括连接、分割、查找、替换、排序等。这些操作通常需要使用特定的函数或方法来实现。

串的优缺点:

   串的优点主要包括:

  1. 简单易用:字符串是一个非常简单的数据结构,可以方便地进行操作和处理。
  2. 灵活性强:字符串可以存储任意类型的数据,并且可以根据需要进行格式化和处理。
  3. 应用广泛:字符串在计算机科学中应用非常广泛,如文本处理、文件操作、网络通信等。
  4. 高效性能:字符串在内存中通常以连续的方式存储,这使得读取和写入操作非常快速高效。
  5. 便于维护:字符串是可变的,可以随时进行修改和更新,这使得数据易于维护和更新。

总之,串作为一种基本的数据结构,在计算机科学中发挥着重要的作用,是进行数据处理和信息交流的重要手段之一。

  串的缺点主要包括:

  1. 存储空间浪费:在串的顺序存储结构中,存储元素需要使用连续的存储空间,这可能会导致存储空间的浪费。特别是在插入和删除操作时,可能需要移动多个元素,导致额外的空间浪费。
  2. 插入和删除操作效率低:与数组类似,串的顺序存储结构的插入和删除操作需要移动元素,这会导致操作效率低下。特别是当数据量较大时,操作时间可能会显著增加。
  3. 不适合大量存储:由于串是字符序列,因此其长度通常受限于字符集的大小。对于需要存储大量数据的场景,串可能不是最优的选择。
  4. 不便于处理大量文本:对于需要处理大量文本的情况,串可能需要频繁地进行插入、删除、查找等操作,这会增加代码的复杂度和运行时间。
  5. 不支持随机访问:由于串是顺序存储结构,因此不支持随机访问。要访问特定位置的字符,需要从头开始按顺序遍历串,这会降低访问速度。

串的基本运算:

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底层都是串实现

参考文献

百度

季老师代码

文心一言

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值