数据结构上机实验之串子系统

C语言实现串子系统

这个串子系统是我借鉴网上一部分人的代码,然后自己添加注释得到的,在原来的八个功能的基础上添加了一个显示字串长度的功能,所以一共九个功能。
功能分别为:
1、输入字串
2、连接字串
3、取出子串
4、删除子串
5、插入子串
6、查找子串
7、比较串大小
8、显示字串
9、显示字串长度

还有一点想说的是,在第二个功能连接字符串中,我使用了strcat()函数,以下是C语言函数中对其的介绍:
strcat:字符串连接函数
函数原型:char *strcat (char *dest,char *src);
头文件:#include<string.h>
是否是标准函数:是
函数功能:将两个字符串连接合并成一个字符串,也就是把字符串 src连接到字符串 dest 后面,连接后的结果放在字符串 dest 中
返回值:指向字符串 dest 的指针
例程如下: 应用 strcat 连接字符串。

 #include <string.h>  
 #include <stdio.h>  
 int main( ) 
  {    
  char dest[20]={“ ”};  
  char *hello = "hello ", *space = " ", *world = "world";   
  strcat(dest, hello);      
  strcat(dest, space);  
  strcat(dest, world);      
  printf("%s\n", destination);  
  getch();     
  return 0;
  } 

例程说明:
(1)首先,程序声明了一个字符数组和三个字符串变量,将字符数组 dest 初始化位空 串,其余三个字符串变量分别赋予初值。
(2)程序通过调用 strcat 函数实现字符串的连接,首先将字符串 hello 添加到字符数组 dest 的末端,此时字符数组 dest 的值有空串变为"hello",然后继续调用两次 strcat 函数,依 次将字符串 space 和字符串 world 陆续连接到字符数组 dest 的末端,从而完成整个字符串的 连接操作。
(3)最后将最终的结果输出。
本例程最终的运行结果是:

hello world 

废话不多说,直接上代码。

    #include<stdio.h>
    #include<string.h>
    #define MAXLEN 100	//串的最大长度	
    
    typedef struct
    {
    	char vec[MAXLEN];	//存储串的一维数组		
    	int len;			//串的当前长度 
    }str;
    
    //取出子串
    void SubStr(str *r,int i,int j) { 
    	int k; 
    	str a; 
    	str *r1=&a; 
    	
    	if (i+j-1 > r->len)	//判断子要取出的串是否超出字串长度 
    		printf ("\n子串超界!\n");   
    	else  
    	{
    		for ( k=0; k<j; k++)	//循环取出子串存入r1 
    			r1->vec[k] = r->vec[i+k-1]; 
    		r1->len = j; 
    		r1->vec[r1->len] = '\0'; 
    	} 
    	printf("\n取出字符为:"); 
    	puts(r1->vec);	
    	
    }

//删除子串
void DelStr(str *r,int i,int j) 
 {
	int k; 
	
	if(i+j-1 > r->len) //判断需要删除的子串是否超界 
		printf("\n所要删除的子串超界!\n"); 
	else  
	{
		for ( k = i+j; k < r->len; k++,i++) //删除子串,并将剩余子串连接好 
			r->vec[i] = r->vec[k]; 
		r->len = r->len-j;
		r->vec[r->len] = '\0';
		printf("\n删除成功!\n");
	}
	
}


//插入字符串 
void InsStr(str *r,str *r1,int i)	
 {
	int k; 
	
	/*可以插入子串的条件,插入位置不超界且插入子串加原字串长度不得超过MAXLEN*/
	/*故插入位置超界或者 插入子串加原字串长度不得超过MAXLEN便不能插入*/ 
	if( i >= r->len || r->len+r1->len > MAXLEN) 
		printf("\n不能插入!\n"); 
	else 
	{
		for( k = r->len-1; k >= i; k--) //将字串位置i后的元素向后移动子串的长度个单位 
			r->vec[r1->len+k] = r->vec[k]; 
		for( k=0; k < r1->len; k++)	//再将子串插入字串对应位置中 
			r->vec[i+k] = r1->vec[k]; 
		r->len = r->len+r1->len; 
		r->vec[r->len] = '\0'; 
		printf("\n插入成功!\n");
	} 
	
} 


//查找子串 
int IndexStr(str *s,str *t)  
{
	int i,j,k;     /* k记录每一趟比较时子串的下标,均从0开始 */
	
	for( i=0; s->vec[i]; i++) 
		for( j=i,k=0; s->vec[j] == t->vec[k]; j++,k++) //如果不相等,退到外层循环 
			if(!t->vec[k+1]) 
				return i; 
	/*t->vec[k+1]为‘/0’表示子串比较完毕,返回匹配成功标志*/			
	
	return -1; 
	/* 主串比较完毕即当s->vec[i]为‘/0’时结束外重循环,返回匹配不成功标志 */
	
} 


//计算字符串长度 
int LenStr(str *r)
 {	
	int i=0; 
	
	while(r->vec[i] != '\0') //累加计算字符串长度 
		i++; 
		
	return i; 
	
} 


 //创建字符串 
