串(纯C语言实现)

本文详细介绍了C语言中串的两种存储结构——顺序存储和链式存储,并详细阐述了包括分配、复制、判断空串、比较大小、求串长、清空、连接、取子串、子串定位、插入、删除、替换和打印在内的基本操作。同时,讨论了经典的BF算法和KMP算法在串的模式匹配中的应用。最后,补充了C语言库函数string.h中常用的字符串操作,如strlen、strcpy、strcmp、strchr、strstr和strcat。
摘要由CSDN通过智能技术生成

1. 串的存储结构

1.1 串的顺序存储

从下标为1的数组分量开始存储

当0号单元存放串的当前长度时,可以定义:(后续基本操作都使用此定义

typedef char SString[MAXSIZE+1];   //后续这样定义串SString S,T; 这样取值S[0],T[1];

但0号单位闲置不用时,可以定义:

typedef struct{
   
    char ch[MAXSIZE+1];
    int length;             //记录串的当前长度
}SString;

还有堆(Heap)式顺序存储结构

typedef struct{
   
    char *ch;
    int length;
}HString;

1.2 串的链式存储

块链结构:

#define CHUNKSIZE 80           //定义块的大小
typedef struct Chunk{
   
    char ch[CHUNKSIZE];
    struct Chunk *next;
}Chunk;
typedef struct{
   
    Chunk *head,*tail;         //头指针和尾指针,可以只要其中一个
    int length;
}LString;

2. 串的基本操作

2.1 分配StrAssign(T,*chars)

生成一个其值等于chars的串T(chars是字符串常量),如StrAssign(s1,"abcd")

Status StrAssign(SString T,char *chars)
{
    
	int i;
	if(strlen(chars)>MAXSIZE)
		return ERROR;
	else
	{
   
		T[0]=strlen(chars);
		for(i=1;i<=T[0];i++)
			T[i]=*(chars+i-1);
		return OK;
	}
}

2.2 复制StrCopy(T,S)

由串S复制得串T

Status StrCopy(SString T,SString S)
{
    
	int i;
	for(i=0;i<=S[0];i++)
		T[i]=S[i];
	return OK;
}

2.3 判断是否为空StrEmpty(S)

Status StrEmpty(SString S)
{
    
	if(S[0]==0)
		return TRUE;
	else
		return FALSE;
}

2.4 比较大小StrCompare(S,T)

返回长度差。若S>T,则返回值>0;若S=T,则返回值=0;若S<T,则返回值<0

int StrCompare(SString S,SString T)
{
    
	int i;
	for(i=1;i<=S[0]&&i<=T[0];++i)
		if(S[i]!=T[i])
			return S[i]-T[i];
	return S[0]-T[0];
}

2.5 求串长StrLength(S)

int StrLength(SString S)
{
    
	return S[0];
}

2.6 清空ClearString(S)

Status ClearString(SString S)
{
    
	S[0]=0;             //令串长为零 
	return OK;
}

2.7 字符串连接Concat(T,S1,S2)

用T返回S1和S2联接而成的新串。若未截断S2,则返回TRUE,否则FALSE

Status Concat(SString T,SString S1,SString S2)
{
   
	int i;
	if(S1[0]+S2[0]<=MAXSIZE)
	{
    
		for(i=1;i<=S1[0];i++)
			T[i]=S1[i];
		for(i=1;i<=S2[0];i++)
			T[S1[0]+i]=S2[i];
		T[0]=S1[0]+S2[0];
		return TRUE;
	}
	else                                //截断S2
	{
    
		for(i=1;i<=S1[0];i++)
			T[i]=S1[i];
		for(i=1;i<=MAXSIZE-<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值