数据结构C语言之循环字符串

一、循环字符串

1.概念

循环字符串是一种特殊的数据结构,它由一个固定长度的字符串循环构成。在循环字符串中,字符串的末尾连接到字符串的开头,形成一个闭环。

2.优点

  • 易于构建:循环字符串可以通过简单的复制和连接操作构建,相对于其他数据结构来说,实现较为简单。
  • 便于遍历:循环字符串可以很容易地进行遍历,只需要从头开始遍历即可。
  • 节省空间:循环字符串可以重复利用存储空间,相对于普通字符串来说更加节省空间。
  • 效率较高:循环字符串的操作相较于普通字符串来说更为高效,因为其内部实现中会进行优化。
  • 适用范围广:循环字符串可以用于多种应用场景,如加密算法、字符串搜索、字符串压缩等。

二、部分代码及运行结果

1.初始化

int init(sstring *S, int max)
{
	S->data = (char*)malloc(sizeof(char)*max);

	if(!S->data)
	{
		printf("申请内存失败!1000");
		return 1000;
	}
	S->max = max;
	S->len = 0;
}

在这里插入图片描述

2.输入串

	printf("输入主串:\n");
	("%s",st1);
	printf("输入子串:\n");
	scanf("%s",st2);

在这里插入图片描述

3. 从字符常量拷贝

int sstrcpy(sstring *S, char* from)
{
	int i;
	int len = strlen(from);

	if(len>S->max)
	{
		printf("超出了字符串S的长度!1001\n");
		return 1001;
	}
	for(i=0;i<len;i++)
	{
		S->data[i] = from[i];
	}
	S->data[i] = '\0';
	S->len = len;
	return 0;
}

在这里插入图片描述

4. 匹配子串

int sstrmatch(sstring *S, sstring *sub)
{
	int i, j, k;
	int m = S->len;
	int n = sub->len;

	for(i=0;i<=m-n;i++)
	{
		j=0;
		k=i;
		while(j<n && S->data[k] == sub->data[j])
		{
			j++;
			k++;
		}
		if(j==n)
		{
			return i;
		}
	}
	return -1;
}

在这里插入图片描述

5. 串比较

int strmn(sstring *s1,sstring *s2)
{
	int i;

	if (s1->len < s2->len) {
        return -1;
    } else if (s1->len > s2->len) {
        return 1;
    }

    for (i = 0; i < s1->len; i++) {
        if (s1->data[i] < s2->data[i]) {
            return -1;
        } else if (s1->data[i] > s2->data[i]) {
            return 1;
        }
    }

    return 0;
}

在这里插入图片描述

6. 串长度

int strleng(sstring *S){
return (S->len);
}

在这里插入图片描述

7. 连接串

int strlink(sstring *s1,sstring *s2){
  if (s1->len + s2->len > s1->max) {
        s1->data = (char*)realloc(s1->data), (s1->len + s2->len + 1) * sizeof(char);
        s1->max = s1->len + s2->len + 1;
    }
    strcat(s1->data + s1->len, s2->data);
    s1->len += s2->len;
}

在这里插入图片描述

8. 打印串

int connect(sstring *S){
	int i;
	for(i=0;i<S->len;i++){
	printf("%c",S->data[i]);
	}
	printf(" \n");
	return 0;
}

在这里插入图片描述

三、完整代码

1.main.c

#include <stdio.h>
#include "sstring.h"
#include "welcome.h"



int main(int argc, char* argv[])
{
	sstring S;
	sstring sub;
	int index;
	
	int cmd;
	int max;
	int i,m,n;

	char st1[100];
	char st2[100];
	
	for(i=0;i<strlen(welcome);i++)
	{
		printf("%c",welcome[i]);
		for(m=0;m<1000;m++)
			for(n=0;n<1000;n++)
			{
				;
			}
	}

	printf("-----------循环字符串----------\n");
 
	do
	{	
		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(" 0. 返回\n");
		printf(" 请选择(0~6):");
		scanf("%d",&cmd);
		switch(cmd)
		{
		case 1:
			init(&S, 1000);
			init(&sub, 1000);
			printf("初始化已完成\n");
			break;
 
		case 2:
			printf("输入主串:\n");
			scanf("%s",st1);
			printf("输入子串:\n");
			scanf("%s",st2);
			break;
 
     	case 3:
            sstrcpy(&S,st1);
			sstrcpy(&sub,st2);
            printf("拷贝完成\n");
			break;
		
		case 4:
			if(sstrmatch(&S,&sub)>=0)
			{
			printf("位置:%d\n",sstrmatch(&S,&sub));
			}else
            printf("不存在\n");		
			break;

		case 5:
			if(strmn(&S,&sub)>0){
			 printf("S1>S2\n");
			 }else if(strmn(&S,&sub)<0){
			 printf("S1<S2\n");
			 }else
             printf("S1=S2\n");
			 break;
		case 6:
			if(strempty(&S)){
			printf("空\n");
			}else
			printf("主长度:%d",strleng(&S));
			printf("\n");
			printf("子长度:%d",strleng(&sub)); 
			printf("\n");
			break;	
 
		case 7:
			strlink(&S,&sub);
			printf("连接完成\n");
			break;

		case 8:
			if(strempty(&S)){
				printf("空\n");
			}
            put_a_seal_on(&S);
			break;
 
		case 9:
			printf("感谢季老师的指导,本程序在季老师的基础上改写\n");
			break;

		}
 
	}while(cmd!=0);
 
 
	return 0;
 
 
 
}

2.sstring.c