str *CreateStr(str *r)
 {
	gets(r->vec); 
	r->len = LenStr(r); 
	
	return r; 
	
} 


//比较两字串大小 
int EqualStr(str *r1,str *r2) 
 {
	int i; 
	
	for( i=0; r1->vec[i] && r2->vec[i] && r1->vec[i] == r2->vec[i]; i++);
	/*此for循环是为了找到两字串第一次元素不同的位置,并跳出循环*/ 
	
	return r1->vec[i]-r2->vec[i]; 
	/*然后 通过返回该位置两字串元素的差,就能通过结果的正负来得出两字串的大小比较*/ 
	
}


void main() 
 {
	str a,b,c,d; 
	str *r=&a,*r1=&b; 
	r->vec[0] = '\0'; 
	int i,j,choice; 
	
	while( 1 )  
	{    
		printf("\n                  串子系统                   \n");   
		printf("\n*********************************************");   
		printf("\n*            1------输 入 字 串             *");   
		printf("\n*            2------连 接 字 串             *");   
		printf("\n*            3------取 出 子 串             *");   
		printf("\n*            4------删 除 子 串             *");   
		printf("\n*            5------插 入 子 串             *");      
		printf("\n*            6------查 找 子 串             *");   
		printf("\n*            7------比较 串大小             *");   
		printf("\n*            8------显 示 字 串             *");  
		printf("\n*            9------显示字串长度            *"); 
		printf("\n*            0------返       回             *");   
		printf("\n*********************************************"); 
		
		printf("\n\n请选择菜单号(0--9): ");
		scanf("%d",&choice); 
		getchar(); 
		
		if(choice == 1) 
		{
			printf("\n请输入一个字符串:"); 
			gets(r->vec); 
			r->len=LenStr(r); 
			printf("\n输入成功!\n");
		}
		else if(choice == 2) 
		{
			printf("\n请输入所要连接的字符串:"); 
			r1=CreateStr(&b); 
			strcat(r->vec,r1->vec);
			r->len=r->len+r1->len;
			printf("\n连接成功!\n"); 
		}
		else if(choice == 3) 
		{
			printf("\n请输入从第几个字符开始:"); 
			scanf("%d",&i);
			getchar(); 
			printf("\n请输入取出的连续字符数:"); 
			scanf("%d",&j); 
			getchar(); 
			SubStr(r,i,j); 
		} 
		else if(choice == 4) 
		{
			printf("\n请输入从第几个字符开始:"); 
			scanf("%d",&i);
			getchar(); 
			printf("\n请输入删除的连续字符数:"); 
			scanf("%d",&j); 
			getchar(); 
			DelStr(r,i-1,j); 
			
		} 
		else if(choice == 5) 
		{  
			printf("\n请输入在第几个字符前插入: ");  
			scanf("%d",&i);  
			getchar();  
			printf("\n请输入所要插入的子串: ");  
			r1=CreateStr(&b);   
			InsStr(r,r1,i-1); 
		} 
		else if(choice == 6) 
		{  
			printf("\n请输入所要查找的子串: ");  
			r1=CreateStr(&b); 
			i=IndexStr(r,r1);  
			if(i!=-1)   
				printf("\n该子串第一次出现的位置是第%d个。\n",i+1);  
			else    
				printf("\n该子串不在其中!\n"); 
		} 
		else if(choice == 7) 
		{   
			printf("\n请输入第一个字符串: ");  
			gets(c.vec);  
			printf("\n请输入第二个字符串串: ");  
			gets(d.vec);  
			if(EqualStr(&c,&d) > 0) 
				printf("\n第一个串大!\n"); 
			else if(EqualStr(&c,&d) < 0) 
				printf("\n第二个串大!\n"); 
			else 
				printf("\n两个串一样大!\n"); 
		} 
		else if(choice == 8) 
		{
			if(r->vec[0]=='\0') 
				printf("\n该字符串值为空!\n"); 
			else
			{
				printf("\n该字符串值为:");
				puts(r->vec); 
			} 
		} 
		else if(choice == 9)
			printf("字符串长度为:%d",r->len);
		else if(choice == 0) 
			break; 
		else 
			printf("\n输入有错误,请重新输入\n"); 
			
	} 
	
}

程序运行截图

菜单运行界面

菜单运行截图
可以看到,菜单总共有九个功能,输入数字即可选择对应的功能。

主要功能运行截图

输入字串
这里一功能1举例,输入1,然后跳出提示语,此时输入要输入的字符串,我这里输入的是:zxcvbn,其他功能暂不举例,有兴趣可以自己试验。

总结

这里的串子系统是使用的顺序存储实现,其存储结构也与严蔚敏老师的数据结构第二版上提到的一致,在实现难度上,只要明确算法,思路清晰,还是很容易实现的。

猜你喜欢

转载自blog.csdn.net/weixin_43762935/article/details/84330825