栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

数据结构:串

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

数据结构:串

#include 
#define MAXSIZE 100
typedef struct
{
	char ch[MAXSIZE];
	int Len;
}String;
int StrLength(String *S)
{
	int i = 0;
	while(S->ch[i]!=''){
		i++;
	}
	S->Len = i;
	return (S->Len);
}
void CreatStr(String *S)
{
	gets(S->ch);
	S->Len = StrLength(S);
}
int SubString(String *S , String *Sub , int pos , int len)
{
	int j;
	if(pos < 1 || pos>S->Len || len < 1 || len>S->Len-pos+1){
		Sub->Len = 0;
		printf("参数错误!n");
		return 0;
	}else{
		for(j = 0 ; j < len ; j++){
			Sub->ch[j] = S->ch[pos+j-1];
		}
		Sub->ch[j] = '';
		Sub->Len = len;
		return 1;
	}
}
int StrDelete(String *S , int i , int l)
{
	int k;
	if(i+l-1>S->Len){
		printf("要删除的子串越界!n");
		return 0;
	}else{
		for(k = i+l-1 ; k < S->Len;k++,i++){
			S->ch[i-1]= S->ch[k];
		}
		S->Len = S->Len-l;
		S->ch[S->Len]= '';
		return 1;
	}
}
int StrInsert(String *S , String *S1 , int i)
{
	int k;
	if(i>S->Len+1){
		printf("插入的位置错误!n");
		return 0;
	}else if(S->Len+S1->Len>MAXSIZE){
		printf("两串长度超过存储空间长度!n");
		return 0;
	}else{
		for(k = S->Len-1 ; k >= i-1 ; k--){
			S->ch[S1->Len+k] = S->ch[k];
		}
		for(k = 0; k < S1->Len;k++){
			S->ch[i+k-1] = S1->ch[k];
		}
		S->Len = S->Len+S1->Len;
		S->ch[S->Len] = '';
		return 1;
	}
}
int StrIndex(String *S , String *T)
{
	int i = 0,j=0,k;
	while(iLen && jLen){
		if(S->ch[i]==T->ch[j]){
			i++;
			j++;
		}else{
			i = i-j+1;
			j=0;
		}
	}
	if(j>T->Len){
		k = i-T->Len+1;
	}else{
		k=-1;
	}
	return k;
 } 
 int Strcompare(String *S1 , String *S2)
 {
 	int i=0,flag = 0;
 	while(S1->ch[i]!=''&&S2->ch[i]!=''){
 		if(S1->ch[i]!=S2->ch[i]){
 			flag =1;
 			break;
		 }else{
		 	i++;
		 }
	 }
	 if(flag==0&&S1->Len==S2->Len){
	 	return 0;
	 }else{
	 	return S1->ch[i]-S2->ch[i];
	 }
 }
int StrCat(String *S,String *T)
{
	int i , flag;
	if(S->Len+T->Len<=MAXSIZE){
		for(i=S->Len;iLen+T->Len;i++){
			S->ch[i] = T->ch[i-S->Len];
		}
		S->ch[i] = '';
		S->Len += T->Len;
		flag = 1;
	}
	else if(S->Len
		for(i=S->Len;i
			S->ch[i] = T->ch[i-S->Len];
		}
		S->Len = MAXSIZE;
		flag = 0;
	}else{
		flag = 0;
	}
	return (flag);
 } 
 void StrReplace(String *S , String *T,String *V)
 {
 	int i,m,n,p,q;
 	n = S->Len;
 	m = T->Len;
 	q = V->Len;
 	p = 1;
 	do{
 		i = StrIndex(S,T);
 		if(i!=-1){
 			StrDelete(S,i,m);
 			StrInsert(S,V,i);
 			p=i+q;
 			S->Len=S->Len+q-m;
 			n=S->Len;
		 }
	 }while((p<=n-m+1)&&(i!=-1));
 }
