数据结构--串--C语言

串的概述

串(字符串):由n(n>=0)个字符组成的有限序列。一般记作s=“s0,s1,s2,…,sn-1”,其中s称作串名,n称作串的长度,双引号括起来的字符序列称作串的值。

子串:一个串中任意个连续的字符组成的子序列。

主串:包含子串的串称为子串的主串。

该字符在串中的位置:一个字符在一个串中的位置序号(>=0)
串相等:大小和值都相等。

注:串“a”:既要存储字符‘a’,也要存储该串的长度数据。与‘a’不同。

串的存储结构

1:静态数组结构(长度难以改变)
2:动态数组结构(常用***)

typedef struct
{
	char *str;
	int max_length;
	int length;
}DString;

3:单字节节点链(空间利用率太低)
4:块链(操作实现复杂)

串基本操作的实现

1:结构定义(如上)
2:初始化

void Init_DString(DString *S, int max, char *string)
{
	int i;
	S->str = (char*)malloc(sizeof(char)*max);//动态生成空间
	S->max_length = max;
	S->length = strlen(string);
	for (i = 0; i < S->length; i++)//生成原始串
	{
		S->str[i] = string[i];
	}
}

3:插入子串

int Insert_DString(DString *S, int pos, DString T)
{
	int i;
	if (pos < 0)//检查
	{
		printf("参数pos出错!\n");
		return 0;
	}
	else
	{
		if (S->length + T.length>S->max_length)//判断空间是否足够
		{
			realloc(S->str, (S->length + T.length)*sizeof(char));//开辟新空间(在前面的基础上)
			S->max_length = S->length + T.length;
		}
		for (i = S->length - 1; i >= pos; i--)//从后往前将元素后移
		{
			S->str[i + T.length] = S->str[i];
		}
		for (i = 0; i < T.length; i++)//插入,生成新串
		{
			S->str[pos + i] = T.str[i];
		}
		S->length += T.length;
		return 1;
	}
}

4:删除子串

int Delete_DString(DString *S, int pos, int len)
{
	int i;
	if (S->length <= 0)//检查
	{
		printf("数组中未存放字符无元素可删!\n");
		return 0;
	}
	else if (pos < 0 || len<0 || pos + len>S->length)
	{
		printf("参数pos和len不合法!\n");
		return 0;
	}
	else
	{
		for (i = pos + len; i <= S->length - 1; i++)//将后面的往前补
		{
			S->str[i - len] = S->str[i];
		}
		S->length -= len;
		return 1;
	}
}

5:取子串

int SubString(DString *S, int pos, int len, DString *T)
{
	int i;
	if (pos < 0 || len<0 || pos + len>S->length)//检查
	{
		printf("参数pos和len出错!\n");
		return 0;
	}
	if (len>T->max_length)//开辟空间
	{
		T->str = (char*)malloc(len*sizeof(char));
		T->max_length = len;
	}
	for (i = 0; i < len; i++)//取子串
	{
		T->str[i] = S->str[pos + i];
	}
	T->length = len;
	return 1;
}

6:撤销串

void Destory(DString *S)
{
	free(S->str);
	S->max_length = 0;
	S->length = 0;
} 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值