考研数据结构有关串的总结归纳及代码实现| 8月更文挑战

1,253 阅读2分钟

考研数据结构有关串的总结归纳及代码实现

一、串的基本概念

字符串(String):是由零个或多个字符组成的有限序列,记为:S = ′a1 a2 … an′( n ≥ 0 ) ai∈V字符集合,每个 ai( 1 ≤ i≤ n)可以是字母、数字或其他字符。 串也是一种特定的线性表,串的逻辑结构和线性表极为相似,其特定性仅在于串的数据对象限定为字符集。

  • 串的名字:S
  • 串的值:用单引号括起来的字符序列
  • 串的长度:n 是串中字符的个数
  • 空串( Null String):n=0 时的串
  • 空格串(空白串):一个或多个空格组成的串,其长度为空格个数。
  • 串相等:当且仅当两个串的值相等时,称这两个串是相等的。即只有当两个串的长度相等,并且每个对应位置的字符都相等时才相等。
  • 子串:串中任意个连续的字符组成的子序列称为该串的子串。
  • 主串:包含子串的串相应地称为主串。可见,子串是主串的一部分。
  • 求子串:sub(主串,起始位置,长度) 例:sub(‘china’,2,2)=‘in’ 模式串在主串种的位置(串的模式匹配): 从主串起始位置起,模式串在主串种首次出现的位置序号 例:主串‘chinachina’模式串‘in’ 如起始位置为0,则模式串第一个字符在主串种的位置为2 如起始位置为3,则模式串第一个字符在主串种的位置为7

二、串的顺序存储表示

特点:用一组地址连续的存储单元存储串值的字符序列

//1.串的定长存储 
#define MaxSize 50
typedef struct SString{
	char str[MaxSize+1];
	int length; 
}SString;

//2.串的变长存储 
typedef struct HString{
	char *ch;
	int length;
}HString; 

在这里插入图片描述

三、顺序串的基本操作

1.串的初始化
  • 目标:初始化一个空串S。
#define OVERFLOW 0
#define OK 1
#define InitSize 50
//3.顺序串的初始化
int InitString(HString &S){
	S.ch = (char *)malloc(sizeof(char)*InitSize);
	if(!S.ch)
		exit(OVERFLOW);
	S.length = 0;
	return OK;
} 
2.求串长
  • 目标:返回当前串的长度(不包含‘\0的长度’)
//4.求串长
int SteLength(HString S){
	return S.length;
} 
3.串的插入
  • 目标:在串S的第pos个字符之前(包括尾部)插入串T
#define ERROR 0
#define TRUE 1
//5.串的插入基本操作
int StrInsert(HString &S,int pos,HString T){
	if(pos<1||pos>S.length+1)
		return ERROR;
	if(T.length){
		S.ch = (char *)realloc(S.ch,(S.length+T.length)*sizeof(char));
		if(!(S.ch))
			exit(OVERFLOW);
		for(i=S.length-1;i>=pos-1;i--)
			S.ch[i+T.length] = S.ch[i];
		for(i=0;i<T.length;i++)
			S.ch[i+pos-1] = T.ch[i];
		S.length+=T.length;
	}
	return TRUE;
} 

在这里插入图片描述

4.串的比较
  • 目标:比较字符串S与T的大小,若S>T则返回正数,若S<T,则返回负数,若S=T,则返回0。
//5.串的比较
int StrCompare(HString S,HString T){
	for(int i=0;i<S.length&&i<T.length;i++)
		if(S.ch[i]!=T.ch[i])
			return S.ch[i]-T.ch[i];
	return S.length-T.length;
} 

在这里插入图片描述

5.串的指派(串的赋值操作)

目标:把当前chars指针指向的字符串指派给T,若T中已有数据则清空后再指派。

//6.串的指派(串的赋值操作)
int StrAssign(HString &T,char *chars){
	if(T.ch)
		free(T.ch);
	char *c;
	int i;
	for(i=0,c=chars;*c!='\0';++i,++c);
	if(!i){
		T.ch = NULL;
		T.length = 0;
	}
	else{
		if(!(T.ch=(char *)malloc(i*sizeof(char))))
			exit(OVERFLOW);
		for(int j=0;j<i;j++)
			T.ch[j]=chars[j]; //chars[j]等价于*c、*chars 
			T.length = i;
	}
	
	return TRUE;
	
} 

在这里插入图片描述

6.求子串
  • 目标:将串S中从第pos个字符开始长度为len的字符序列复制到串Sub中。
//7.求子串
int GetSubString(HString &SubStr,HString S,int pos,int len){
	if(pos<1||pos>S.length||len<0||len>S.length-pos+1)
		return ERROR;
	if(SubStr.ch){
		free(SubStr.ch);
		SubStr.ch = NULL;
	}
	if(len==0){
		SubStr.ch=NULL;
		SubStr.length=0;
		return TRUE;
	}
	else{
		SubStr.ch = (char *)malloc(sizeof(char)*(len+1));
		for(int i=pos-1,j=0;i<pos+len;i++,j++)
			SubStr.ch[j] = S.ch[i];
		SubStr.ch[len] = '\0';
		SubStr.length = len;
		return TRUE;
	}
		
		 
}