【数据结构】串(定长顺序串、堆串、块链串)的存储结构及基本运算(C语言)

本文介绍了串的基本概念,包括串的定义、子串、主串和相等的概念。接着详细讨论了三种串的存储结构:定长顺序串、堆串和块链串,分别给出了代码实现和运行结果。堆串通过动态分配内存存储串值,而块链串利用链表结构,以块的形式存储字符,实现了灵活的存储密度调整。
摘要由CSDN通过智能技术生成

1. 串的基本概念

字符串(String)是由零个或多个字符组成的有限序列。记为 S = ‘a1a2…an’(n>0)
其中,S是串的名字,用单引号括起来的字符序列是串的值,每个 ai(1<=i<=n)可以是字母、数字或其它字符。n是串中字符的个数,称为串的长度,n=0时的串称为空串。

子串:串中任意个连续的字符组成的子序列称为该串的子串。
主串:包含子串的串称为主串。
子串在主串中的位置:通常将字符在串中的序号称为该字符在串中的位置。子串在主串中的位置则以子串的第一个字符在主串中的位置来表示。
串相等:当且仅当两个串的值相等时,称这两个串是相等的,即只有当两个串的长度相等,并且每个对应位置的字符都相等时才相等。

串是一种特定的线性表,串的逻辑结构和线性表极为相似,其特定性仅在于串的数据对象限定为字符集。常用的实现方法有定长顺序串、堆串和块链串。

串的模式匹配(简单模式匹配算法、KMP算法)见:https://blog.csdn.net/weixin_51450101/article/details/122684649

2. 定长顺序串

定长顺序串是将串设计成一种静态结构类型,用一组地址连续的存储单元来存储串的字符序列。

2.1 代码+注释

# include<stdio.h>
# define MAXLEN 40
# define TRUE 1
# define FALSE 0

/*定长顺序串*/
/*定长顺序串的存储结构*/
typedef struct {
   
	char ch[MAXLEN];
	int len;			//字符串长度
}SString;

/*定长顺序串初始化*/
void StrInit(SString* S) {
   
	S->len = 0;
}

/*定长顺序串的创建*/
void StrCreate(SString* S) {
   
	int n, i;
	printf("字符串长度为:");
	scanf("%d", &n);
	printf("请输入字符串:");
	for (i = 0; i < n; i++) {
   
		scanf(" %c", &(S->ch[i]));
	}
	S->len = n;
}

/*插入*/
int StrInsert(SString* S, int pos, SString *t) {
   
//在串S中下标为pos的字符之前插入串t
	int i;
	if (pos < 0 || pos > S->len)				//插入位置不合法
		return FALSE;
	if (S->len + t->len <= MAXLEN) {
   			//插入后串长<=MAXLEN
		for (i = S->len + t->len - 1; i >= t->len + pos; i--)
			S->ch[i] = S->ch[i - t->len];		//位置pos后的字符串后移
		for (i = 0; i < t->len; i++)
			S->ch[i + pos] = t->ch[i];			//将t串插入
		S->len = S->len + t->len;
	}
	else if (pos + t->len <= MAXLEN) {
   			//插入后串长大于MAXLEN,但串t的字符序列可以全部插入
		for (i = MAXLEN - 1; i > t->len + pos - 1; i--)
			S->ch[i] = S->ch[i - t->len];
		for (i = 0; i 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值