void Menu()
{
	printf("==============n");
	printf("t1.--建立新串并显示该串的长度n");
	printf("t2.--求子串n");
	printf("t3.--删除子串n");
	printf("t4.--插入子串n");
	printf("t5.--查找子串n");
	printf("t6.--比较两个串的大小n");
	printf("t7.--连接两个串n");
	printf("t8.--子串替换n");
	printf("t0.--返回n");
	printf("==============n");
}
int main() {
	String x , y , z;
	String *S = &x, *S1 = &y , *T = &z;
	int i , flag = 0 , len = 0;
	char ch1 , ch2 , a;
	ch1 = 'y';
	while(ch1=='y' || ch1=='Y'){
		Menu();
		scanf("%c" , &ch2);
		getchar();	
		switch (ch2) {
			case '1':
				printf("请输入一个字符串:");
				CreatStr(S);
				if(S->ch[0] == ''){
					printf("空串n");
				}else {
					printf("字符串的内容为:");
					puts(S->ch);
					printf("该串的长度为:%dn" , S->Len);
				}
				break;
			case '2':
				printf("请输入从第几个位置开始求子串:");
				scanf("%d" , &i);
				printf("请输入取出的子串长度值:");
				scanf("%d" , &len);
				flag =  SubString (S, S1, i, len );
				if(flag){
					printf("求子串成功,原来主串为:n");
					puts(S->ch);
					printf("所得子中内容为:");
					puts(S1->ch);
				}else{
					printf("求子串失败n");
				}
				break;
			case '3':
				printf("请输入要删除的子串的起始位置:");
				scanf("%d" , &i);	
				printf("请输入要删除的子串的长度:");
				scanf("%d" , &len);			
				printf("删除前的子串内容为:");
				puts(S->ch);
				flag = StrDelete(S, i, len);
				if(flag){
					printf("删除子串成功,删除后的新的串为:");
					puts(S->ch);
				}else {
					printf("删除子串失败!n");
				}
				break;
			case '4':
				printf("请输入要插入子串在主串中的位置:");
				scanf("%d" , &i);
				printf("请输入子串");
				getchar();
				CreatStr(S1);	
				printf("插入前的字符串内容为:");
				puts(S->ch);				
				flag = StrInsert(S , S1, i);
				if(flag){
					printf("插入子串成功!插入后的新的主串为:");
					puts(S->ch);
				}else{
					printf("插入子串失败!n");
				}
				break;
			case '5':
				printf("请输入第一个字符串:");
				CreatStr(S);
				printf("请输入第二个字符串:");
				CreatStr(S1);
				flag = StrIndex(S , S1);
				if(flag == -1){
					printf("查找失败,主串中不有该子串n");
				}else {
					printf("查找成功,该子串在主串中第一次出现的位置为%dn" , flag);
				}
				break;
			case '6':
				printf("请输入第一个字符串:");
				CreatStr(S);
				printf("请输入第二个字符串:");
				CreatStr(S1);
				flag = Strcompare(S , S1);
				if(flag>0){
					printf("第一个字符串大n");
				}else if(flag < 0){
					printf("第二个字符串大n");
				}else{
					printf("两个字符串相等n");
				}
				break;	
			case '7':
				printf("请输入第一个字符串:");
				CreatStr(S);
				printf("请输入第二个字符串:");
				CreatStr(S1);
				flag = StrCat(S, S1);
				if(flag ){
					printf("连接以后的新串值为:n" );
					puts(S->ch); 
				}else{
					printf("连接失败!n");
				}
				break;			
			case '8':
				printf("请输入主串:");
				CreatStr(S);
				printf("请输入在主串查找的子串:");
				CreatStr(S1);
				printf("请输入要替换的子串");
				CreatStr(T);				
				printf("替换前的主串内容为:");
				puts(S->ch);				
				StrReplace(S , S1 , T);				
				printf("替换后的主串内容为:");
				puts(S->ch);
				break;
			case '0':
				ch1 = 'n';
				break;
			default:
				printf("输入有误,请输入0-9进行选择!");
		}	
		if(ch2 != '0'){
			printf("n按回车键继续,按任意键返回主菜单!n");
			a = getchar();
			if(a != 'xA'){
				getchar();
				ch1 = 'n';	
			}
		}
	}	
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/870045.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号