/*
	sstring.c

*/
#include "sstring.h"


/*初始化串*/
int init(sstring *S, int max)
{
	S->data = (char*)malloc(sizeof(char)*max);

	if(!S->data)
	{
		printf("申请内存失败!1000");
		return 1000;
	}
	S->max = max;
	S->len = 0;
}


/*从字符常量拷贝*/
int sstrcpy(sstring *S, char* from)
{
	int i;
	int len = strlen(from);

	if(len>S->max)
	{
		printf("超出了字符串S的长度!1001\n");
		return 1001;
	}
	for(i=0;i<len;i++)
	{
		S->data[i] = from[i];
	}
	S->data[i] = '\0';
	S->len = len;
	return 0;
}


/*模式匹配*/
int sstrmatch(sstring *S, sstring *sub)
{
	int i, j, k;
	int m = S->len;
	int n = sub->len;

	for(i=0;i<=m-n;i++)
	{
		j=0;
		k=i;
		while(j<n && S->data[k] == sub->data[j])
		{
			j++;
			k++;
		}
		if(j==n)
		{
			return i;
		}
	}
	return -1;
}
/*判断是否空*/
int strempty(sstring *S){
     if(S->len == 0)
		 return 1;
	 else
		 return 0;
}
/*比较串*/
int strmn(sstring *s1,sstring *s2)
{
	int i;

	if (s1->len < s2->len) {
        return -1;
    } else if (s1->len > s2->len) {
        return 1;
    }

    for (i = 0; i < s1->len; i++) {
        if (s1->data[i] < s2->data[i]) {
            return -1;
        } else if (s1->data[i] > s2->data[i]) {
            return 1;
        }
    }

    return 0;
}
/*串长度*/
int strleng(sstring *S){
return (S->len);
}
/*连接串*/
int strlink(sstring *s1,sstring *s2){
  if (s1->len + s2->len > s1->max) {
        s1->data = (char*)realloc(s1->data), (s1->len + s2->len + 1) * sizeof(char);
        s1->max = s1->len + s2->len + 1;
    }
    strcat(s1->data + s1->len, s2->data);
    s1->len += s2->len;
}
/*打印串*/
int connect(sstring *S){
	int i;
	for(i=0;i<S->len;i++){
	printf("%c",S->data[i]);
	}
	printf(" \n");
	return 0;
}

3.sstring.h

/*
	sstring.h
	顺序字符串
*/

typedef struct
{
	char* data;
	int max;
	int len;
}sstring;

/*初始化串*/
int init(sstring *S, int max);
/*从字符常量拷贝*/
int sstrcpy(sstring *S, char* from);
/*模式匹配*/
int sstrmatch(sstring *S, sstring *sub);
/*判断是否为空*/
int strempty(sstring *S);
/*串长度*/
int strleng(sstring *S);
/*串比较*/
int strmn(sstring *s1,sstring *s2);
/*串连接*/
int strlink(sstring *s1,sstring *s2);
/*串打印*/
int put_a_seal_on(sstring*S);

4.welcome.h

char welcome[] = "\n\
____________36936936936936936 \n\
____________36936936936936936 \n\
____________369369369369369369 \n\
___________36936936936936933693 \n\
__________36936936魔魔魔93693693 \n\
_________369369369魔魔魔369369369 \n\
_________369369369魔魔魔3693693699 \n\
________3693693693693693693693699369 \n\
_______36936939693693693693693693693693 \n\
_____3693693693693693693693693693693636936 \n\
___36936936936936936936936936936___369369369 \n\
__36936___369336936369369369369________36936 \n\
_36936___36936_369369336936936__??__?? \n\
36933___36936__36936___3693636_???????? \n\
693____36936__36936_____369363_???????? \n\
______36936__36936______369369__?????? \n\
_____36936___36936_______36936___???? \n\
_____36936___36936________36936___?? \n\
_____36936___36936_________36936___11, \n\
______369____36936__________369___11, \n\
______________369________________11, \n\
_______________________________11, \n\
_____________________________11, \n\
___________________________11, \n\
________________________???_??? \n\
_______________________????????? \n\
_______________________????????? \n\
________________________??????? \n\
_________________________????? \n\
__________________________??? \n\
___________________________? \n\
___________________________11, \n\
_____________________________11, \n\
________________________________11, \n\
______________369___________________11, \n\
______369____36936__________369_____11, \n\
_____36936___36936_________36936___11, \n\
_____36936___36936________36936___11, \n\
_____36936___36936_______36936___11, \n\
______36936__36936______369369 _??_?? \n\
693____36936__36936_____369363 ??????? \n\
36933___36936__36936___3693636 ??????? \n\
_36936___36936_369369336936936 _????? \n\
__36936___369336936369369369369 _???__3696 \n\
___36936936936936936936936936936 _?_336939 \n\
_____369369369369爪爪爪36936936936936936 \n\
_______3693693969爪爪爪36936936693693 \n\
________369369369爪爪爪36936999369 \n\
_________36936936936936936933699 \n\
_________3693693693693693369369 \n\
__________36936936936936993693 \n\
___________369369369369333693 \n\
____________3693693693699369 \n\
____________369369369366936 \n\
____________36936936936693\n\n";

四、小结

循环字符串是一种特殊的数据结构,它通过将字符串的末尾连接到开头,形成了一个闭环。这种数据结构在某些应用场景下具有优势,例如打印重复的字符串、生成指定格式的字符串、缓存、共享Session和限速等。然而,循环字符串也存在一些缺点和局限性,所以在使用时需要注意其优缺点和局限性。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值