【数据结构】(C语言)顺序串的实现

顺序串操作

定义一个顺序串

#define MAXSIZE 100
typedef struct string{
	char str[MAXSIZE];
	int length;
}seqstring;//创建一个顺序串

主函数的创建

seqstring S, T, *p,*q;
int i,j,len;
printf("1 is:");
scanf("%s", S.str);
printf("2 is:");
scanf("%s", T.str);
S.length = strlen(S.str);
T.length = strlen(T.str);

将字符串T内容插入到字符串S的指定位置i上,位置从1开始。

void strinsert(seqstring* S, int i, seqstring T)
{
	int k;
	//区分意外情况
	if (i<1 || i>S->length + 1 || S->length + T.length > MAXSIZE - 1)
		printf("connot insert\n");
	else  //正常插入
	{
		printf("\n");
		//存放字符串的数组下标从0开始
		for (k = S->length - 1; k >= i - 1; k--)//S移动
		{
			S->str[T.length + k] = S->str[k];
		}
		printf("\n");
		for (k = 0; k < T.length; k++)
		{
			S->str[i + k - 1] = T.str[k];
		}
		S->length = S->length + T.length;
		S->str[S->length] = '\0';
	}
}

删除字符串指定位置和指定位置后的字符个数

void strdelete(seqstring* S, int i, int len)
{
	int k;
	if (i<1 || i>S->length || i + len - 1 > S->length) printf(" cannot delete\n");
	else
	{
		for (k = i + len - 1; k < S->length; k++)//i+len-1代表的位置是不删除的第一个元素,下标最大就为length-1
		{
			S->str[k - len] = S->str[k];
		}
		S->length = S->length - len;//有效数据个数变化
		S->str[S->length] = '\0';//将后面元素隔断
	}
}

连接运算,将S2连到S1的后面

seqstring* strconcat(seqstring S1, seqstring S2)
{
	int i;
	seqstring* r;
	if (S1.length + S2.length > MAXSIZE - 1) {
		printf("cannot concate");
		return(NULL);
	}
	else
	{
		r = (seqstring*)malloc(sizeof(seqstring));
		for (i = 0; i < S1.length; i++) r->str[i] = S1.str[i];
		for (i = 0; i < S2.length; i++) r->str[S1.length + i] = S2.str[i];
		r->length = S1.length + S2.length;
		r->str[r->length] = '\0';
	}
	return (r);
}

求子串,在字符串S中提取从i位置开始的len个字符

seqstring* substring(seqstring S, int i, int len)
{
	int k;
	seqstring* r;
	if (i<1 || i>S.length || i + len - 1 > S.length)
	{
		printf("error\n");
		return(NULL);
	}
	else
	{
		r = (seqstring*)malloc(sizeof(seqstring));
		for (k = 0; k < len; k++) {
			r->str[k] = S.str[i + k - 1];
			printf("%d--%d,", i + k - 1, k);
		}

		r->length = len;
		r->str[r->length] = '\0';
	}
	return(r);
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值